我有一个与基于docker swarm将应用程序部署到生产的最佳实践相关的问题。
我们的群体包含:
所以最后,对于我们的示例应用程序,我们有6个docker在6个不同的服务器上运行。 memcached有2个docker,其中4个是与memcached通信的客户端。 "客户1"和"客户2"将根据某种规则在memcached中插入数据。 "回收数据1"和"回收数据2"将根据某种规则更新或删除memcached中的数据。就这么简单。
我们与memcached通信的应用程序是自定义的,它们是由我们编写的。这些应用程序的代码驻留在github(或任何其他存储库)上。将此应用程序部署到生产环境的最佳方法是什么:
考虑到我是第一次将swarm部署到制作中,我可以看到很多问题,编号方式为1。将代码合并到图像中对我来说似乎不合逻辑,请记住在99在所有时间内,将要发生的更新将基于代码。每次要更新在特定docker上运行的代码时,都需要构建映像(无论更改有多小)。
方式2对我来说似乎更合乎逻辑。但在这个具体时刻,我不确定这可能吗?所以这里有很多问题:
答案 0 :(得分:4)
在深入挖掘并使用docker和docker swarm模式进行最近3个月后,这些是上述问题的答案:
答案1:通常,您应该将您的泊坞窗图片视为程序的“已编译”版本。您的图像应包含代码库或程序的编译版本(取决于您使用的编程语言),并且该特定图像代表您的应用程序版本。每当您想要部署下一个版本时,您都将生成新图像。
对于将要使用docker托管的99%的应用程序来说,这可能是最佳方法(例外情况是开发环境和应用程序,您真正希望直接从docker容器中直接控制和控制事物)。
回答2:这是可能的,但这是非常糟糕的方法。正如答案一中所提到的,最好的方法是将应用程序代码直接复制到图像中,并将“图像”(运行容器)“视为”自己的“app”。
我无法在乞讨时围绕这个概念,因为这个概念不允许你简单地去服务器(或者你托管你的docker的地方)并更改应用程序并重启docker(显然因为容器在重新启动后使用相同的图像,使用该图像部署的相同代码库,将再次处于相同的开头。任何类型的更改 SHOULD和NEEDS 将被部署为具有不同版本的不同图像。这就是docker的全部意义。
此外,跨多个群服务共享相同代码库的初步想法是可能的,但它完全破坏了docker swarm版本化的目的。
考虑使用3个服务作为冗余服务(故障转移),并且您希望在其中一个服务上使用新版本作为beta测试。共享代码库无法实现这一点。