DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

Traefik 后端接入两个 Docker 网络后时通时不通:指定连接网络

应用同时接入代理网和私有网时,Traefik 可能选错后端 IP。对照实际网络,固定 docker.network,并保留数据库和缓存的隔离。

应用既连接数据库的私有网络,又连接 Traefik 的代理网络,重建几次后有时能访问、有时连不上。即使 Traefik 和应用已经共享一个网络,Docker provider 仍可能选中了应用在另一个网络上的 IP。先检查生效的后端地址,再决定是否需要固定连接网络。

本文针对 Traefik v3 的 Docker provider,并采用默认 useBindPortIP=false 的容器内部 IP 连接方式。启用了宿主端口绑定寻址、使用 Swarm provider,或实际请求根本没有命中 router 的部署,应先核对相应配置,不能直接套用这个分支。

共享网络存在,不等于选中了那张网卡

一种常见布局是:应用连接 proxy 与 app-private 两个网络,Traefik 只连接 proxy,数据库和缓存只连接 app-private。这样的分离本身合理,不需要把数据库也接进代理网络。

保留当前部署清单,查看 Traefik 受保护的生效配置、日志或现有管理入口中记录的 service 后端 IP 和端口。随后用只读检查确认应用与 Traefik 的实际网络,容器名需替换:

docker inspect app-container --format '{{json .NetworkSettings.Networks}}'
docker inspect traefik-container --format '{{json .NetworkSettings.Networks}}'

输出包含内部网络信息,应保存在受控资料里。把生效的后端 IP 对照应用各网络的 IP:如果指向 Traefik 没有接入的私有网络,就符合选网错误的条件。若它已经指向共同网络,继续检查容器内监听地址、service 端口和应用状态,不要把所有连接失败都算成多网络问题。

没有显式指定时,多网络容器的连接网络选择可能受 Docker 返回网络信息的顺序影响。反复重启偶然恢复,不是可靠修复;也不能用“两个容器都写了 proxy”来证明 provider 实际使用的是 proxy 的 IP。

在应用容器上指定实际网络名

可用 traefik.docker.network 标签为这个应用固定连接网络。下面是结构示例,保留项目已有 router、TLS 和其他配置:

labels:
  - "traefik.docker.network=shared-proxy"
  - "traefik.http.services.app.loadbalancer.server.port=80"

shared-proxy 必须是 Docker 中实际存在、应用与 Traefik 都已连接的网络名称。Compose 清单里的逻辑键不一定就是实际名称,项目或 stack 前缀可能改变它;以 inspect 的结果核对,不把示例名称直接照搬。

这个标签只决定 Traefik 用哪一个网络连接应用,不会把任何容器自动接入网络,也不会修复错误的后端端口。应用仍需保留私有网络来访问数据库和缓存。service 端口则需对应应用在容器内监听的端口,不能混用宿主机的发布端口。

如果所有由这个 Docker provider 代理的应用都共用同一网络,也可在 Traefik 启动配置中设置默认网络。结构示例:

providers:
  docker:
    network: shared-proxy

这是现有 Docker provider 配置的一部分,不要用这两行覆盖原来的 endpoint、约束和发现设置。单个容器的 traefik.docker.network 标签可以覆盖 provider 默认值;已有错误标签时,只修改默认网络仍可能没有效果。

保留隔离,按地址变化验证

变更前保存清单、网络连接关系和持久卷配置。应用标签更新通常需要重建对应容器,启动配置变化则按 Traefik 的服务更新流程处理;都应安排合适窗口,并保留可恢复的版本。不要为了让服务“都在同一张网”扩大数据库、缓存或管理入口的可达范围。

更新后查看 service 后端地址,确认它属于指定的共同网络,端口与应用监听一致。再验证外部入口及应用到数据库、缓存的正常功能。应用后续重建后,IP 可能变化;需要确认 provider 仍选择指定网络中的新地址,而不是要求 IP 永远不变。

如果地址已正确但仍连接失败,继续检查应用是否只监听容器回环地址、是否已就绪,以及实际后端协议。若配置了 useBindPortIP=true,则应另按宿主绑定地址与回退行为核对目标,不能沿用本文的默认内部 IP 推断。

回退时恢复原标签或 provider 配置,重新核验网络选择与业务功能。若回退后又变成偶尔可用,说明原来的选择不确定性仍在,应继续完成固定网络的配置,而不是把重启成功视为问题已解决。