我正在尝试在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/