在生产中运行Docker Compose堆栈的推荐方法?

时间:2016-09-12 19:16:59

标签: docker docker-compose devops

我有几个撰写文件(docker-compose.yml),描述了一个简单的Django应用程序(五个容器,三个图像)。

我想在生产中运行这个堆栈 - 让整个堆栈在启动时开始,并且让容器重新启动或者在它们崩溃时重新创建。没有我关心的任何卷,容器不会保持任何重要状态,可以随意回收。

我还没有找到很多关于以这种方式在生产中使用docker-compose的信息。 The documentation很有帮助,但没有提及启动时的任何内容,我使用的是亚马逊Linux,因此不能(目前)可以访问Docker Machine。我过去常常使用supervisord来监督进程,并确保它们在启动时启动,但我不认为这是使用Docker容器的方法,因为它们最终会被Docker守护进程监控?

作为一个简单的开始,我想把sed 's#</p1>#\n#g' xmlfiles | sed -n '/<p1>/ s#.*<p1>##p' 放在我的所有服务上,并在启动时创建一个初始脚本restart: always。是否有建议的方法以稳健的方式管理生产中的docker-compose堆栈?

编辑:我正在寻找一个简单的&#39;以健壮的方式为我的容器堆运行等效的docker-compose up -d的方法。我事先知道堆栈中声明的所有容器都可以驻留在同一台机器上;在这种情况下,我不需要在多个实例中从同一堆栈中编排容器,但这也有助于了解。

4 个答案:

答案 0 :(得分:9)

Compose是一个客户端工具,但是当您运行docker-compose up -d时,所有容器选项都会发送到Engine并存储。如果您将restart指定为always(或者最好是unless-stopped to give you more flexibility),则每次主持人启动时都不需要运行docker-compose up

当主机启动时,如果您在启动时启动configured the Docker daemon,Docker将启动所有标记为重新启动的容器。因此,您只需运行docker-compose up -d 一次,Docker将负责其余工作。

关于在Swarm中跨多个节点编排容器 - 首选方法是使用Distributed Application Bundles,但目前(从Docker 1.12开始)是实验性的。您基本上将从代表您的分布式系统的本地Compose文件创建一个包,然后将其远程部署到Swarm。 Docker移动速度很快,所以我希望很快就可以使用该功能。

答案 1 :(得分:1)

您可以在documentation中找到有关在生产中使用docker-compose的更多信息。但是,正如他们所提到的,compose主要针对开发和测试环境。

如果您想在生产中使用容器,我建议您使用合适的工具来编排容器,如Kubernetes

答案 2 :(得分:1)

如果您可以将Django应用程序组织为swarmkit service (docker 1.11+),则可以使用Task协调执行应用程序。

Swarmkit has a restart policy(见swarmctl flags

  

重新启动策略:业务流程层根据指定的策略监控任务并对故障作出反应。
  操作员可以定义重启条件,延迟和限制(给定时间窗口内的最大尝试次数)。 SwarmKit可以决定在另一台机器上重启任务。这意味着故障节点将逐渐耗尽其任务。

即使您的“群集”只有一个节点,业务流程层也会确保您的容器始终正常运行。

答案 3 :(得分:1)

你说你使用AWS所以为什么不使用为你所要求的内容而构建的ECS。您创建一个应用程序,它是您的5个容器的包。您将在群集中配置所需的EC2实例数。

您只需将docker-compose.yml转换为特定的Dockerrun.aws.json并不难。

AWS将在您部署时启动容器,并在发生崩溃时重新启动它们