将Docker部署到AWS Elastic Beanstalk - 如何将端口转发到主机? (端口绑定)

时间:2015-08-31 18:35:18

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

我使用CircleCI设置了一个项目,我正在使用auto-deploy to Elastic Beanstalk。我的EBS环境是单个容器,自动扩展,Web环境。我正在尝试运行侦听原始套接字端口8080的服务。

我的Dockerfile:

FROM golang:1.4.2

...

EXPOSE 8080

我的Dockerrun.aws.json.template:

{
  "AWSEBDockerrunVersion": "1",
  "Authentication": {
    "Bucket": "<bucket>",
    "Key": "<key>"
  },
  "Image": {
    "Name": "project/hello:<TAG>",
    "Update": "true"
  },
  "Ports": [
    {
      "ContainerPort": "8080"
    }
  ]
}

我确保在&#34;角色&#34;上公开端口8080。分配到我的项目环境。

我使用了上面链接的CircleCI教程中的确切部署脚本(更改名称除外)。

在运行我的EBS应用程序的EC2实例中,我可以看到Docker容器已成功运行,但Docker没有将暴露的端口转发到主机容器。我在过去运行docker run ....而没有-P标志时遇到过这种情况。

以下是SSH进入计算机后的示例会话:

[ec2-user@ip-xxx-xx-xx-xx ~]$ sudo docker ps
CONTAINER ID        IMAGE                              COMMAND                CREATED             STATUS              PORTS               NAMES
a036bb061aea        aws_beanstalk/staging-app:latest   "/bin/sh -c 'go run    3 days ago          Up 3 days           8080/tcp            boring_hoover
[ec2-user@ip-xxx-xx-xx-xx ~]$ curl localhost:8080
curl: (7) Failed to connect to localhost port 8080: Connection refused

我希望看到的是->8080或容器中将其转发到主机上的任何内容。

当我在容器上docker inspect时,我也看到这两种配置不是我想要的:

    "PortBindings": {},
    "PublishAllPorts": false,

如何在我的应用程序中触发端口绑定?

提前致谢。

2 个答案:

答案 0 :(得分:3)

事实证明,我对Docker的网络堆栈如何工作产生了误解。当端口暴露但未发布时,仍可通过Docker容器的专用IP地址访问本地网络接口。您可以通过选中docker inspect <container>

来获取此IP地址

而不是curl localhost:8080我可以做curl <containerIP>:8080

在我的EBS部署中,nginx自动设置为将端口80的流量(HTTP)转发到此内部专用端口。

答案 1 :(得分:0)

默认情况下,我在Rails容器(使用puma的3000端口)中遇到了相同的问题。 rails服务器仅将 localhost 绑定到侦听界面,我不得不使用 -b 选项绑定 0.0.0.0 即可解决问题。

在反应中,我没有同样的问题,因为npm serve 软件包默认绑定所有接口