Traefik应用:配置容器多个网络时无法访问问题

发布于:2025-04-10 ⋅ 阅读:(43) ⋅ 点赞:(0)

介绍

使用traefik代理部署项目时遇到一个问题:

Traefik容器所在的网络也是traefik-public,而配置容器服务使用了两个网络,一个是default,另一个是traefik-public,导致部署后一直无法访问容器服务。


解决方法

问题原因: 容器多网络归属导致 Traefik 无法正确发现路由规则

Traefik 默认只会监听 与自身同一 Docker 网络 的容器标签。你的应用容器同时连接了 defaulttraefik-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

其他相关验证步骤

  1. 确保网络存在

    docker network create traefik-public  # 若未创建则先执行
    
  2. 重启服务

    docker-compose down && docker-compose up -d
    
  3. 检查 Traefik 日志

    docker-compose logs traefik | grep "app"  # 确认路由规则已加载
    
  4. 验证网络连通性

    docker exec -it your_app_container curl http://traefik:80  # 测试容器间通信
    

网站公告

今日签到

点亮在社区的每一天
去签到