Docker-compose 按项目名称隔离网络

khu*_*ezy 7 docker-compose traefik

我正在尝试使用 docker-compose 和 traefik 进行零停机部署,但我遇到了容器与另一个项目交叉通信的问题。

docker-compose.yml(详细内容略)

services:
   proxy:
      networks:
         - net
   app:
      networks:
         - net
   auth:
      networks:
         - net

networks:
  net:
    external:
       name: traefik_webgateway # not really important here
    
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

我的“绿色”服务工作正常,直到我运行“蓝色”项目。当“蓝色”被启动时,“绿色”“代理”容器中的一些请求将被路由到“蓝色”容器。在“proxy”中进行与“auth”服务对话的示例调用:

http://auth/session
Run Code Online (Sandbox Code Playgroud)

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

看起来一切都由容器名称绑定。我不想使用,container_name因为我想使用docker scale.

我的解决方法是创建docker-compose.blue.ymlanddocker-compose.green.yml并复制所有内容,但后缀container name_blueand _green。但我想知道是否有更好的解决方案。

提前致谢。

编辑:建议的解决方案回答了问题,但是通过将internal网络添加到 my proxy, traefik 失去了与我的服务的通信。

acr*_*ran 7

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

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

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

services:
   proxy:
      networks:
         - net
         - internal
   app:
      networks:
         - internal
   auth:
      networks:
         - internal

networks:
  internal:
  net:
    external:
       name: traefik_webgateway # not really important here
Run Code Online (Sandbox Code Playgroud)

在这里,所有容器仅连接到项目范围的内部网络,并且能够相互通信。只有proxy服务也连接到外部net网络并且可以从那里连接。

如果确实需要将所有服务连接到同一个外部网络,可以aliases变量替换一起使用一起使用:

services:
   proxy:
      networks:
         net:
           aliases:
             - proxy_${COLOR}
   app:
      networks:
         net:
           aliases:
             - app_${COLOR}
   auth:
      networks:
         net:
           aliases:
             - auth_${COLOR}

networks:
  net:
    external:
       name: traefik_webgateway # not really important here
Run Code Online (Sandbox Code Playgroud)

这基本上是您的解决方法,但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
Run Code Online (Sandbox Code Playgroud)