Docker compose Docker按项目名称组合隔离网络

Docker compose Docker按项目名称组合隔离网络,docker-compose,traefik,Docker Compose,Traefik,我正试图通过部署docker compose和traefik实现零停机时间,但我遇到了与另一个项目交叉通信的容器问题 docker-compose.yml(细节省略) 我通过以下方式运行两个不同的服务实例: docker-compose --env-file=.env --project-name=green -f docker-compose.yml up docker-compose --env-file=.env --project-name=blue -f docker-compose.

我正试图通过部署docker compose和traefik实现零停机时间,但我遇到了与另一个项目交叉通信的容器问题

docker-compose.yml(细节省略)

我通过以下方式运行两个不同的服务实例:

docker-compose --env-file=.env --project-name=green -f docker-compose.yml up
docker-compose --env-file=.env --project-name=blue -f docker-compose.yml up
在我运行“蓝色”项目之前,我的“绿色”服务工作正常。当启动“蓝色”时,“绿色”“代理”容器中的一些请求将被路由到“蓝色”容器。在“代理”中进行的与“身份验证”服务对话的示例调用:

我需要在“绿色”的网络停留在“绿色”,和“蓝色”在“蓝色”。。。否则,当未准备就绪时,“绿色”中的某些请求将变为“蓝色”,从而导致API失败。一旦所有的容器都准备好了,一切都正常,但这不是零停机时间

看起来所有内容都是由容器名称绑定的。我不想使用
container\u name
,因为我想使用
docker scale

我的解决方法是创建
docker compose.blue.yml
docker compose.green.yml
,并复制所有内容,但在
容器名称
后面加上
\u blue
\u green
。但我想知道是否有更好的解决办法

提前谢谢


编辑:建议的解决方案回答了这个问题,但通过将
内部
网络添加到我的
代理
,traefik将失去与我的服务的通信。

默认情况下,
docker compose
将为您的项目设置一个独立的网络。当使用自定义网络时,这些网络也将以项目名称命名,从而隔离具有不同名称的项目-请参阅

但是:在您的示例中,所有容器都连接到一个没有名称空间的外部网络,因此即使对于不同的项目也是相同的。 由于容器也共享相同的名称,因此在该网络中解析它们可能会产生绿色或蓝色版本

有几种方法可以解决这个问题。适当的方法取决于您的特定用例。最好也是最安全的方法是将具有相同项目名称的所有容器隔离到它们自己的内部网络,并且只将用于外部连接的端口暴露到外部网络:

服务:
代理:
网络:
-网
-内部的
应用程序:
网络:
-内部的
认证:
网络:
-内部的
网络:
内部:
净:
外部:
名称:traefik#u webgateway#在这里并不重要
在这里,所有容器仅连接到项目范围内的内部网络,并且能够相互通信。只有
代理
服务也连接到外部
网络
网络,并且可以从那里连接到

如果您确实需要将所有服务连接到同一个外部网络,您可以与以下一起使用:

服务:
代理:
网络:
净:
别名:
-代理${COLOR}
应用程序:
网络:
净:
别名:
-应用程序${COLOR}
认证:
网络:
净:
别名:
-认证${COLOR}
网络:
净:
外部:
名称:traefik#u webgateway#在这里并不重要
这基本上是您的解决方法,但使用单个
docker compose.yml
,您可以这样使用:

COLOR=green docker-compose--env file=.env--project name=green-f docker-compose.yml up
COLOR=blue docker-compose--env file=.env--project name=blue-f docker-compose.yml up

非常感谢您的解释!现在有道理了:)
docker-compose --env-file=.env --project-name=green -f docker-compose.yml up
docker-compose --env-file=.env --project-name=blue -f docker-compose.yml up
http://auth/session