我有一个应用程序(运行在http://localhost:8080),该应用程序与运行在http://localhost:8081的后端api对话。我已经分别对前端和后端进行了docker化,并通过docker-compose在本地运行它们,效果很好,没有任何问题。但是,当我在ECS中运行它时,前端找不到http://localhost:8081(backend)。
我正在使用带有弹性负载均衡器的AutoScaling组,并且我的两个容器都在一个“任务定义”中定义。另外,我有后端链接到前端。当我使用SSH进入ECS实例并运行docker ps -a
时,我可以看到我的两个容器都在正确的端口上运行,就像在本地计算机(Result of docker ps -a)中一样,而且我可以从一个端口ping通它们另一个容器。
任务定义
"CartTaskDefinition": {
"Type": "AWS::ECS::TaskDefinition",
"Properties": {
"ContainerDefinitions": [
{
"Name": "cs-cart",
"Image": "thishandp7/cs-cart",
"Memory": 400,
"PortMappings":[
{
"ContainerPort": "8080",
"HostPort": "8080"
}
],
"Links": [
"cs-server"
]
},
{
"Name": "cs-server",
"Image": "thishandp7/cs-server",
"Memory": 450,
"PortMappings":[
{
"ContainerPort": "8081",
"HostPort": "8081"
}
],
}
]
}
}
ElasticLoadBalancer中的侦听器, 第一个监听器用于前端,第二个监听器用于后端
"Listeners" : [
{
"LoadBalancerPort": 80,
"InstancePort": 8080,
"Protocol": "http"
},
{
"LoadBalancerPort": 8081,
"InstancePort": 8081,
"Protocol": "tcp"
}
],
EC2即时安全组入口规则:
"SecurityGroupIngress" : [
{
"IpProtocol" : "tcp",
"FromPort" : 8080,
"ToPort" : 8080,
"SourceSecurityGroupId" : { "Ref": "ElbSecurityGroup" }
},
{
"IpProtocol" : "tcp",
"FromPort" : 8081,
"ToPort" : 8081,
"SourceSecurityGroupId" : { "Ref": "ElbSecurityGroup" }
},
{
"IpProtocol" : "tcp",
"FromPort" : 22,
"ToPort" : 22,
"CidrIp" : "0.0.0.0/0"
}
],
Docker Compose
version: "3.5"
services:
cart:
build:
context: ..
dockerfile: docker/Dockerfile
args:
APP_LOCATION: /redux-saga-cart/
PORT: 8080
networks:
- server-cart
ports:
- 8080:8080
depends_on:
- server
server:
build:
context: ..
dockerfile: docker/Dockerfile
args:
APP_LOCATION: /redux-saga-shopping-cart-server/
PORT: 8081
ports:
- 8081:8081
networks:
- server-cart
networks:
server-cart:
快速更新:我已经在带有应用程序负载平衡器的awsvpc网络模式下进行了尝试。仍然无法正常工作
谢谢。
答案 0 :(得分:0)
您在ECS上使用哪种Docker网络模式(Brdige / Host)?我认为 localhost 在ECS容器上不能正常工作。我遇到了同样的问题,因此我使用EC2主机的私有IP或DNS名称进行通讯是出于临时测试的目的。例如-http://10.0.1.100:8081。
注意-请确保提供安全组规则以允许来自EC2内部的8081流量(编辑EC2安全组以允许来自源的同一sgid中的8081)。
对于生产部署,我建议使用服务发现在ECS上标识后端服务(Hashicorp的Consul)或AWS私有服务发现。
-更新-
由于您在相同的任务def(在相同的ECS服务下)下运行两个容器,因此通常ECS会将两个docker容器都放在同一主机上。做类似的事情。