我有几个撰写文件(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堆栈?
docker-compose up -d
的方法。我事先知道堆栈中声明的所有容器都可以驻留在同一台机器上;在这种情况下,我不需要在多个实例中从同一堆栈中编排容器,但这也有助于了解。
答案 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将在您部署时启动容器,并在发生崩溃时重新启动它们