求助:Traefik无法识别Docker Swarm中的服务
解决Traefik v2无法识别Docker Swarm服务的问题
看起来你的配置里有几个关键问题导致Traefik无法发现Swarm服务,我来帮你逐个梳理并修复:
主要问题分析
- 错误的Docker端点配置:你指定了
--providers.docker.endpoint=tcp://127.0.0.1:2375,但已经挂载了/var/run/docker.sock,这个配置不仅多余,还可能让Traefik无法正确连接Swarm的Docker套接字,应该移除。 - 未显式启用Docker提供者:你注释掉了
--providers.docker=true,虽然swarmMode=true会隐含启用,但显式开启更清晰,避免配置歧义。 - Whoami服务端口配置错误:
containous/whoami默认监听80端口,但你在服务标签里写了8080,这会让Traefik尝试连接错误的端口,自然无法访问。 - 缺少共享Overlay网络:Swarm模式下,Traefik和后端服务必须处于同一个自定义Overlay网络中,默认的bridge网络不支持跨节点服务访问。
- 旧版标签残留:
traefik.port是Traefik v1的标签,v2已经不再使用,应该移除。
修正后的docker-compose.yml
version: "3.7" # 定义共享的Overlay网络,让Traefik和服务互通 networks: traefik-net: driver: overlay attachable: true services: traefik: image: "traefik:v2.0.0" command: - --entrypoints.web.address=:80 - --providers.docker=true # 显式启用Docker提供者 - --providers.docker.swarmMode=true - --providers.docker.exposedbydefault=false # 只处理带有Traefik标签的服务,更安全 - --api.insecure=true # v2.0需要加=true,否则可能报错 - --providers.docker.network=traefik-net # 指定Traefik监控的网络 ports: - "80:80" - "8080:8080" volumes: - "/var/run/docker.sock:/var/run/docker.sock:ro" deploy: placement: constraints: [node.role==manager] labels: # 配置Traefik UI的路由规则 - traefik.enable=true - traefik.http.routers.traefik-ui.rule=Host(`traefik.testificate.com`) - traefik.http.routers.traefik-ui.service=api@internal - traefik.http.services.traefik-ui.loadbalancer.server.port=8080 - traefik.docker.network=traefik-net networks: - traefik-net whoami: image: "containous/whoami:v1.3.0" deploy: labels: - traefik.enable=true - traefik.http.routers.whoami.rule=Host(`testificate.com`) - traefik.http.services.whoami.loadbalancer.server.port=80 # 匹配whoami的实际端口 - traefik.docker.network=traefik-net # 指定服务所在的网络 networks: - traefik-net
关键修改说明
- 添加Overlay网络:创建了
traefik-net网络,确保Traefik和whoami服务在同一个网络中,Swarm模式下必须这样配置才能让Traefik路由到服务。 - 修正Traefik命令参数:移除了错误的端点配置,显式启用Docker提供者,添加
exposedbydefault=false避免自动暴露所有服务,同时指定监控的网络。 - 修复Whoami端口:把服务端口改成80,匹配容器的实际监听端口。
- 规范Traefik标签:使用v2的标准标签,给Traefik UI添加了路由规则,同时确保所有服务都指定了
traefik.docker.network。
部署步骤
- 保存修正后的compose文件为
docker-compose.yml - 部署到Swarm:
docker stack deploy -c docker-compose.yml traefik-demo - 等待服务启动后,修改本地hosts文件,添加:
<你的Swarm manager节点IP> testificate.com <你的Swarm manager节点IP> traefik.testificate.com - 访问
http://testificate.com就能看到whoami的输出,访问http://traefik.testificate.com就能打开Traefik的UI。
内容的提问来源于stack exchange,提问作者katikaVS
相关产品推荐
相关产品推荐

