Docker Swarm + Traefik:通过前端规则公开 Traefik GUI;服务/容器端口重定向

Docker Swarm + Traefik: Expose Traefik GUI through frontend rule; Service / Container port redirection

我正在尝试将 Traefik 与 Docker Swarm 后端一起使用,我正在使用下面的堆栈文件:

version: "3"

services:

  traefik:
    image: traefik:1.5
    command: --web --docker --docker.swarmmode --docker.watch --docker.domain=sample.com --logLevel=DEBUG 
    deploy:
      placement:
        constraints: [node.role==manager]
      restart_policy:
        condition: on-failure
      labels:
        - "traefik.port=8080"
        - "traefik.docker.network=sample-network"
        - "traefik.frontend.rule=Host:traefik.sample.com"
    ports:
      - "80:80"
      - "8080:8080"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /dev/null:/traefik.toml
    networks:
      - sample-network

  portainer:
    image: portainer/portainer:latest
    command: --no-auth -H unix:///var/run/docker.sock
    deploy:
      placement:
        constraints: [node.role == manager]
      labels:
        - "traefik.portainer.port=7777"
        - "traefik.docker.network=sample-network"
        - "traefik.frontend.rule=Host:portainer.sample.com"
    ports:
      - "7777:9000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - sample-network

networks:
  sample-network:

我有 2 个问题想解决:

1)(通过前端规则公开 Traefik 仪表板)我可以在 sample.com:8080 上访问 Traefik 的 Web 仪表板,但我无法通过 traefik.sample.com.

访问它

2)(containers/services 上的端口重定向)我可以通过 sample.com:7777 访问 Portainer GUI,但我无法通过 portainer.sample.com 访问它。我对端口重定向更好奇,因为如果我遇到 2 个图像发布到同一个端口,我将如何在单个堆栈文件中设置 2 个服务?我的服务标签声明将在 traefik.port=XXXX

发生冲突

您不需要 traefik 服务本身的 traefik 标签。它通过指定端口从外部访问:

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

在 portainer 服务上,您不需要端口映射,因为您可能希望使用 traefik 路由请求。 因为 traefik 和 portainer 在同一个 docker 网络中,traefik 可以在每个端口访问 portainer。 因此 traefik 的端口必须匹配真正的 portainer 端口:

 labels:
    - "traefik.port=9000"
    - "traefik.docker.network=sample-network"
    - "traefik.frontend.rule=Host:portainer.sample.com"

在当前设置中,您必须使用 Host:portainer.sample.com 请求 traefik。 您可以使用

进行测试
curl --verbose --header 'Host: portainer.sample.com' 'http://<DockerhostIp>:80'

编辑: 更新了卷曲

编辑 2: 对 PO 编辑的反应

portainer.sample.com DNS 条目必须指向您的 docker 主机。然后 traefik 会将它路由到正确的容器。

另一种方法是指定一个 traefik 前缀:

 "traefik.frontend.rule=Host:site1.org;PathPrefixStrip: /sub/"

根据规则,site1.org/sub 上的所有请求都将路由到此特定的 service/container。

看看 Traefik-Docker-Sample

编辑 3:

dashboard/webui 的自路由应该适用于:

  labels:
    - "traefik.port=8080"
    - "traefik.docker.network=sample-network"
    - "traefik.frontend.rule=Host:traefik.sample.com"

只要确保您有 traefik.sample.com 的 DNS 条目即可。 要检查 traefik 设置是否有效,您还可以 运行

 curl --verbose -H Host:traefik.sample.com <DockerHostIp>