【问题标题】:Running a docker from an ECS container instance从 ECS 容器实例运行 docker
【发布时间】:2018-10-10 13:09:43
【问题描述】:

我已经有一个 ECS 集群设置,其中包含在 ECS 容器实例上运行我的应用程序的任务。 现在,给定一个 docker 映像,我需要能够从我的应用程序内部运行它,并且它必须在我的应用程序运行的同一个 EC2 实例上运行。

我读到不建议在 docker 中运行 docker,最好的做法是创建同级 docker。 这意味着我的 EC2 实例应该运行 2 个容器:

  1. 我的应用,由 ECS 维护。
  2. 我的应用决定运行的 docker 映像。

如何实现这样的设置? ECS 支持吗?

【问题讨论】:

  • 我认为 ECS 没有办法做到这一点。如果您不需要它在同一个主机实例上,则可以通过向上和向下扩展所需的服务计数来实现。您也可以像使用任何 Docker 一样手动执行此操作,但我的猜测是,如果您这样做,资源分配将被搞砸,因为 ECS 无法管理它。我认为您需要它位于同一主机上的原因是共享从主机安装的文件?也许使用 EFS 可以减轻这种要求。
  • @dpwrussell 我需要在同一台主机上的原因是因为我将在两个容器之间以非常高的比特率发送接收数据。如果我在单独的机器上运行它们,我将不必要地为更好的网卡支付更多费用。
  • 是的,这很棘手。我不认为该任务可以被分割,以便它最初运行一个任务,该任务确定哪些容器是完成实际工作所必需的?然后,您可以使用成对的容器(A+B、A+C、A+D 等)执行各种不同的任务,您可以扩大这些容器以开始实际工作。
  • @dpwrussell 感谢您的任务想法。我们也带了这个,但拒绝了。手动调用的 docker 由我们应用的用户创建,因此解决方案必须更加灵活和自动化,而不是仅仅创建一组预定义任务。
  • @dpwrussell 我们最终退了一步。每个 docker 将在不同的机器上运行,并且通过进行某种压缩来降低比特率。这意味着我们将为 CPU 支付比必要更多的费用,但我们觉得我们采用了一种更精简的方法。其他选项都不是一个可行的解决方案。无论如何,您的建议已被采纳,非常感谢。

标签: amazon-web-services docker amazon-ec2 amazon-ecs


【解决方案1】:

我有几个想法。我不知道这些是否可行,但我将其写为答案,因为它很长!

一个想法

容器 A:您的容器始终在运行。 容器 X:不总是运行的各种不同容器之一。

首先为 A 和所有不同类型的 X 定义一个任务定义。

运行任务时您可以做的一件事是指定某些约束。在容器 A 上,您可以使用 API 来确定容器正在运行哪个 EC2 实例,然后在运行其中一种 X 类型的任务时将其指定为约束。

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-constraints.html

您可能会尝试在不可能执行约束的情况下运行任务(如果实例已完全提交资源),但至少您会收到错误。

更简单的想法 让容器 A 任务为自己预留足够的资源以及一些容器 X。然后只需通过在容器内安装 docker 套接字并与之通信来手动启动实例。您必须手动确保您没有过度使用资源。

两者都有问题

我在关于资源分配的评论中得到的是,无论您如何执行此操作,如果您是负载平衡容器 A,负载平衡器无法知道它们路由到的容器 A 没有旋转的能力增加额外的容器 Xs。假设一个 EC2 实例有 4 个 CPU 和 8GB 的​​ RAM,而容器 A 使用了其中的一半。假设容器 X 使用 1 个 CPU 和 2GB 的 RAM。一旦 2 个容器 X 兄弟姐妹在同一个实例上运行,就没有空间开始更多了,但是负载均衡器在将用户流量路由到容器 A 时不会知道这一点。希望这是有道理的。因此,您可能需要将面向公众的接口提取到不执行任何其他操作的容器、lambda 等。这一层可以知道哪些容器 A 实例具有启动容器 Xs 的空闲容量。

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 2017-10-26
    • 2019-12-23
    • 2018-03-13
    • 2019-11-08
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多