Docker Swarm中Traefik代理SonarQube返回404如何正确配置?
问题排查与配置修正
核心问题点
- Swarm模式下Traefik识别的服务标签必须放在
deploy.labels字段下,直接放在服务根的labels不会被Traefik读取,这是返回404的最主要原因 - Traefik v2.x 不支持旧版
traefik.port配置,需要用服务负载均衡端口配置替代 - Host规则的引号使用不规范,YAML中内嵌单引号会出现解析错误,推荐用反引号包裹域名
- Traefik服务缺少Swarm专属部署约束,无法保证在集群中正常读取服务元数据
修正后的配置
1. swarm.yml 配置
version: "3.7" services: traefik: image: "traefik:v2.1" networks: - traefik-public ports: - "80:8" - "8080:8080" volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - ./traefik.yml:/traefik.yml:ro deploy: # 必须部署在Swarm管理节点才能读取docker.sock元数据 placement: constraints: - node.role == manager sonar: image: sonarqube:8.9-community networks: - pg-net - traefik-public # 走Traefik代理无需暴露端口到主机,可注释删除 # ports: # - "9000:9000" environment: - SONAR_JDBC_URL=jdbc:postgresql://sqdb:5432/sonarqube - SONAR_JDBC_USERNAME=sonarqube - SONAR_JDBC_PASSWORD=N1eC7ALj1P1bOf4!wyhQi deploy: labels: - "traefik.enable=true" - "traefik.docker.network=traefik-public" - "traefik.http.routers.sonar.entrypoints=web" - "traefik.http.routers.sonar.rule=Host(`sonar.example.com`)" - "traefik.http.services.sonar.loadbalancer.server.port=9000" networks: traefik-public: external: true # 若pg-net不是外部网络请补充配置 pg-net: external: true
2. traefik.yml 优化配置
## STATIC CONFIGURATION log: level: INFO api: insecure: true dashboard: true entryPoints: web: address: ":80" providers: docker: endpoint: "unix:///var/run/docker.sock" exposedByDefault: false swarmMode: true # 新增:Swarm服务状态刷新间隔,单位秒 swarmModeRefreshSeconds: 10 # 新增:默认代理网络,后续服务无需重复配置traefik.docker.network defaultNetwork: traefik-public
部署验证步骤
- 先确认traefik-public是Swarm范围的overlay网络:
docker network ls | grep traefik-public,若不存在执行docker network create --driver=overlay --scope=swarm traefik-public创建 - 用stack命令部署:
docker stack deploy -c swarm.yml service-stack - 访问集群任意节点的8080端口打开Traefik Dashboard,确认HTTP路由列表中已存在sonar路由
- 本地配置hosts将
sonar.example.com指向集群任意节点IP,访问即可正常打开SonarQube - 后续新增服务仅需在对应服务的
deploy.labels下配置Traefik路由规则即可,无需修改Traefik本身配置
内容的提问来源于stack exchange,提问作者Andrews Karaban
相关产品推荐
相关产品推荐

