【问题标题】:Recommended way to run a Docker Compose stack in production?在生产中运行 Docker Compose 堆栈的推荐方法?
【发布时间】:2017-01-20 07:12:17
【问题描述】:

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

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

我还没有找到很多关于以这种方式在生产中使用 docker-compose 的信息。 The documentation 很有帮助,但没有提及任何关于启动时的内容,而且我使用的是 Amazon Linux,因此(当前)无法访问 Docker Machine。我习惯于使用 supervisord 来管理进程并确保它们在启动时启动,但我认为这不是使用 Docker 容器的方法,因为它们最终会受到 Docker 守护进程的监督?

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

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

【问题讨论】:

  • 所以您不一定想要一个成熟的编排器,而是需要某种单一服务器的东西来确保docker compose up 保持正常运行?像 docker compose 的 monit 之类的?
  • @TimoLehto 我以前从未遇到过 monit,但乍一看,我会说 'monit for docker compose' 将非常接近我正在寻找的东西 - 让所有东西在启动时启动并运行,并在容器失败时重启容器(在合理范围内)

标签: docker docker-compose devops


【解决方案1】:

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

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

【讨论】:

  • 您链接到的文档已过期。 Kubernetes 看起来很有趣,但学习曲线看起来很陡峭,并且不能与 docker-compose 一起使用。
  • 我已经用最新的文档更新了我的回复。
【解决方案2】:

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

Swarmkit has a restart policy(见swarmctl flags

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

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

【讨论】:

    【解决方案3】:

    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 发展迅速,因此我希望该功能很快就会推出。

    【讨论】:

    • 这是最简单的解决方案 - 我没有意识到 restart: always 在 Docker 守护进程重新启动时也会持续存在!
    【解决方案4】:

    您说您使用 AWS,那么为什么不使用专为您所要求的内容而构建的 ECS。您创建一个包含 5 个容器的应用程序。您将在集群中配置您想要的 EC2 实例和数量。

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

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

    【讨论】:

    • ECS 会很好,但在这种情况下,我无法控制 AWS 基础设施,必须使用提供的 EC2 实例
    猜你喜欢
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多