Amazon web services 从ECS容器实例运行docker

Amazon web services 从ECS容器实例运行docker,amazon-web-services,docker,amazon-ec2,amazon-ecs,Amazon Web Services,Docker,Amazon Ec2,Amazon Ecs,我已经有一个ECS群集设置,其中包含在ECS容器实例上运行我的应用程序的任务。 现在,给定一个docker映像,我需要能够从我的应用程序内部运行它,并且它必须在我的应用程序运行的同一个EC2实例上运行 我读到不建议在docker中运行docker,最好的做法是创建兄弟docker。 这意味着我的EC2实例应该运行2个容器: 我的应用程序,由ECS维护 我的应用程序决定运行的docker映像 如何实现这样的设置?ECS支持这个吗?我有一些想法。我不知道这些是否有效,但我写它作为一个答案,因为它相当

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

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

  • 我的应用程序,由ECS维护
  • 我的应用程序决定运行的docker映像

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

    我有一些想法。我不知道这些是否有效,但我写它作为一个答案,因为它相当长

    一个想法

    容器A:始终运行的容器。 容器X:各种不同容器中的一种,它们并不总是在运行

    首先为a和所有不同类型的X定义任务定义

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

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

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

    两者都有问题


    我在关于资源分配的评论中得到的意思是,无论您如何做,如果您是负载平衡容器A,负载平衡器都无法知道他们路由到的容器A没有能力启动其他容器X。假设一个EC2实例有4CPU和8GBs的RAM,而容器A使用了其中的一半。假设一个容器X使用1个CPU和2GB的RAM。一旦两个容器X同级在同一个实例上运行,就没有更多的启动空间,但是负载平衡器在将用户流量路由到容器A时不会知道这一点。希望这是有意义的。因此,您可能需要将面向公众的接口提取到一个不做任何其他事情的容器,如lambda等。这一层可以知道哪个容器实例有空闲容量来启动容器Xs。

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