Traefik SSL für einen Dienst, der auf einem nicht standardmäßigen Port ausgeführt wird

Traefik SSL für einen Dienst, der auf einem nicht standardmäßigen Port ausgeführt wird

Haftungsausschluss: Meine Kenntnisse über Docker und Traefik sind dürftig. Ich habe mehrmals versucht, den Traefik-Dokumenten zu folgen, bin aber meistens nur verwirrt, möglicherweise, weil ich mehr als die einfachsten Fälle angehen möchte, aber ich bin mir auch sicher, dass mir einige Grundlagen fehlen.

In meinem aktuellen Setup kann ich einen webbasierten (Port 80) Docker-Dienst erstellen, den Traefik v2 aufnimmt, ein LE-Zertifikat erstellt, von http:80 auf https:443 umleitet und verfügbar macht. Unten finden Sie mein Beispiel docker-compose.ymlfür Traefik und auch eines für einen funktionierenden Beispieldienst.

Nehmen wir jedoch an, dass mein webbasierter Dienst wirklich auf einem anderen Port als 80 laufen soll. Ich möchte beispielsweiseansetzen, das auf Port 8080 läuft. Ist es angesichts meines aktuellen SSL-Setups möglich, es so zu verkabeln, dass ich den Einstiegspunkt offenlegen kann?http://statping.MYTLDund verlassen Sie sich auf Traefik, um: 1. weiterzuleiten zuhttps://statping.MYTLD, 2. das Zertifikat erhalten und 3. meinen Docker-Container freigeben? Kann Traefik die Acme-HTTP-Herausforderung bewältigen, obwohl der zugrunde liegende Dienst nicht auf Port 80 ausgeführt wird? Ich gehe davon aus, dass es das kann, da mein funktionierendes Beispiel nicht einmal einen Port über die Containerebene hinaus freigibt.

Hinweis: Ich bin am besten mit Docker Compose vertraut, aber vielleicht muss ich für einen Dienst wie statping herausfinden, wie ich mein eigenes DOCKERFILE schreibe, damit ich es dazu bringen kann, es auf Port 80 statt auf Port 8080 auszuführen?

Danke für alle Einblicke!

Traefik docker-compose.yml:

version: "3.3"

networks:
  traefik:
    external: true

services:

  traefik:
    image: "traefik:v2.3"
    container_name: "traefik"
    command:
      #- "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--entrypoints.web.http.redirections.entryPoint.to=websecure"
      - "--entrypoints.web.http.redirections.entryPoint.scheme=https"
      - "--entrypoints.web.http.redirections.entrypoint.permanent=true"

      - "--certificatesresolvers.myresolver.acme.httpchallenge=true"
      - "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web"

      # FOR TESTING.
      #- "--certificatesresolvers.myresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"

      - "--certificatesresolvers.myresolver.acme.email=craig@wereallconnected.ca"
      - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"

    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"

    volumes:
      - "./letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

Musterservice docker-compose.yml:

version: "3.3"

networks:
  traefik:
    external: true

services:

  whoami2:
    image: "traefik/whoami"
    container_name: "simple-service2"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami2.rule=Host(`whoami2.MYTLD`)"
      - "traefik.http.routers.whoami2.entrypoints=websecure"
      - "traefik.http.routers.whoami2.tls.certresolver=myresolver"

    networks:
      - traefik

    restart: unless-stopped

Antwort1

Von demTraefik-Dokumente:

Wenn ein Container mehrere Ports verfügbar macht oder keinen Port verfügbar macht, müssen Sie mithilfe des Labels manuell angeben, welchen Port Traefik für die Kommunikation verwenden soll traefik.http.services.<service_name>.loadbalancer.server.port(Lesen Sie mehr über dieses Label im entsprechenden Abschnitt zum Routing).

Wenn whoami also auf 8080 lauschte und nicht genau einen Port freigab, sollten Sie die Bezeichnung angeben:

"traefik.http.services.whoami2.loadbalancer.server.port=8080"

verwandte Informationen