我正在尝试将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的网络信息中心,但我无法通过traefik.sample.com
访问它。
2)(容器/服务上的端口重定向)我可以通过sample.com:7777
访问Portainer GUI,但我无法通过portainer.sample.com
访问它。我对端口重定向更好奇,因为如果我遇到2个图像发布到同一个端口,我将如何在单个堆栈文件中设置2个服务?我的服务标签声明将在traefik.port=XXXX
答案 0 :(得分:0)
你不需要traefik服务本身的traefik标签。它是通过指定端口从外部访问的:
ports:
- "80:80"
- "8080:8080"
- "443:443"
在portainer服务上,您不需要端口映射,因为您可能希望使用traefik路由请求。 因为traefik和portainer在同一个docker网络中,traefik可以访问每个端口上的portainer。 因此,traefik的端口必须匹配真正的移植端口:
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条目必须指向您的泊坞主机。然后traefik将它传送到正确的容器。
另一种方法是指定一个traefik前缀:
"traefik.frontend.rule=Host:site1.org;PathPrefixStrip: /sub/"
根据规则,site1.org/sub上的所有请求都将路由到此特定服务/容器。
编辑3:
仪表板/ 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>