Traefik 2+Docker Swarm反向代理配置遇Bad Gateway错误求助
Traefik 2 + Docker Swarm反向代理"Bad Gateway"问题排查与解决
环境说明
- 3台VirtualBox虚拟机:
master.ox(Docker Swarm管理节点)、worker1.ox(工作节点)、worker2.ox(工作节点) /etc/hosts配置:
192.168.56.101 master.ox traefik.master.ox hello.master.ox 192.168.56.102 worker1 192.168.56.103 worker2
已执行操作
- 在
master.ox初始化Swarm并创建overlay网络:
docker swarm init --advertise-addr 192.168.56.101 docker network create --driver overlay my-net
- 在
worker1和worker2执行命令加入Swarm:
docker swarm join --token SWMTKN-1-2jcok5sisa5kohn1nqqwpnasnj3t7hs7vs7c1cellf1eloyja6-16mnbgywkbpc5ssccw5anu0to 192.168.56.101:2377
- 为工作节点设置标签:
docker node update --label-add=category=service worker1 docker node update --label-add=category=service worker2
使用的Docker Compose配置
version: "3.3" networks: my-net: external: true services: nginx: image: nginxdemos/hello networks: - my-net deploy: labels: - "traefik.enable=true" - "traefik.docker.network=my-net" - "traefik.http.services.nginx.loadbalancer.server.port=80" - "traefik.http.routers.nginx.entrypoints=http" - "traefik.http.routers.nginx.service=nginx" - "traefik.http.routers.nginx.rule=Host(`hello.master.ox`)" placement: constraints: - node.labels.category==service traefik: image: traefik:latest ports: - 8080:8080 - 80:80 command: - "--log.level=DEBUG" - "--providers.docker" - "--providers.docker.swarmmode=true" - "--providers.docker.network=my-net" - "--providers.docker.endpoint=unix:///var/run/docker.sock" - "--providers.docker.exposedbydefault=false" - "--api=true" - "--ping=true" - "--api.insecure=true" - "--api.dashboard=true" - "--entrypoints.http.address=:80" - "--entrypoints.https.address=:443" volumes: - /var/run/docker.sock:/var/run/docker.sock networks: - my-net deploy: mode: global labels: - "traefik.enable=true" - "traefik.docker.network=my-net" - "traefik.http.services.traefik.loadbalancer.server.port=8080" - "traefik.http.routers.traefik.entrypoints=http" - "traefik.http.routers.traefik.service=api@internal" - "traefik.http.routers.traefik.rule=Host(`traefik.master.ox`)" placement: constraints: - node.role == manager
问题描述
配置部署完成后,访问hello.master.ox时出现**"Bad Gateway"**错误,预期应显示nginx默认欢迎页面。
排查与解决方案
1. 确认Overlay网络连通性
"Bad Gateway"核心原因是Traefik无法连接到后端Nginx服务,首先验证网络连通性:
- 进入Traefik容器,ping Nginx服务名:
docker exec -it $(docker ps -q --filter name=traefik) ping nginx - 如果ping不通,检查:
- Nginx服务是否正确挂载
my-net网络:docker service inspect nginx | grep Networks - 若存在子网冲突(比如VirtualBox子网与Docker默认overlay子网重叠),重新创建指定子网的overlay网络:
docker network rm my-net docker network create --driver overlay --subnet=10.10.0.0/24 my-net
- Nginx服务是否正确挂载
2. 修正Nginx服务的Traefik标签配置
在Swarm模式下,需要明确指定服务的路由指向Docker Swarm服务,修改Nginx的deploy.labels:
labels: - "traefik.enable=true" - "traefik.docker.network=my-net" - "traefik.http.services.nginx.loadbalancer.server.port=80" - "traefik.http.services.nginx.loadbalancer.server.scheme=http" - "traefik.http.routers.nginx.entrypoints=http" - "traefik.http.routers.nginx.service=nginx@docker" # 明确指定为Swarm服务 - "traefik.http.routers.nginx.rule=Host(`hello.master.ox`)"
3. 查看Traefik Debug日志定位具体错误
通过日志获取详细连接失败原因:
docker service logs traefik
- 若日志显示
dial tcp <nginx-ip>:80: connect: connection refused,检查Nginx容器状态:docker service ps nginx # 确认服务是否正常运行 docker exec -it $(docker ps -q --filter name=nginx) netstat -tulpn | grep 80 # 确认80端口是否监听
4. 重新部署服务
修改配置后,重新部署Stack:
docker stack deploy -c docker-compose.yml proxy
等待服务更新完成后,再次访问hello.master.ox即可正常显示Nginx页面。
内容的提问来源于stack exchange,提问作者Amir.Ojvar
相关产品推荐
相关产品推荐

