Traefik SSL para um serviço executado em porta não padrão

Traefik SSL para um serviço executado em porta não padrão

Isenção de responsabilidade: meu conhecimento do Docker e do Traefik é fraco. Tentei várias vezes seguir os documentos do Traefik e geralmente fico confuso, possivelmente porque quero abordar mais do que os casos mais simples, mas também tenho certeza de que estou perdendo alguns fundamentos.

Na minha configuração atual, posso criar um serviço Docker baseado na web (porta 80) que o Traefik v2 pega, cria um certificado LE, redireciona de http:80 para https:443 e expõe. Abaixo está o meu docker-compose.ymlpara o Traefik e também um para um exemplo de serviço que funciona.

Digamos, entretanto, que meu serviço baseado na Web realmente queira rodar em uma porta diferente de 80. Por exemplo, eu quero rodarestatística, que roda na porta 8080. É possível, dada a configuração SSL que tenho atualmente, conectá-lo de forma que eu possa expor o ponto de entradahttp://statping.MYTLDe conte com o Traefik para: 1. redirecionar parahttps://statping.MYTLD, 2. obter o certificado e 3. expor meu contêiner Docker de status? O Traefik consegue lidar com o desafio http da Acme mesmo que o serviço subjacente não esteja sendo executado na porta 80? Acho que sim, já que minha amostra de trabalho nem sequer expõe uma porta além do nível do contêiner.

Observação: estou mais familiarizado com o Docker Compose, mas talvez para um serviço como o statping, preciso descobrir como escrever meu próprio DOCKERFILE para poder convencê-lo a rodar na porta 80 em vez da porta 8080.

Obrigado por qualquer visão!

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"

Serviço de amostra 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

Responder1

Dedocumentos traefik:

Se um contêiner expõe múltiplas portas ou não expõe nenhuma porta, então você deve especificar manualmente qual porta o Traefik deve usar para comunicação usando o rótulo traefik.http.services.<service_name>.loadbalancer.server.port(Leia mais sobre este rótulo na seção dedicada em roteamento).

Portanto, se whoami estava escutando no 8080 e não expôs exatamente uma porta, você deveria especificar o rótulo:

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

informação relacionada