我们正在将我们的一些内部服务转移到依赖Docker的方式,而不是直接在主机OS上安装(好吧,不错:)。
我们将docker stack
命令与compose文件一起使用(对我们来说,这是现代方法)。但是我们不确定如何正确地使我们的堆栈模块化,同时允许组合:
假设我们有两个堆栈: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
。是否有最佳/推荐的方法来保持不同堆栈的模块化,同时允许轻松地组合它们?
还是一个隐含的假设,即两个容器一旦要通信,就必须从相同的撰写文件中对其进行部署?
最佳答案
当我想分开处理它们时,我通常处理多个堆栈。常见情况是针对具有不同配置的不同客户安装的同一Web服务镜像的水平缩放,例如数据库。
分开的堆栈使我可以轻松关闭它们,而不会受到其他安装的影响
我也喜欢多个堆栈安装中的标准命名约定。相同的服务在堆栈前缀旁边具有相同的名称。
要使堆栈跨边界通信,您只需共享同一网络。
在我的情况下,第一个堆栈定义隐含一个网络,另一个堆栈通过编写文件配置将其加入该网络。
...
networks:
default:
external:
name: FIRST_STACK_NAME_default
...