Traefik应用:配置容器多个网络时无法访问问题
介绍
使用traefik代理部署项目时遇到一个问题:
Traefik容器所在的网络也是traefik-public,而配置容器服务使用了两个网络,一个是default,另一个是traefik-public,导致部署后一直无法访问容器服务。
解决方法
问题原因: 容器多网络归属导致 Traefik 无法正确发现路由规则。
Traefik 默认只会监听 与自身同一 Docker 网络 的容器标签。你的应用容器同时连接了 default
和 traefik-public
网络,但 Traefik 只监听了 traefik-public
网络,导致路由规则未被正确识别。
解决方案
方法 1:将应用容器 仅连接 到 traefik-public
网络
在 docker-compose.yml
中强制应用容器 只使用 traefik-public
网络,避免多网络干扰。
services:
app:
networks:
- traefik-public # 仅保留 traefik-public 网络
labels:
- traefik.enable=true
- traefik.http.routers.app.rule=Host(`app.localhost`)
- traefik.http.routers.app.entrypoints=http
- traefik.http.services.app.loadbalancer.server.port=3000
networks:
traefik-public:
external: true # 确保该网络已提前创建
方法 2:显式指定 Traefik 监听的网络
在 Traefik 的启动命令中,通过 --providers.docker.network=traefik-public
参数强制指定监听的网络。(具体参考Traefik Docker Network Config)
services:
traefik:
command:
- --api.insecure=true
- --providers.docker
- --providers.docker.network=traefik-public # 关键参数
- --entrypoints.web.address=:80
完整配置示例
version: '3'
services:
traefik:
image: traefik:v2.5
command:
- --api.insecure=true
- --providers.docker
- --providers.docker.network=traefik-public # 指定监听 traefik-public 网络
- --entrypoints.web.address=:80
ports:
- "80:80"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- traefik-public
app:
image: your-app-image:latest
networks:
- traefik-public # 仅连接 traefik-public 网络
labels:
- traefik.enable=true
- traefik.http.routers.app.rule=Host(`app.localhost`)
- traefik.http.routers.app.entrypoints=web
- traefik.http.services.app.loadbalancer.server.port=3000
networks:
traefik-public:
external: true # 确保提前运行 docker network create traefik-public
其他相关验证步骤
确保网络存在:
docker network create traefik-public # 若未创建则先执行
重启服务:
docker-compose down && docker-compose up -d
检查 Traefik 日志:
docker-compose logs traefik | grep "app" # 确认路由规则已加载
验证网络连通性:
docker exec -it your_app_container curl http://traefik:80 # 测试容器间通信