在AWS Fargate中连接容器

47

我试着在AWS Fargate上搭建一个简单的示例,并尝试将一个应用程序容器与一个数据库容器放置在其中。

任务定义启动了两个容器,但我的应用程序容器失败并显示错误信息:getaddrinfo ENOTFOUND db db:3306。因此,我的应用程序容器无法找到数据库容器。

由于Fargate不允许Docker容器之间的"链接",我想知道它们如何相互通信。数据库容器的名称为db,端口为3306,我的应用程序容器配置为使用此端口。

不幸的是,在Fargate中没有可用于容器链接的选项,只有在"oldschool" ECS/EC2 中才有。

在本地的docker-compose设置中,它以这种方式工作。


但是你是如何解决问题的呢?根据你所接受的答案,你不需要做任何改变。 - OK999
3
在我的部署应用中,我尝试将数据库引用为“db:3306”。当我部署应用和数据库,并使用“localhost:3306”(而不是服务名称)引用数据库时,它可以正常工作。 - sebastian
3个回答

75

Fargate任务中的容器共享网络命名空间,因此您根本不需要使用链接。 您可以通过localhost进行简单通信。

例如,如果容器A在端口8000上运行Web服务器,则容器B可以使用curl http://localhost:8000/访问它。


谢谢,非常有用! - Gonzalo Bahamondez
@Noah 你如何在CloudFormation中指定这个? - Sangam Belose
1
@toske 你需要将其中一个服务移动到不同的端口。或者,理论上,如果你想让其中一个服务暴露在本地主机上,而另一个服务暴露在网络上,你可以显式地将一个绑定到127.0.0.1,将另一个绑定到不同的地址。 - Noah
1
@SangamBelose,你不需要在CloudFormation中指定任何内容。'awsvpc'模式,无论是在ECS还是Fargate中,都意味着共享网络命名空间(例如共享本地主机)。 - Noah
3
更多来自AWS的信息 - https://aws.amazon.com/blogs/compute/task-networking-in-aws-fargate/ - Son Lam
显示剩余2条评论

2

-4

你可以设置服务之间可以通过公共IP地址进行通信,然后使用VPC保护端口,只有服务之间可以相互通信。


2
在构建容器时,您如何知道公共IP地址?您可以先分配EIP,然后将其附加到Fargate。我认为您无法...使用本地主机(localhost)更容易! - Max Allan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接