Docker AWS ECS容器未连接,但在我的本地机器上运行良好

Docker AWS ECS容器未连接,但在我的本地机器上运行良好,docker,docker-compose,amazon-cloudformation,amazon-ecs,Docker,Docker Compose,Amazon Cloudformation,Amazon Ecs,我有一个应用程序(在运行)与在运行的后端api对话。我已经分别对前端和后端进行了停靠,并通过docker compose本地运行它们,可以完美地工作,没有任何问题。但是,当我在ECS上运行时,前端找不到 我正在使用一个带有弹性负载平衡器的自动缩放组,并且在单个任务定义中定义了两个容器。此外,我有后端链接到前端。当我ssh到我的ECS实例并运行docker ps-a时,我可以看到我的两个容器都在正确的端口上运行,就像在我的本地机器()中一样,并且我可以成功地将它们从一个容器ping到另一个容器 任

我有一个应用程序(在运行)与在运行的后端api对话。我已经分别对前端和后端进行了停靠,并通过docker compose本地运行它们,可以完美地工作,没有任何问题。但是,当我在ECS上运行时,前端找不到

我正在使用一个带有弹性负载平衡器的自动缩放组,并且在单个任务定义中定义了两个容器。此外,我有后端链接到前端。当我ssh到我的ECS实例并运行
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 instacne安全组入口规则:

"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网络模式和应用程序负载均衡器进行了尝试。仍然不起作用


提前感谢。

您在ECS上使用的是哪种Docker网络模式(Brdige/Host)?。我认为,localhost无法在ECS容器上正常工作。我也有同样的问题,所以我使用EC2主机的私有IP或DNS名称作为临时测试目的。Ex-

注意-请确保提供安全组规则以允许来自EC2内的8081流量(编辑EC2安全组以允许来自与源相同的sgid的8081流量)

对于生产部署,我建议使用服务发现来识别ECS上的后端服务(由Hashicorp提供的Consor)或AWS专用服务发现


--更新--

由于您在同一任务定义下(在同一ECS服务下)运行两个容器,因此通常ECS会将两个docker容器带到同一主机上。做一些如下的事情

  • 默认情况下,ECS在Linux上使用桥接模式带来容器
  • 您应该能够让每个容器在Linux上使用Docker Gateway IP-172.17.0.1进行通信。因此,对于您的情况,请尝试配置

  • 您可以远程登录端口吗?@JogendraKumar Nop,我无法将端口从一个容器远程登录到另一个容器。@thishandp7您是否尝试过通过DNS名称调用另一个容器(意思是通过容器名称)@karansharma我不知道如何通过DNS名称或容器名称调用容器。你能给我举个例子让我试着让你知道吗?谢谢,说得好。但我使用的是自动缩放组。因此,我认为在cloudformation中获取特定实例的私有IP或DNS名称是不可能的。我尝试通过一个环境变量传递elb的DNS,但也没有帮助。当我ssh到我的EC2实例中时,我可以看到我的两个容器都以0.0.0.0/运行,这是EC2实例内部的localhost。所以从技术上来说,我认为这不应该是一个问题。我已经尝试了两种网络模式。我甚至试过awsvpc。但是没有用。我在同一个任务定义中定义了这两个容器。我还需要进行服务发现吗?@thishandp7因为您在同一任务定义下运行两个容器(在同一ECS服务下),所以通常ECS会将两个docker容器带到同一主机上。做一些如下的事情。1.默认情况下,ECS在Linux上使用桥接模式带来容器。2.您应该能够让每个容器在Linux上使用Docker Gateway IP-172.17.0.1进行通信。3.因此,对于您的情况,请尝试在前端服务下进行配置,并让我知道结果。我在我的个人工作空间中进行了上述测试,结果成功了。请让我知道,如果它为你工作,然后我会更新答案。这工作!我可以从前端服务容器中获取正确的数据,但当我在前端应用程序中执行提取调用时,它无法连接到后端。但我认为你的回答足以回答这个问题。我想我应该为问题一提出一个新问题。你可以继续更新你的答案。我会标记为正确。非常感谢您的解决方案。这也适用于
    主机
    网络。非常感谢您为我的单节点ecs“群集”省去了使用服务发现的麻烦