3

我们正在移动我们的一些内部服务以依赖 Docker,而不是直接安装在主机操作系统上(好东西,对 :)。

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


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

然而,还有一种模式stackB可以与之通信stackA以提供附加功能。在某些节点上,我们可能希望同时部署两者,并让它们进行通信。

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

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

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

看来我们面临着一个选择,目前我们只能找到 3 个选项:

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

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

或者是一个隐含的假设,即一旦两个容器应该进行通信,它们就必须从同一个 compose 文件中部署?

4

1 回答 1

1

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

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

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

要让堆栈通过边界进行通信,您只需共享同一个网络。

在我的案例中,第一个堆栈定义了一个网络,另一个堆栈通过撰写文件配置加入该网络。

...
networks:
    default:
        external:
            name: FIRST_STACK_NAME_default
...
于 2018-06-20T15:17:07.627 回答