Amazon web services Amazon AWS ECS Docker端口未正确绑定

Amazon web services Amazon AWS ECS Docker端口未正确绑定,amazon-web-services,networking,docker,amazon-ecs,Amazon Web Services,Networking,Docker,Amazon Ecs,我正在使用ECS优化的ECS镜像,并使用ECS进行部署 因此,如果我猛击容器并curl localhost得到预期的输出(预期在端口80上),这就可以了 然后如果我运行docker ps 我得到以下输出 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 123

我正在使用ECS优化的ECS镜像,并使用ECS进行部署

因此,如果我猛击容器并
curl localhost
得到预期的输出(预期在端口80上),这就可以了

然后如果我运行
docker ps
我得到以下输出

CONTAINER ID   IMAGE                              COMMAND             CREATED             STATUS              PORTS                        NAMES
1234           orgname/imagename:release-v0.3.1   "npm start"         53 minutes ago      Up 53 minutes       0.0.0.0:80->80/tcp           ecs-myname-1234`
tcp        0      0 :::80                       :::*                        LISTEN      21299/docker-proxy  
这表明端口
80
正在按预期映射。(我也看到了亚马逊ECS代理,但上面的帖子并不重要)

然后我可以运行
netstat-tulpn | grep:80
,得到以下输出

(No info could be read for "-p": geteuid()=500 but you should be root.)
tcp        0      0 :::80                       :::*                        LISTEN      -  
sshd       2360     root    3u     IPv4              10256       0t0        TCP *:22 (LISTEN)
sshd       2360     root    4u     IPv6              10258       0t0        TCP *:22 (LISTEN)
sendmail   2409     root    4u     IPv4              10356       0t0        TCP 127.0.0.1:25 (LISTEN)
exe        2909     root    4u     IPv4              13802       0t0        TCP 127.0.0.1:51678 (LISTEN)
exe       21299     root    4u     IPv6              68069       0t0        TCP *:80 (LISTEN)
exe       26395     root    4u     IPv6              89357       0t0        TCP *:8080 (LISTEN)
然后作为root用户运行sudonetstat-tulpn | grep:80,得到以下输出

CONTAINER ID   IMAGE                              COMMAND             CREATED             STATUS              PORTS                        NAMES
1234           orgname/imagename:release-v0.3.1   "npm start"         53 minutes ago      Up 53 minutes       0.0.0.0:80->80/tcp           ecs-myname-1234`
tcp        0      0 :::80                       :::*                        LISTEN      21299/docker-proxy  
这让我觉得它只是在IPv6接口上监听?I作为localhost的主机记录是127.0.0.1,这就是为什么当我在主机上运行
curl localhost
curl 127.0.0.1
时,我得到
curl:(56)Recv失败:对等方重置连接

我还检查了安全组和网络ACL(并不是说它们应该对本地主机有影响)

任何想法都将不胜感激

编辑: 为了更好的衡量(有些人建议netstat在ipv6可用时只显示ipv6而不显示ipv4。我还运行了这个命令
lsof-OnP | grep LISTEN
给出了以下输出

(No info could be read for "-p": geteuid()=500 but you should be root.)
tcp        0      0 :::80                       :::*                        LISTEN      -  
sshd       2360     root    3u     IPv4              10256       0t0        TCP *:22 (LISTEN)
sshd       2360     root    4u     IPv6              10258       0t0        TCP *:22 (LISTEN)
sendmail   2409     root    4u     IPv4              10356       0t0        TCP 127.0.0.1:25 (LISTEN)
exe        2909     root    4u     IPv4              13802       0t0        TCP 127.0.0.1:51678 (LISTEN)
exe       21299     root    4u     IPv6              68069       0t0        TCP *:80 (LISTEN)
exe       26395     root    4u     IPv6              89357       0t0        TCP *:8080 (LISTEN)

我在使用
网桥
网络模式时遇到了这个问题。我还没有找到解决方案。但是,我使用了两种解决方法

权变措施 对我来说,最简单的方法是在我的ECS任务定义中将
NetworkMode
更改为
host

或者,您也可以使用
应用程序负载平衡器
,不必知道或关心端口是如何映射的

网络模式

bridge
通过docker代理将容器端口映射到主机上的另一个端口(可能不同)。这是我在ECS中遇到的问题

host
允许容器直接在主机上打开端口,而不需要代理。缺点是同一容器的实例不能在同一主机上运行,而不会导致端口冲突

awsvpc
类似于
host
,只是它映射到VPC中的ENI,而不是主机IP上的端口

none
就是它听起来的样子

应用程序负载平衡器

自从发布这个答案以来,我的项目的需求已经发生了变化。我没有机会回去直接在桥接模式下测试端口映射。但是,我现在使用应用程序负载平衡器来提供对容器的访问

当使用ALB时,您根本不必担心主机端口。相反,您的ECS服务会自动将您的容器作为目标添加到给定的ALB目标组中。本文档将详细介绍如何执行此操作:

这里没有详细说明,因为它不是关于端口绑定问题的直接答案


有趣的是,ECS的网络模式是在您提出问题5天后宣布的:

公告:

网络模式文档:


希望这个答案能对其他一些谷歌用户有所帮助。注意:如果我知道如何让
网桥
模式在ECS中正常工作,我会更新这个答案。

我有一个类似的问题,但我在docker中运行Java,它只绑定在IPv6端口上。结果是与Java相关的。这方面的更多信息对于Do来说似乎也是如此AWS的cker(完全相同)。你找到什么了吗?有没有可能,容器内的应用程序没有绑定到端口80?你有没有尝试从容器内检查它?像docker exec-it 1234?如果你能使用桥接模式,期待你的更新!