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

时间:2017-10-04 15:52:07

标签: docker share docker-swarm docker-container docker-volume

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

为了简化与此问题/问题相关的讨论,请考虑以下方案: enter image description here

我们的群体包含:

  • 6台服务器(不同的主机)
  • 在每个服务器上,我们将有一个服务
  • 每个服务只有一个任务/副本docker正在运行
  • Memcached1和Memcached2使用来自docker hub的公共图像
  • "回收数据1"和"回收数据2"使用来自私人存储库的自定义图像
  • "客户1"和"客户2"使用来自私人存储库的自定义图像

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

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

  1. 构建图像,其中包含图像中可用于将内容部署到群组中的复制代码
  2. 构建将使用代码位于图像之外的卷的图像。
  3. 考虑到我是第一次将swarm部署到制作中,我可以看到很多问题,编号方式为1。将代码合并到图像中对我来说似乎不合逻辑,请记住在99在所有时间内,将要发生的更新将基于代码。每次要更新在特定docker上运行的代码时,都需要构建映像(无论更改有多小)。

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

    1. 如果我们要托管多个将在后台运行相同代码的码头工具,最好的方法是什么?
    2. 是否可以在docker swarm中拥有一个中央主机,服务器(管理器,任何地方),我们可以克隆我们的存储库并将这些存储库作为跨泊坞群的卷共享? (在我们的示例中,所有4个客户服务将在我们代码托管的地方安装卷
    3. 如果可以的话,它的docker-compose.yml实现是什么?

1 个答案:

答案 0 :(得分:4)

在深入挖掘并使用docker和docker swarm模式进行最近3个月后,这些是上述问题的答案:

答案1:通常,您应该将您的泊坞窗图片视为程序的“已编译”版本。您的图像应包含代码库或程序的编译版本(取决于您使用的编程语言),并且该特定图像代表您的应用程序版本。每当您想要部署下一个版本时,您都将生成新图像。

对于将要使用docker托管的99%的应用程序来说,这可能是最佳方法(例外情况是开发环境和应用程序,您真正希望直接从docker容器中直接控制和控制事物)。

回答2:这是可能的,但这是非常糟糕的方法。正如答案一中所提到的,最好的方法是将应用程序代码直接复制到图像中,并将“图像”(运行容器)“视为”自己的“app”。

我无法在乞讨时围绕这个概念,因为这个概念不允许你简单地去服务器(或者你托管你的docker的地方)并更改应用程序并重启docker(显然因为容器在重新启动后使用相同的图像,使用该图像部署的相同代码库,将再次处于相同的开头。任何类型的更改 SHOULD和NEEDS 将被部署为具有不同版本的不同图像。这就是docker的全部意义。

此外,跨多个群服务共享相同代码库的初步想法是可能的,但它完全破坏了docker swarm版本化的目的。

考虑使用3个服务作为冗余服务(故障转移),并且您希望在其中一个服务上使用新版本作为beta测试。共享代码库无法实现这一点。