Docker 为什么Traefik在后端网络上发现容器IP地址?

Docker 为什么Traefik在后端网络上发现容器IP地址?,docker,docker-compose,traefik,Docker,Docker Compose,Traefik,与两个服务一起使用:traefik本身和traefik/whoami,我将这两个服务分配给一个名为web的网络,后者也分配给后端网络 但是,Traefik发现了Traefik/whoami服务的后端IP地址,无法通过web网络联系,导致“网关超时” 为了强迫Traefik使用web网络,我添加了--providers.docker.network=web和Traefik.docker.network=web,但它仍然会发现后端IP地址 如何使Traefik在正确的网络上发现服务IP地址 这是我要

与两个服务一起使用:
traefik
本身和
traefik/whoami
,我将这两个服务分配给一个名为
web
的网络,后者也分配给
后端
网络

但是,Traefik发现了
Traefik/whoami
服务的
后端
IP地址,无法通过
web
网络联系,导致“网关超时”

为了强迫Traefik使用web网络,我添加了
--providers.docker.network=web
Traefik.docker.network=web
,但它仍然会发现
后端
IP地址

如何使Traefik在正确的网络上发现服务IP地址

这是我要开始工作的
docker compose.yml
文件

版本:“3.8”
服务:
特拉菲克:
图片:“traefik:v2.3”
命令:
---log.level=DEBUG
---api.unsecure=true
---api.dashboard=true
---api.debug=true
---providers.docker=true
---providers.docker.exposedbydefault=false
---entrypoints.web.address=:80
---providers.docker.network=web
端口:
- "80:80"
- "8080:8080"
卷数:
-“/var/run/docker.sock:/var/run/docker.sock:ro”
网络:
-网
whoami:
图片:“traefik/whoami”
标签:
-traefik.enable=true
-traefik.http.routers.whoami.rule=Host(`whoami.localhost`)
-traefik.http.routers.whoami.entrypoints=web
-traefik.docker.network=web
网络:
-网
-后端
网络:
网状物:
后端:

PS从服务中删除
后端
网络时,它工作正常

网络名称有一个小故障。由于您在撰写文件中运行,并且未引用外部网络,因此将在当前
撰写项目的范围内创建网络名称。启动时,您可能会看到一些消息说

Creating network "traefik2-test_web" with the default driver
Creating network "traefik2-test_backend" with the default driver
(假设您运行的文件夹名为traefik2 test)这意味着创建的docker网络以项目名称作为前缀,例如,允许为独立实例将compose文件旋转两次

您可能还会在日志中看到一些错误,表明未找到名为
web
的已配置网络,因此它会返回到随机选择一个

traefik_1  | time="2020-10-29T14:24:25Z" level=warning msg="Could not find network named 'web' for container '/traefik2-test_whoami_1'! Maybe you're missing the project's prefix in the label? Defaulting to first available network." providerName=docker container=whoami-traefik2-test-4661d09157cf941b7efd7c8154af5611249866c4bc394c256e225e05db21a784 serviceName=whoami-traefik2-test
因此traefik希望网络的名称是全局有效的,而不关心它是从compose项目内部启动的。您可以通过执行以下操作来验证网络名称:

docker container inspect XXX_whoami_1
其中XXX是docker compose项目的名称

你现在能做什么

解决方案1:通过env修复并引用项目名称 相应地构造网络名称,以便参数与docker compose创建的网络的全局唯一名称匹配。如果此组合文件中的所有目标容器都位于
web
网络中,则您甚至可以忽略目标容器上的特殊标签

traefik:
图片:“traefik:v2.3”
命令:
---log.level=DEBUG
---api.unsecure=true
---api.dashboard=true
---api.debug=true
---providers.docker=true
---providers.docker.exposedbydefault=false
---entrypoints.web.address=:80
---providers.docker.network=${COMPOSE\u PROJECT\u NAME}\u web
端口:
- "80:80"
- "8080:8080"
卷数:
-“/var/run/docker.sock:/var/run/docker.sock:ro”
网络:
-网
这需要为每个命令传递docker compose项目名称(或相应地设置env)

问题是,您确实需要为每个调用指定该变量。您可以通过使用启用该功能的
docker compose.yml
旁边的
.env
文件来修复此问题

COMPOSE_PROJECT_NAME=projfromenv
替代解决方案:外部网络参考 但也许有更好的解决办法。第二个选项是通过引用现有网络来使用全局唯一的网络名称。这需要对网络进行初始设置,如下所示:

docker network create traefik-net
然后在“网络”部分中引用它:

networks:
  web:
    external: true
    name: traefik-net
  backend:
并通过引用此网络名称(代码段)启动traefik:

您的目标容器仍然引用本地网络名
web
,现在它是对该全局网络名的引用。您不需要为whoami容器指定traefik网络标签,因为您不需要覆盖默认值


此设置还允许使用容器启动其他compose项目,这些容器也应从此traefik实例中公开。所以我会选择第二个选项……

我从没想过会有这么详细的解释,向你致敬,我的好先生!
networks:
  web:
    external: true
    name: traefik-net
  backend:
- --providers.docker.network=traefik-net