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

求助:Traefik无法识别Docker Swarm中的服务

解决Traefik v2无法识别Docker Swarm服务的问题

看起来你的配置里有几个关键问题导致Traefik无法发现Swarm服务,我来帮你逐个梳理并修复:

主要问题分析

  • 错误的Docker端点配置:你指定了--providers.docker.endpoint=tcp://127.0.0.1:2375,但已经挂载了/var/run/docker.sock,这个配置不仅多余,还可能让Traefik无法正确连接Swarm的Docker套接字,应该移除。
  • 未显式启用Docker提供者:你注释掉了--providers.docker=true,虽然swarmMode=true会隐含启用,但显式开启更清晰,避免配置歧义。
  • Whoami服务端口配置错误:containous/whoami默认监听80端口,但你在服务标签里写了8080,这会让Traefik尝试连接错误的端口,自然无法访问。
  • 缺少共享Overlay网络:Swarm模式下,Traefik和后端服务必须处于同一个自定义Overlay网络中,默认的bridge网络不支持跨节点服务访问。
  • 旧版标签残留:traefik.port是Traefik v1的标签,v2已经不再使用,应该移除。

修正后的docker-compose.yml

version: "3.7"

# 定义共享的Overlay网络,让Traefik和服务互通
networks:
  traefik-net:
    driver: overlay
    attachable: true

services:
  traefik:
    image: "traefik:v2.0.0"
    command:
      - --entrypoints.web.address=:80
      - --providers.docker=true  # 显式启用Docker提供者
      - --providers.docker.swarmMode=true
      - --providers.docker.exposedbydefault=false  # 只处理带有Traefik标签的服务,更安全
      - --api.insecure=true  # v2.0需要加=true,否则可能报错
      - --providers.docker.network=traefik-net  # 指定Traefik监控的网络
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    deploy:
      placement:
        constraints: [node.role==manager]
      labels:
        # 配置Traefik UI的路由规则
        - traefik.enable=true
        - traefik.http.routers.traefik-ui.rule=Host(`traefik.testificate.com`)
        - traefik.http.routers.traefik-ui.service=api@internal
        - traefik.http.services.traefik-ui.loadbalancer.server.port=8080
        - traefik.docker.network=traefik-net
    networks:
      - traefik-net

  whoami:
    image: "containous/whoami:v1.3.0"
    deploy:
      labels:
        - traefik.enable=true
        - traefik.http.routers.whoami.rule=Host(`testificate.com`)
        - traefik.http.services.whoami.loadbalancer.server.port=80  # 匹配whoami的实际端口
        - traefik.docker.network=traefik-net  # 指定服务所在的网络
    networks:
      - traefik-net

关键修改说明

  1. 添加Overlay网络:创建了traefik-net网络,确保Traefik和whoami服务在同一个网络中,Swarm模式下必须这样配置才能让Traefik路由到服务。
  2. 修正Traefik命令参数:移除了错误的端点配置,显式启用Docker提供者,添加exposedbydefault=false避免自动暴露所有服务,同时指定监控的网络。
  3. 修复Whoami端口:把服务端口改成80,匹配容器的实际监听端口。
  4. 规范Traefik标签:使用v2的标准标签,给Traefik UI添加了路由规则,同时确保所有服务都指定了traefik.docker.network。

部署步骤

  1. 保存修正后的compose文件为docker-compose.yml
  2. 部署到Swarm:docker stack deploy -c docker-compose.yml traefik-demo
  3. 等待服务启动后,修改本地hosts文件,添加:
    <你的Swarm manager节点IP> testificate.com
    <你的Swarm manager节点IP> traefik.testificate.com
    
  4. 访问http://testificate.com就能看到whoami的输出,访问http://traefik.testificate.com就能打开Traefik的UI。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 11:42:41