推荐在生产环境中运行Docker Compose堆栈的方式是什么?

9
我有几个compose文件(docker-compose.yml)描述了一个简单的Django应用程序(五个容器,三个镜像)。
我想在生产环境中运行这个堆栈 - 让整个堆栈在启动时开始,并且如果容器崩溃,则重新启动或重新创建容器。我不关心任何卷,容器不会保留任何重要状态,可以随意回收。
我没有找到有关在生产中使用特定docker-compose的太多信息。文档很有帮助,但没有提到任何关于启动的内容,而且我正在使用Amazon Linux,因此(目前)无法访问Docker Machine。我习惯使用supervisord来监视进程并确保它们在引导时启动,但我认为这不是使用Docker容器的方法,因为它们最终由Docker守护程序监督?
作为一个简单的开始,我考虑只需在所有服务上放置restart: always并制作一个init脚本,在引导时执行docker-compose up -d。是否有一种推荐的方式以健壮的方式管理docker-compose堆栈?

编辑:我正在寻找一种“简单”的方式以稳健的方式运行我的容器堆栈的等价物docker-compose up。 我事先知道堆栈中声明的所有容器都可以驻留在同一台机器上; 在这种情况下,我不需要协调来自同一堆栈的容器跨多个实例,但是了解这一点也很有帮助。


所以您不一定需要完整的编排工具,而是要一些确保docker compose up一直运行的单服务器工具,比如Docker Compose的monit之类? - Timo
@TimoLehto 我以前从未遇到过monit,但是从一瞥之间,我想“monit for docker compose”可能非常接近我所寻找的 - 在启动时让所有东西都运行起来,并在容器失败时(在合理范围内)重新启动它们。 - James Hiew
4个回答

11

Compose是一个客户端工具,但是当你运行docker-compose up -d时,所有容器选项都会被发送到引擎并存储。如果你将restart指定为always(或者更好的选择是unless-stopped,以便更灵活地控制,参考文档),那么每次主机启动时就不需要再次运行docker-compose up

当主机启动时,只要你已经配置了Docker守护程序在启动时自动启动,Docker会启动所有标记为需要重新启动的容器。因此,你只需要运行一次docker-compose up -d,Docker会自动处理其余的事情。

至于在Swarm中协调跨多个节点的容器,首选方法将是使用分布式应用程序包,但目前该功能(截至Docker 1.12)仍处于实验阶段。你基本上需要从本地Compose文件创建一个Bundle来表示你的分布式系统,然后远程部署到Swarm上。Docker发展迅速,所以我希望这个功能很快就会可用。


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - James Hiew

1
如果你可以将你的Django应用程序组织为一个swarmkitservice(docker 1.11+), 那么你可以使用Task协调执行你的应用程序。 Swarmkit有一个重启策略(见swarmctl标志)

重启策略:编排层监视任务并根据指定的策略对故障进行反应。
操作员可以定义重启条件、延迟和限制(在给定时间窗口内的最大尝试次数)。SwarmKit可以决定在不同的机器上重新启动任务。这意味着有故障的节点将逐渐被其任务耗尽。

即使你的“集群”只有一个节点,编排层也会确保你的容器始终处于运行状态。

1
你说你使用AWS,那为什么不使用ECS呢?它正是为你所需而建。你将创建一个应用程序,其中包含了你的5个容器。你将配置在你的集群中想要多少个EC2实例以及如何配置。
你只需将docker-compose.yml转换为特定的Dockerrun.aws.json即可,这并不难。
AWS会在你部署时启动你的容器,并在发生崩溃时重新启动它们。

ECS可能很好,但在这种情况下,我无法控制AWS基础架构,必须使用提供的EC2实例。 - James Hiew

1
你可以在他们的 文档 中找到有关在生产中使用docker-compose的更多信息。但是,正如他们所提到的那样,compose 主要针对开发和测试环境。
如果您想在生产中使用容器,我建议您使用适当的工具来编排容器,例如 Kubernetes

你提供的文档已经过时了。Kubernetes 看起来很有趣,但是学习曲线看起来很陡峭,并且根据我所读到的内容,它不能与 docker-compose 原生地配合使用。 - James Hiew
我已经使用最新的文档更新了我的回复。 - JesusTinoco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接