You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 验证步骤

  1. 重新部署服务:
    docker stack deploy -c docker-compose.swarm.yml traefik-demo
    
  2. 访问Traefik Dashboard(http://<manager-ip>:8080),检查Services和Routers是否正确注册了whoami服务
  3. 查看Traefik日志,确认服务注册成功:
    docker service logs traefik-demo_traefik
    

核心原因说明

你本地docker-compose正常是因为使用的是Docker Provider的单机模式,Traefik可以直接通过容器网络访问服务;但Swarm集群中,服务是通过虚拟IP和内部DNS暴露的,必须开启Swarm Mode Provider并明确指定目标端口,否则Traefik无法正确路由到Swarm服务的内部端口。

内容的提问来源于stack exchange,提问作者42tg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 21:39:18