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

Docker Swarm中Traefik配置Nginx服务出现404错误的问题排查

Docker Swarm下Traefik标签识别问题:服务级标签 vs 容器级标签

问题根源:标签作用域限制与Traefik默认配置

确实存在标签作用域的限制,问题核心在于Docker Swarm的服务级标签与容器级标签的区别,以及Traefik Docker Provider在Swarm模式下的默认行为:

  1. Swarm标签的两个作用域

    • 你通过--label给Nginx服务添加的是服务级标签,这类标签仅附着在Swarm服务对象本身,不会传递给服务运行的每个容器任务(这就是TaskTemplate.ContainerSpec.Labels为空的原因)。
    • Traefik的Docker Provider在Swarm模式下,默认只读取容器任务的标签(即容器级标签),不会主动读取服务级标签。
  2. Traefik的自动 fallback 行为
    因为Traefik没读取到你设置的路由规则标签,它会自动生成一个基于Swarm服务ID的默认Host规则(也就是你看到的Host('traefik-1-yxc8jw0341hivva1kik8568lt')),导致你访问http://1.1.1.1时没有匹配的路由,返回404。

解决方法

方法1:使用容器级标签替代服务级标签

创建Nginx服务时,用--container-label参数替代--label,这样标签会被传递给每个Swarm任务容器:

docker service create \
  --name my-nginx \
  --replicas 3 \
  --network web \
  --config source=my_nginx_conf,target=/etc/nginx/nginx.conf \
  --container-label "traefik.enable=true" \
  --container-label "traefik.http.routers.my-nginx.rule=Host(`1.1.1.1`)" \
  --container-label "traefik.http.services.my-nginx.loadbalancer.server.port=80" \
  nginx

执行后验证标签是否生效:

docker service inspect my-nginx --format '{{json .Spec.TaskTemplate.ContainerSpec.Labels}}' | jq .

此时应该能看到你设置的Traefik标签,Traefik控制台的路由规则也会更新为Host('1.1.1.1'),访问http://1.1.1.1即可正常访问Nginx。

方法2:调整Traefik配置读取服务级标签(可选)

如果你坚持使用服务级标签,可以修改Traefik的启动命令,明确开启Swarm模式并配置读取服务级标签:

sudo docker service create \
  --name traefik \
  --constraint=node.role==manager \
  --publish 80:80 \
  --publish 8080:8080 \
  --network web \
  --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \
  traefik:v2.5 \
  --entrypoints.web.address=:80 \
  --providers.docker \
  --providers.docker.swarmMode=true \
  --providers.docker.swarmModeRefreshSeconds=15 \
  --providers.docker.exposedByDefault=false \
  --providers.docker.useBindPortIP=false \
  --api.insecure=true

注意:这种方式需要确保Traefik有足够权限读取Swarm服务的元数据,且部分Traefik版本对服务级标签的支持不如容器级标签稳定,优先推荐方法1。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 02:36:14