我想在一个 ECS 任务中运行两个容器。
容器 1 应使用默认的 docker 网络模式运行
bridge
。
容器 2 应使用第一个容器的网络堆栈。使用 docker run 可以像
docker run --network container:container1 container2
那样完成。
我看不到在 CloudFormation 模板中设置此选项的任何可能性,因为仅为整个任务指定了网络模式。
我已经尝试在本地环境中运行所有内容,即
docker run
两个容器相继运行。这个效果很好。
我无法尝试使用 AWS 进行任何操作,因为我不知道在哪里可以定义我想要的网络模式。我阅读了以下文档:
遗憾的是,没有任何东西能指引我走向我想要的设置方向。
有人知道这是如何运作的吗?这在 AWS 上是否可能/有意做到?那么还有什么替代方案呢?
ECS 没有提供一种直接的方法来通过 CloudFormation 直接设置一个容器的网络模式以使用另一个容器的网络堆栈(即 Docker CLI 中的
--network container:<container_name>
)。 ECS 任务定义的 networkMode
属性适用于任务中的所有容器。
实现这一目标的几种方法:
使用主机联网模式: 如果您将 ECS 任务定义设置为使用
host
网络模式,则任务中的所有容器将共享 EC2 主机实例的网络命名空间。虽然这确实使容器能够共享网络堆栈,但它不仅限于这两个容器,因此如果考虑容器之间的隔离,它可能并不理想。
AWS VPC 模式下的共享网卡: 当您使用
awsvpc
网络模式时,每个任务都会获得自己的弹性网络接口 (ENI) 和私有 IP 地址。尽管这不允许一个容器利用另一个容器的确切网络堆栈,但它确实为每个任务提供了自己的网络命名空间。它提供比 host
模式更好的隔离。如果您可以重新思考或重新设计您的架构以利用 awsvpc
模式,从长远来看可能是有益的,尤其是在云环境中。
Service Mesh 与 App Mesh: 如果您的主要目标是在容器或服务之间进行通信,您可以考虑使用 AWS App Mesh。 App Mesh 是一个服务网格,它提供应用程序级网络,使您的服务可以轻松地跨多种类型的计算基础设施相互通信。虽然它不能为您的问题提供准确的解决方案,但它可以让您更好地控制服务之间的通信。