在Docker中,从单独的撰写文件中撰写复杂的堆栈是一种好习惯吗?

时间:2018-06-20 15:02:09

标签: docker docker-compose docker-stack

我们正在将一些内部服务转移到Docker上,而不是直接在主机OS上安装(好事,对:)。

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


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

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

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

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

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

似乎我们面临一个选择,目前我们只能找到3个选择:

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

是否有最佳/推荐的方法来保持不同堆栈的模块化,同时使它们易于组合?

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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