我已经有一个ECS群集设置,其中包含在ECS容器实例上运行我的应用程序的任务。 现在,给定一个docker镜像,我需要能够从我的应用程序内部运行它,并且它必须在我的应用程序运行的相同EC2实例上运行。
我读到不建议在docker中运行docker,最好的做法是创建一个兄弟码头。 这意味着我的EC2实例应该运行2个容器:
如何实现这样的设置? ECS是否支持这个?
答案 0 :(得分:1)
我有几个想法。我不知道这些是否有效,但我把它写成答案,因为它很长!
一个想法
容器A:始终在运行的容器。 容器X:各种不同容器中的一种,并不总是在运行。
首先为A和所有不同类型的X定义任务定义。
运行任务时可以做的一件事是指定某些约束。在容器A上,您可以使用API来确定容器正在运行的EC2实例,然后在运行其中一种X类型的任务时将其指定为约束。
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-constraints.html
你可能会尝试运行不可能出现约束的任务(如果实例已经完全提交了资源),但至少你会收到错误。
更简单的想法 让容器A任务为自己预留足够的资源加上一定数量的容器X.然后通过将docker socket安装在容器内并与之通信来手动启动实例。您必须手动确保没有过度使用资源。
两者的问题
我在关于资源分配的评论中得到的是,无论你这样做,如果你负载均衡容器A,负载均衡器无法知道他们路由到的容器A没有旋转的能力额外的容器Xs。假设EC2实例具有4CPU和8GB的RAM,而容器A使用其中一半。让我们说容器X使用1个CPU和2GB的RAM。一旦2个容器X兄弟姐妹在同一个实例上运行,就没有可以启动的余地,但负载均衡器在将用户流量路由到容器A时不会知道。希望这是有意义的。因此,您可能需要将面向公众的接口提取到不执行任何其他操作的容器,lambda等。此层可以知道哪个容器A实例具有启动容器X的备用容量。