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

Posted

技术标签:

【中文标题】将 Docker 部署到 AWS Elastic Beanstalk——如何将端口转发到主机? (端口绑定)【英文标题】:Deploying Docker to AWS Elastic Beanstalk -- how to forward port to host? (port binding) 【发布时间】:2015-11-25 20:52:29 【问题描述】:

我有一个使用 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"
    
  ]

我已确保在分配给我的项目环境的“角色”上公开端口 8080。

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

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

以下是通过 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

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

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

    "PortBindings": ,
    "PublishAllPorts": false,

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

提前致谢。

【问题讨论】:

【参考方案1】:

事实证明,我对 Docker 的网络堆栈的工作方式产生了误解。当一个端口被暴露但未发布时,它仍然可以通过 Docker 容器的私有 IP 地址访问本地网络接口。您可以通过查看docker inspect &lt;container&gt;获取此IP地址。

我可以做curl &lt;containerIP&gt;:8080,而不是curl localhost:8080

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

【讨论】:

【参考方案2】:

默认情况下,我在 rails 容器(使用 puma 的端口 3000)中遇到了同样的问题 rails server 只将 localhost 绑定到监听接口,我必须使用 -b 选项来绑定 0.0.0.0 并解决了问题。

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

【讨论】:

以上是关于将 Docker 部署到 AWS Elastic Beanstalk——如何将端口转发到主机? (端口绑定)的主要内容,如果未能解决你的问题,请参考以下文章

如何将具有多个 Docker 容器的应用程序部署到 AWS Elastic Beanstalk?

sh 构建Docker镜像,将其推送到AWS EC2 Container Registry,然后将其部署到AWS Elastic Beanstalk

是否建议将 Docker 与 AWS Elastic beanstalk 一起使用?

使用 Docker 的开发环境并部署到 AWS Elastic Beanstalk

将映像从 aws ecr 部署到 aws elastic beanstalk

带有 docker 的 AWS Elastic Beanstalk 版本不正确