我们正在将一些内部服务转移到Docker上,而不是直接在主机OS上安装(好事,对:)。
我们将docker stack
命令与撰写文件一起使用(对我们来说,这是现代方法)。但是我们不确定如何在允许组合的同时正确地使我们的堆栈模块化:
让我们想象一下,我们有两个堆栈:stackA
和stackB
。这两个可以完美地隔离使用,因此,我们暂时决定将它们托管在两个单独的存储库中,每个存储库包含相应堆栈的docker-compose.yml
。
但是,还有一种模式,其中stackB
可以与stackA
通信以提供其他功能。在某些节点上,我们可能要同时部署它们,并使它们进行通信。
默认情况下,当我们使用以下命令在同一节点上启动两个堆栈时:
docker stack deploy -c stackA/ A-stack
docker stack deploy -c stackB/ B-stack
两者最终都位于不同的覆盖网络上,并且无法轻松通信。
似乎我们面临一个选择,目前我们只能找到3个选择:
stackB
的方法,但这意味着现在stackB
仅在stackA
已经运行的情况下才能部署(因为它想加入)外部网络)是否有最佳/推荐的方法来保持不同堆栈的模块化,同时使它们易于组合?
还是一个隐含的假设,即两个容器一旦要进行通信,就必须从同一撰写文件中对其进行部署?
答案 0 :(得分:1)
在我想分开处理的情况下,我通常处理多个堆栈。常见的情况是针对具有不同配置的不同客户安装对同一Web服务映像进行水平缩放,例如数据库。
分开的堆栈使我可以轻松关闭它们,而不会受到其他安装的影响
我也喜欢多个堆栈安装中的标准命名约定。相同的服务在堆栈前缀旁边具有相同的名称。
要让堆栈跨边界通信,您只需共享同一网络。
在我的情况下,第一个堆栈定义隐含一个网络,另一个堆栈通过编写文件配置将其加入该网络。
...
networks:
default:
external:
name: FIRST_STACK_NAME_default
...