将 Docker 部署到 AWS Elastic Beanstalk——如何将端口转发到主机? (端口绑定)
Deploying Docker to AWS Elastic Beanstalk -- how to forward port to host? (port binding)
我有一个用 CircleCI 设置的项目,我正在使用它 auto-deploy to Elastic Beanstalk。我的 EBS 环境是一个单一容器、自动缩放的 Web 环境。我正在尝试 运行 监听原始套接字端口 8080 的服务。
我的Docker文件:
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"
}
]
}
我已确保在分配给我的项目环境的 "role" 上公开端口 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,
如何在我的应用程序中触发端口绑定?
提前致谢。
原来我误解了 Docker 的网络堆栈是如何工作的。当端口暴露但未发布时,它仍然可以通过 Docker 容器的私有 IP 地址供本地网络接口使用。您可以通过检查docker inspect <container>
.
来获取此IP地址
我可以 curl <containerIP>:8080
.
而不是 curl localhost:8080
在我的 EBS 部署中,nginx 自动设置为将 (HTTP) 流量从端口 80 转发到此内部专用端口。
默认情况下,我在 rails 容器(使用 puma 的端口 3000)中遇到了同样的问题 rails server 仅绑定 localhost 到监听界面,我不得不使用 -b 选项绑定 0.0.0.0 并解决了问题。
在反应中我没有同样的问题因为 npm serve 包默认绑定所有接口
我有一个用 CircleCI 设置的项目,我正在使用它 auto-deploy to Elastic Beanstalk。我的 EBS 环境是一个单一容器、自动缩放的 Web 环境。我正在尝试 运行 监听原始套接字端口 8080 的服务。
我的Docker文件:
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"
}
]
}
我已确保在分配给我的项目环境的 "role" 上公开端口 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,
如何在我的应用程序中触发端口绑定?
提前致谢。
原来我误解了 Docker 的网络堆栈是如何工作的。当端口暴露但未发布时,它仍然可以通过 Docker 容器的私有 IP 地址供本地网络接口使用。您可以通过检查docker inspect <container>
.
我可以 curl <containerIP>:8080
.
curl localhost:8080
在我的 EBS 部署中,nginx 自动设置为将 (HTTP) 流量从端口 80 转发到此内部专用端口。
默认情况下,我在 rails 容器(使用 puma 的端口 3000)中遇到了同样的问题 rails server 仅绑定 localhost 到监听界面,我不得不使用 -b 选项绑定 0.0.0.0 并解决了问题。
在反应中我没有同样的问题因为 npm serve 包默认绑定所有接口