容器配了labels却没生成路由,因Traefik自动发现依赖Docker provider启用、socket挂载、正确traefik.前缀label、entrypoints配置及共用Docker网络。

为什么容器里配了 labels 却没生成路由?
Traefik 的自动发现完全依赖容器运行时的元数据,Docker 场景下必须启用 --providers.docker=true 且容器启动时带正确 traefik. 开头的 label。常见漏点:
• 容器没挂载 /var/run/docker.sock(Traefik 需读取 Docker API)
• Docker provider 没指定 --providers.docker.endpoint=unix:///var/run/docker.sock(默认会尝试 TCP,失败静默)
• label 写成 traefik.http.routers.myapp.rule=Host(`app.example.com`),但没配 traefik.http.routers.myapp.entrypoints=web,导致路由不生效
• 容器 network 不在 Traefik 所监听的同一 Docker 网络(如 Traefik 运行在 traefik-net,而你的服务在 default)
如何让 Traefik 自动签发并续期 Let's Encrypt 证书?
ACME 必须走公网可访问的 HTTP-01 或 DNS-01 挑战,本地环境或 NAT 后部署容易卡在验证环节。
• 使用 HTTP-01 时,entryPoints.web.address 必须绑定到 :80,且 80 端口需对外暴露(云服务器要开安全组,家用路由器要端口转发)
• 若用 DNS-01(推荐内网/无公网 IP 场景),需配置对应 DNS 提供商 API 密钥(如 Cloudflare 的 CLOUDFLARE_API_TOKEN),并启用 --certificatesresolvers.le.acme.dnsChallenge.provider=cloudflare
• 证书存储路径默认为 acme.json,该文件必须持久化(挂载为 volume),且权限设为 600(Traefik 启动报 permissions too open 就是它)
• 不要手动修改 acme.json,续期完全由 Traefik 后台触发
Docker Compose 下 Traefik 和业务容器怎么连通?
关键不是“能不能通”,而是“以什么网络身份通信”。
• Traefik 容器和业务容器必须共用至少一个自定义 Docker 网络(docker network create traefik-net),不能只靠默认 bridge
• Traefik 的 docker-compose.yml 中要显式声明 networks: [traefik-net],且挂载 /var/run/docker.sock:/var/run/docker.sock:ro
• 业务容器的 label 中,traefik.http.routers.myapp.service=myapp 对应的服务名,实际指向的是容器名(container_name)或 compose service 名(取决于 --providers.docker.useBindPortIP=false 默认行为)
• 若业务容器用了 ports: 暴露端口,Traefik 默认会尝试连它的 80,但若容器实际监听 8080,得加 label:traefik.http.services.myapp.loadbalancer.server.port=8080
为什么 Traefik 日志里反复出现 “no server returning a response”?
这不是 TLS 或 DNS 问题,而是后端服务根本没响应健康检查或请求被拒绝。
• Traefik 默认对每个 service 发起 HTTP GET /health(或 HEAD /)探测,如果容器没开这个 endpoint,或返回非 2xx 状态码,就会标记为 down
• 检查 traefik.http.services.myapp.healthcheck 相关 label 是否误配(比如 path 写错、interval 太短)
• 更常见的是:业务容器启动慢于 Traefik,Traefik 初始化时发现服务不可达,后续即使容器起来了也不会自动重试(需重启 Traefik 或等下一轮 health check 周期)
• 可临时禁用健康检查验证:加 label traefik.http.services.myapp.healthcheck.interval=0(仅调试用)



















