AWS ECS容器未连接,但可以在我的本地计算机上完美运行

时间:2018-07-05 06:20:20

标签: docker docker-compose amazon-cloudformation amazon-ecs

我有一个应用程序(运行在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网络模式下进行了尝试。仍然无法正常工作

谢谢。

1 个答案:

答案 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容器都放在同一主机上。做类似的事情。

  1. 默认情况下,ECS在Linux上使用Bridge模式带来容器。
  2. 您应该能够使每个容器使用Docker Gateway IP-在Linux上为172.17.0.1进行通信。因此,对于您的情况,请尝试配置http://172.17.0.1:8081