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

Recommended way to run a Docker Compose stack in production?

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

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

我没有找到太多关于以这种方式在生产中专门使用 docker-compose 的信息。 The documentation 很有帮助,但没有提及任何关于开机启动的信息,而且我使用的是亚马逊 Linux,所以(目前)无法访问 Docker 机器。我习惯于使用 supervisord 来照看进程并确保它们在启动时启动,但我认为这不是使用 Docker 容器的方法,因为它们最终由 Docker守护进程?

作为一个简单的开始,我想将 restart: always 放在我所有的服务上,并制作一个初始化脚本来在启动时执行 docker-compose up -d。是否有推荐的方法来以稳健的方式管理生产中的 docker-compose 堆栈?

编辑:我正在寻找一种 'simple' 方法来 运行 相当于 docker-compose up 我的容器堆栈的稳健方式。我预先知道堆栈中声明的所有容器都可以驻留在同一台机器上;在这种情况下,我不需要跨多个实例编排来自同一堆栈的容器,但了解这也会有所帮助。

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

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

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

Swarmkit has a restart policy (see swarmctl flags)

Restart Policies: The orchestration layer monitors tasks and reacts to failures based on the specified policy.
The operator can define restart conditions, delays and limits (maximum number of attempts in a given time window). SwarmKit can decide to restart a task on a different machine. This means that faulty nodes will gradually be drained of their tasks.

即使您的 "cluster" 只有一个节点,编排层也会确保您的容器始终处于运行状态并且 运行。

Compose 是一个客户端工具,但是当您 运行 docker-compose up -d 时,所有容器选项都会发送到引擎并存储。如果您将 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 发展很快,所以我希望该功能很快可用。

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

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

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