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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:24:02