Docker Swarm - 跨主机部署具有共享代码库的堆栈

Docker Swarm - Deploying stack with shared code base across hosts

我有一个关于基于 docker 群将应用程序部署到生产环境的最佳实践的问题。

为了简化与此相关的讨论 question/issue 让我们考虑以下场景:

我们的群体包含:

所以最后,对于我们的示例应用程序,我们在 6 个不同的服务器上有 6 个 dockers 运行ning。 2 dockers 是 memcached,其中 4 个是与 memcached 通信的客户端。 "Client 1" 和 "Client 2" 将根据某种规则在 memcached 中插入数据。 "Recycle data 1" 和 "Recycle data 2" 将根据某种规则更新或删除 memcached 中的数据。就这么简单。

我们与 memcached 通信的应用程序是自定义应用程序,它们是我们编写的。这些应用程序的代码驻留在 github(或任何其他存储库)中。将此应用程序部署到生产环境的最佳方式是什么:

  1. 构建镜像,在镜像中包含复制的代码,您可以使用这些代码将东西部署到 swarm
  2. 构建将使用代码驻留在图像外部的卷的图像。

考虑到我是第一次将 swarm 部署到生产环境中,我可以看到方法 1 存在很多问题。将代码合并到图像中对我来说似乎不合逻辑,请记住在 99% 的时间里,即将发生的更新将基于代码。每当您想更新 运行 特定 docker 上的代码时(无论更改有多么小),这都需要构建图像。

方法 2. 对我来说似乎更合乎逻辑。但在这个特定时刻,我不确定这可能吗?所以这里有很多问题:

  1. 如果我们要托管多个 docker 将在后台 运行 相同代码的情况下,最好的方法是什么?
  2. 是否有可能在 docker swarm 上拥有一个中央主机、服务器(管理器,任何地方),我们可以在其中克隆我们的存储库并将这些存储库作为卷共享到 docker 蜂拥而至? (在我们的示例中,所有 4 个客户服务都将在我们托管代码的位置安装卷)
  3. 如果这是可能的,docker-compose.yml 实现是什么?

在更深入地挖掘并使用 docker 和 docker 集群模式 3 个月后,这些是上述问题的答案:


答案 1: 通常,您应该将 docker 映像视为程序的 "compiled" 版本。您的图像应包含代码库或程序的编译版本(取决于您使用的编程语言),并且该特定图像代表您的应用程序版本。每次要部署下一个版本时,都会生成新映像。

这可能是 99% 将由 docker 托管的应用程序的最佳方法(开发环境和应用程序除外,您确实想要 bash 并直接控制事物来自 docker 容器本身)。


答案2:有可能,但这是非常糟糕的做法。正如答案一中提到的,最好的方法是将应用程序代码直接复制到图像中,然后 "consider" 您的图像(运行 容器)作为 "app by itself".

一开始我无法理解这个概念,因为这个概念不允许您简单地转到服务器(或您托管 docker 的任何地方)并更改应用程序并重新启动 docker(很明显,因为容器将在重新启动后再次使用相同的图像,您使用该图像部署的相同代码库)。任何类型的更改 应该并且需要 部署为具有不同版本的不同图像。这就是 docker 的意义所在。

此外,跨多个群服务共享相同代码库的最初想法是可能的,但这完全破坏了跨 docker 群进行版本控制的目的。

考虑将 3 项服务用作冗余服务(故障转移),并且您想在其中一项上使用新版本作为 Beta 测试。这对于共享代码库是不可能的。