traefik 通过监听 docker.sock 实现自动服务发现,不依赖 bridge 网络的服务发现能力;需将 traefik 与后端容器置于同一自定义 bridge 网络,并确保服务监听 0.0.0.0 而非 127.0.0.1。

Bridge 网络本身不支持跨主机服务发现,但结合 Traefik 仍可实现自动反向代理——关键在于让 Traefik 能“看到”容器,并通过标签驱动路由,而不是依赖网络层的服务发现。
Traefik 不靠 Bridge 网络做服务发现,它靠的是 Provider(比如 Docker)监听容器事件。只要 Traefik 容器能访问 /var/run/docker.sock,它就能实时获知所有容器的启停、端口、标签等信息,无论这些容器在 bridge 还是自定义网络里。
不过,用默认 Bridge 网络有个硬限制:容器间无法通过服务名通信(只能用 IP),而且 Traefik 无法直接把请求转发到 bridge 网络中容器的 localhost 或 127.0.0.1 ——因为那是容器自己的回环地址,不是宿主机视角的可达地址。
所以实际落地时,需满足两个前提:
- Traefik 和目标服务容器必须在同一 Docker 网络(推荐自定义 bridge,而非默认 bridge)
- 目标服务容器必须暴露真实监听端口(如
EXPOSE 8000),且应用绑定0.0.0.0:8000,不能只绑127.0.0.1
为什么建议避开默认 bridge 网络
默认 bridge 网络下:
- 容器没有 DNS 名称解析(不能用服务名互相访问)
- Traefik 无法通过容器名或别名定位后端,只能靠 IP + 端口,而 IP 可能变动
- 标签(labels)虽仍生效,但健康检查、负载均衡等高级功能易出问题
正确做法:用自定义 bridge 网络
创建一个显式 bridge 网络,让 Traefik 和微服务共处其中:
- 运行
docker network create traefik-net - 在
docker-compose.yml中为 Traefik 和所有服务指定该网络 - 服务容器启动时,Docker 自动分配固定 DNS 名(即服务名),Traefik 可直接用它做后端地址
标签怎么写才有效
即使在 bridge 网络里,路由规则依然靠容器 labels 驱动。例如,一个 Django 服务可这样声明:
traefik.http.routers.myapp.rule=Host(`app.example.com`)traefik.http.services.myapp.loadbalancer.server.port=8000traefik.http.routers.myapp.tls=true
Traefik 启动后会自动提取这些标签,生成对应路由和服务定义,并将请求转发到同网段内该容器的 8000 端口。
特别注意端口绑定方式
你的微服务容器必须监听 0.0.0.0:8000,而不是 127.0.0.1:8000。否则 Traefik 所在容器虽然和它在同一网络,也连不通——因为后者只接受本机回环请求。
常见框架默认行为:
- Django:
python manage.py runserver 0.0.0.0:8000 - FastAPI:
uvicorn main:app --host 0.0.0.0 --port 8000 - Node.js:
app.listen(8000, '0.0.0.0')
不复杂但容易忽略











