2017-10-04 149 views
4

我有一个问题,涉及将应用程序部署到基于Docker群集的生产的最佳实践。Docker Swarm - 跨主机部署带共享代码库的堆栈

为了简化这个问题相关的讨论/问题让我们考虑以下情形: enter image description here

我们的群包含:

  • 6台服务器(不同的主机)
  • 在每台服务器
  • ,我们将有一个服务
  • 每个服务将只有一个任务/副本泊坞窗运行
  • Memc ached1和Memcached2使用公共图片来自搬运工毂
  • “循环数据1”和“循环数据2”,从私有库使用自定义图像
  • “客户端1”和“客户端2”使用自定义图像从私有库

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

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

  1. 建设将包含复制的图像中的代码,你可以使用的东西部署到群
  2. 生成图像将使用量,其中代码的图像位于图像之外。

考虑到我第一次将swarm部署到生产环境中,我可以看到许多第一种方式的问题。将代码合并到图像中似乎对我来说不合逻辑,在99%的时间内,即将发生的更新将基于代码。这需要在每次想要更新在特定泊坞窗上运行的代码时(不管该变化多小),都需要构建映像。

方式2对我来说似乎更合乎逻辑。但在这个特定时刻,我不确定这是可能的吗?因此,有一些问题在这里:

  1. 是什么情况下,我们要举办,这将在后台运行同一代码的多个码头工人,最好的办法?
  2. docker swarm是否有可能拥有一个中央主机,服务器(管理员,任何地方),我们可以克隆我们的存储库并在Docker群中共享那些存储卷? (在我们的示例中,所有4个客户服务都会在我们托管代码的位置安装量)
  3. 如果可能,那么Doc​​ker-compose.yml实现是什么?

回答

3

挖越深,并与码头工人和码头工人群模式,最近3个月的工作后,这些都是对上述问题的答案:


回答1:在一般情况下,你应该考虑您的码头图像作为您的程序的“编译”版本。您的图片应包含代码库或程序的编译版本(取决于您使用的编程语言),而该特定图片代表您的应用程序版本。每当你想部署你的下一个版本时,你都会生成新的图像。

对于将要使用docker托管的应用程序(例外情况是开发环境和应用程序,您真正想直接从Docker容器打开并控制事物),这可能是最好的方法。


答2:这是可能的,但它是非常不错的办法。正如答案中所提到的,最好的方法是将应用程序代码直接复制到图像中,并将您的图像(运行容器)视为“应用程序本身”。

因为这个概念不允许你简单地去服务器(或者你在哪里托管你的码头工人)并且改变应用程序并重新启动码头工具(很明显,因为容器将在重新启动后再次使用相同的图像,与该图像部署的代码库相同)。任何类型的变化应该和需要被部署为不同版本的不同图像。这是码头工作的重点。

此外,跨多个群集服务共享相同代码库的初始想法是可能的,但它完全破坏了Docker群中版本控制的目的。

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

+2

使用码头容器为您的码头容器构建代码。容器内部没有代码,只有二进制文件。 https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds 使您的图片更小,不会让您的代码对潜在的黑客开放。 – Matt

+0

@Matt你完全有一个点。也许不那么清楚,但我指的是与上面的答案相同(将编辑)。对于坐在c,C++或类似的解决方案,显然你只需要在你的容器中编译解决方案。但是,对于很多其他(脚本化)语言(如python,php等),代码库将需要位于容器内(除非使用某种转译器) – cool

+0

正确!如果可能的话,只将裸露的必需品放入容器中。 – Matt