【问题标题】:Docker-compose isolate networks by project nameDocker-compose 按项目名称隔离网络
【发布时间】:2020-12-26 22:22:53
【问题描述】:

我正在尝试使用 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
    

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

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

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

看起来一切都受容器名称的约束。我不想使用container_name,因为我想使用docker scale

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

提前致谢。

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

【问题讨论】:

    标签: docker-compose traefik


    【解决方案1】:

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

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

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

    services:
       proxy:
          networks:
             - net
             - internal
       app:
          networks:
             - internal
       auth:
          networks:
             - internal
    
    networks:
      internal:
      net:
        external:
           name: traefik_webgateway # not really important here
    

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

    如果你真的需要将所有服务连接到同一个外部网络,你可以使用aliasesvariable substitution

    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
    

    这基本上是您的解决方法,但您可以像这样使用单个 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
    

    【讨论】:

    • 非常感谢您的解释!现在说得通了:)
    猜你喜欢
    • 1970-01-01
    • 2019-04-17
    • 2017-08-02
    • 2023-03-07
    • 2022-06-15
    • 2019-04-26
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    相关资源
    最近更新 更多