Traefik SSL 适用于在非标准端口上运行的服务

Traefik SSL 适用于在非标准端口上运行的服务

免责声明:我对 Docker 和 Traefik 的了解很少。我曾多次尝试遵循 Traefik 文档,但通常都会感到困惑,可能是因为我想解决的不仅仅是最简单的情况,而且我确信我缺少一些基础知识。

在我当前的设置中,我可以创建一个基于 Web(端口 80)的 Docker 服务,Traefik v2 会获取该服务,创建一个 LE 证书,从 http:80 重定向到 https:443 并公开。下面是我docker-compose.yml为 Traefik 编写的,也是为一个可以运行的示例服务编写的。

但是,假设我的基于 Web 的服务确实想在 80 以外的端口上运行。例如,我想运行斯塔平,它在端口 8080 上运行。考虑到我目前的 SSL 设置,是否可以将它连接起来,以便我可以公开入口点http://statping.MYTLD并依赖 Traefik:1. 重定向到https://statping.MYTLD2. 获取证书,3. 公开我的 statping Docker 容器?即使底层服务未在端口 80 上运行,Traefik 是否可以处理 Acme http 挑战?我认为可以,因为我的工作示例甚至没有公开容器级别以外的端口。

注意:我最熟悉 Docker Compose,但也许对于像 statping 这样的服务,我需要弄清楚如何编写自己的 DOCKERFILE,以便我可以哄骗它在端口 80 而不是端口 8080 上运行?

谢谢您的见解!

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"

样品服务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

答案1

来自traefik 文档

如果容器公开多个端口,或者不公开任何端口,那么您必须使用标签手动指定 Traefik 应该使用哪个端口进行通信 traefik.http.services.<service_name>.loadbalancer.server.port(在路由的专门部分中阅读有关此标签的更多信息)。

因此,如果 whoami 正在监听 8080 并且没有暴露一个端口,则应该指定标签:

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

相关内容