无法访问已部署的beantalk多容器应用程序

时间:2019-07-25 21:38:45

标签: amazon-web-services docker amazon-elastic-beanstalk

我已经成功地在基于beantalk web的环境中部署了多容器docker映像(只有一个映像才能上手):

{
  "AWSEBDockerrunVersion": 2,
  "containerDefinitions": [
    {
      "name": "myApp",
      "image": "ecr-registry/myApp:latest",
      "memory": 512,
      "essential": true,
      "portMappings": [
        {
          "hostPort": 8080,
          "containerPort": 9000
        }
      ],
      "environment": [
      ]
    }
  ]
}

所有提取的beantalk日志显示一切正常。

我的应用在端口9000上记录了其成功启动。

Beanstalk docker ps日志显示我的容器已启动

CONTAINER ID        IMAGE                                                                     COMMAND                  CREATED             STATUS              PORTS                    NAMES
3638439d8678        ecr-registry/myApp:latest   "/bin/sh -c ./bin/ru…"   30 seconds ago      Up 29 seconds       0.0.0.0:8080->9000/tcp   <ecs random name>

一切都很好,但是我无法通过http://beanstalk_host/path

访问资源

我已经尝试过:

http://beanstalk_host:8080/path
http://ec2-ip:8080/path
http://beanstalk_host/path

回复始终为“ 无法获得任何回复”。我已经删除了“ hostPort”:8080端口映射,以便让beastalk创建一个随机端口,但也没有成功。

当我将多容器更改为单容器json配置时,我可以成功访问端点http://beanstalk_host/path

{
    "AWSEBDockerrunVersion": "1",
    "Image": {
        "Name": "ecr-registry/myApp:latest",
        "Update": "true"
    },
    "Ports": [
        {
            "ContainerPort": "9000"
        }
    ]
}

我还可以使用以下docker compose在本地成功运行应用程序:

version: '3'
services:
  myService:
    build: .
    image: ecr-registry/myApp:latest
    container_name: myApp
    ports:
      - 8080:9000

我想运行多容器配置,但没有成功。

谁经历过类似的事情?

1 个答案:

答案 0 :(得分:0)

我刚发现问题。

Elastic Beanstalk允许2种Docker部署类型:单容器和多容器。两种环境的部署都由Dockerrun.aws.json上传触发。

  • 运行Single Container应用程序的ec2实例启动一个侦听端口80的nginx实例( ps U根| grep nginx ),并将请求重定向到一个随机的docker hostPort端口,该端口是在ec2实例启动时生成。这就是为什么Single Containers部署不需要在Dockerrun.aws.json文件中指定hostPort,而简单的端口80调用会将客户端重定向到所需的资源。

  • 运行“多容器”应用程序的ec2实例不会启动nginx。它强制我们在Dockerrun.aws.json文件中定义 hostPort 属性。并且应该与我的环境ec2安全组中配置的端口相同。这次我没有Nginx的帮助。因为我的Dockerrun.aws.json hostPort属性是8080,所以我无法访问我的宁静端点。解决了如下更改Dockerrun文件的问题:

{
  "AWSEBDockerrunVersion": 2,
  "containerDefinitions": [
    {
      "name": "restql-http-easysim",
      "image": "010984114721.dkr.ecr.us-east-1.amazonaws.com/restql-http-easysim:latest",
      "memory": 512,
      "essential": true,
      "portMappings": [
        {
          "hostPort": 80,   <----- this one was changed
          "containerPort": 9000
        }
      ],
      "environment": [
        { "name": "restql-config-file", "value": "restql.yml" },
        { "name": "PORT", "value": "9000" }
      ]
    }
  ]
}

再见