我们正在将我们的一些内部服务转移到依赖Docker的方式,而不是直接在主机OS上安装(好吧,不错:)。

我们将docker stack命令与compose文件一起使用(对我们来说,这是现代方法)。但是我们不确定如何正确地使我们的堆栈模块化,同时允许组合:

假设我们有两个堆栈:stackAstackB。这两个可以完美地隔离使用,因此,我们暂时决定将它们托管在两个单独的存储库中,每个存储库包含相应堆栈的docker-compose.yml

但是,还有一种模式,其中stackB可以与stackA通信以提供其他功能。在某些节点上,我们可能要同时部署它们并使它们进行通信。

默认情况下,当我们使用以下命令在同一节点上启动两个堆栈时:

docker stack deploy -c stackA/ A-stack
docker stack deploy -c stackB/ B-stack

两者最终都位于不同的覆盖网络上,并且无法轻松通信。

看来我们面临一个选择,目前我们只能找到3个选择:
  • 我们已经看到了在其compose文件中将外部网络添加到stackB中的方法,但是这意味着现在只有在stackB已经运行(因为它想加入外部网络)的情况下,才能部署stackA
  • 我们可以定义另一个组合文件,手动将两者合并。但这导致我们维护另一个回购,并重复更改。
  • 我们可以使堆栈通过暴露的端口在主机网络上进行通信,但可能会感到有些奇怪。


  • 是否有最佳/推荐的方法来保持不同堆栈的模块化,同时允许轻松地组合它们?

    还是一个隐含的假设,即两个容器一旦要通信,就必须从相同的撰写文件中对其进行部署?

    最佳答案

    当我想分开处理它们时,我通常处理多个堆栈。常见情况是针对具有不同配置的不同客户安装的同一Web服务镜像的水平缩放,例如数据库。

    分开的堆栈使我可以轻松关闭它们,而不会受到其他安装的影响

    我也喜欢多个堆栈安装中的标准命名约定。相同的服务在堆栈前缀旁边具有相同的名称。

    要使堆栈跨边界通信,您只需共享同一网络。

    在我的情况下,第一个堆栈定义隐含一个网络,另一个堆栈通过编写文件配置将其加入该网络。

    ...
    networks:
        default:
            external:
                name: FIRST_STACK_NAME_default
    ...
    

    08-27 06:22