ECS上EC2上的两个容器在同一任务中的双向通信



我正在尝试在EC2实例上配置ECS任务。任务定义中的网络模式为Bridge

我的任务里面有两个容器,它们应该相互通信。例如:ContainerA向ContainerB发出请求,ContainerB向ContainerA发出请求。

当我使用docker-compose时,一切都很好,容器可以通过它们的名称进行通信。但是当我在ECS上部署时,这些容器看不到彼此。在一定程度上,我可以使用任务定义中的链接来解决这个问题,但是,它只在一个方向上工作,我的意思是,如果为两个容器设置链接,我在创建任务定义期间收到这样的错误消息:

无法创建任务定义web应用程序的新版本:12容器链接不应该有循环

如果能听到你的想法,我错过了什么,如果真的有可能,那就太好了。老实说,我认为一个任务中的容器应该通过容器名称自动通信,特别是当它们在同一个桥接网络下时。

我知道有一个服务发现特性允许两个服务之间通过名称进行通信,但是,我仍然更喜欢一个服务和任务内部有两个容器。

谢谢你的帮助。

ContainerA NETWORK SETTINGS

如果两个容器定义在同一个任务定义中,则可以通过localhost:

例如,如果ContainerA在8081端口侦听,ContainerB在8082端口侦听,它们可以简单地通过以下方式相互通信:

localhost:8081
localhost:8082

旁注:与Kubernetes pod中有两个容器的概念相同-它们可以通过localhost访问

编辑:这与awsvpc网络模式相关,你可以在文档中看到:

属于同一任务的

容器可以通过主机接口

docker-compose默认使用的不是bridge网络,而是自定义网络。这是通过服务名来寻址的:

默认情况下,Compose为你的应用程序设置了一个单独的网络。服务的每个容器都加入默认网络,并且可以被该网络上的其他容器访问,并且可以被它们以与容器名称相同的主机名发现。

https://docs.docker.com/compose/networking/

ECS EC2默认使用链接,Docker不支持链接,也不支持循环。

不幸的是,尽管存在一个长期存在的问题,但AWS不支持用户定义的网络:https://github.com/aws/containers-roadmap/issues/184

这就是我目前所知道的。我想唯一的选择是使用awsvpc网络模式,允许容器通过localhost进行通信(我觉得相当尴尬):

这意味着任务中的所有容器都可以通过弹性网络接口的IP地址寻址,并且它们可以通过本地主机接口相互通信。

https://aws.amazon.com/blogs/compute/under-the-hood-task-networking-for-amazon-ecs/

相关内容

  • 没有找到相关文章

最新更新