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。
编辑 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>
我正在尝试将 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。
编辑 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>