Traefik SSL para un servicio que se ejecuta en un puerto no estándar

Traefik SSL para un servicio que se ejecuta en un puerto no estándar

Descargo de responsabilidad: Mi conocimiento de Docker y Traefik es débil. He intentado varias veces seguir los documentos de Traefik y generalmente me confundo, posiblemente porque quiero abordar más que los casos más simples, pero también estoy seguro de que me faltan algunos conceptos básicos.

En mi configuración actual, puedo crear un servicio Docker basado en web (puerto 80) que Traefik v2 recoge, crea un certificado LE, redirecciona de http:80 a https:443 y expone. A continuación se muestra uno docker-compose.ymlpara Traefik y también uno para un servicio de muestra que funciona.

Sin embargo, digamos que mi servicio basado en web realmente quiere ejecutarse en un puerto distinto al 80. Por ejemplo, quiero ejecutarestacionar, que se ejecuta en el puerto 8080. ¿Es posible, dada la configuración SSL que tengo actualmente, conectarlo de manera que pueda exponer el punto de entrada?http://statping.MYTLDy confíe en Traefik para: 1. redirigir ahttps://statping.MYTLD, 2. obtener el certificado y 3. exponer mi contenedor Docker de actualización. ¿Puede Traefik manejar el desafío http de Acme aunque el servicio subyacente no se esté ejecutando en el puerto 80? Supongo que sí, ya que mi muestra de trabajo ni siquiera expone un puerto más allá del nivel del contenedor.

Nota: Estoy más familiarizado con Docker Compose, pero quizás para un servicio como statping, necesito descubrir cómo escribir mi propio DOCKERFILE para poder convencerlo de que se ejecute en el puerto 80 en lugar del puerto 8080.

¡Gracias por cualquier idea!

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"

Servicio de muestra 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

Respuesta1

Desde eldocumentos traefik:

Si un contenedor expone varios puertos, o no expone ningún puerto, entonces debe especificar manualmente qué puerto debe usar Traefik para la comunicación mediante la etiqueta traefik.http.services.<service_name>.loadbalancer.server.port(lea más sobre esta etiqueta en la sección dedicada a enrutamiento).

Entonces, si whoami estaba escuchando en 8080 y no expuso exactamente un puerto, debes especificar la etiqueta:

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

información relacionada