Docker Swarm中使用Traefik出现Bad Gateway问题求助
解决Docker Swarm中Traefik返回Bad Gateway的问题
针对你遇到的Swarm部署Traefik后返回Bad Gateway的问题,结合你已排查的网络连通性情况,核心问题大概率出在Swarm模式特有的Traefik配置缺失或服务路由标签配置错误上,以下是具体修复方案:
1. 确保Traefik启用Docker Swarm Provider
本地docker-compose默认使用Docker Provider的单机模式,但Swarm集群必须明确开启Swarm Mode支持。修改你的traefik.yml配置:
global: checkNewVersion: false sendAnonymousUsage: false entryPoints: web: address: ":80" providers: docker: # 必须开启Swarm模式支持 swarmMode: true # 监听Docker服务变化 watch: true # 禁止自动暴露所有服务,仅暴露带Traefik标签的服务 exposedByDefault: false # 指定Traefik使用的Overlay网络(必须和后续服务用的一致) network: traefik-net file: enabled: false # 可选:启用Dashboard用于排查 api: dashboard: true insecure: true
2. 修正Whoami服务的Swarm路由标签
Swarm服务的端口是内部集群端口,Traefik无法自动识别,必须通过标签指定目标端口,同时明确绑定的网络。以下是完整的Swarm部署文件(docker-compose.swarm.yml):
version: "3.8" networks: traefik-net: external: true services: traefik: image: traefik:v2.11 command: - "--configfile=/etc/traefik/traefik.yml" ports: - "80:80" - "8080:8080" # Dashboard端口 volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - ./traefik.yml:/etc/traefik/traefik.yml:ro networks: - traefik-net deploy: mode: global placement: constraints: - node.role == manager whoami: image: traefik/whoami:v1.10 networks: - traefik-net deploy: replicas: 2 labels: # 允许Traefik发现该服务 - "traefik.enable=true" # 指定使用的网络(必须和Traefik配置的一致) - "traefik.docker.network=traefik-net" # 定义路由规则 - "traefik.http.routers.whoami.rule=PathPrefix(`/whoami`)" # 指定使用的EntryPoint - "traefik.http.routers.whoami.entrypoints=web" # 定义服务负载均衡目标端口(必须是whoami容器的内部端口9000) - "traefik.http.services.whoami.loadbalancer.server.port=9000"
3. 确保Overlay网络创建正确
创建external overlay网络时,必须添加--attachable参数,确保Swarm服务可以正确加入:
docker network create --driver overlay --attachable traefik-net
4. 验证步骤
- 重新部署服务:
docker stack deploy -c docker-compose.swarm.yml traefik-demo - 访问Traefik Dashboard(
http://<manager-ip>:8080),检查Services和Routers是否正确注册了whoami服务 - 查看Traefik日志,确认服务注册成功:
docker service logs traefik-demo_traefik
核心原因说明
你本地docker-compose正常是因为使用的是Docker Provider的单机模式,Traefik可以直接通过容器网络访问服务;但Swarm集群中,服务是通过虚拟IP和内部DNS暴露的,必须开启Swarm Mode Provider并明确指定目标端口,否则Traefik无法正确路由到Swarm服务的内部端口。
内容的提问来源于stack exchange,提问作者42tg
相关产品推荐
相关产品推荐

