Docker和netstat:netstat没有显示docker容器公开的端口

我使用类似的东西将我的contaner的docker端口暴露给主机

docker run -p 80:80 ... 

那么我尝试使用netstat来显示所有的侦听端口,例如:

 netstat -at 

奇怪的是,netstat不会显示我的Docker容器与暴露的端口,虽然他们正在侦听和答复浏览器。

如何让netstat显示那些暴露的端口?


更新:我在Debian 8 Jessie上运行。 这就是我所做的:

 docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9dfa08bab50d workflows-nginx "/bin/sh -c '/usr/sbi" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp workflows-nginx d0b0c3f90f13 workflows-django "/bin/sh -c 'python /" 7 hours ago Up 3 hours 0.0.0.0:8000->8000/tcp workflows-django 99a857c92533 workflows-db "/docker-entrypoint.s" 7 hours ago Up 3 hours 5432/tcp workflows-db 

这里docker报告容器端口被转发到主机。 而且,如果我停止了workflows-nginx容器,它会停止通过http(端口80)来回答浏览器。 如果我再次启动它,它会再次启动响应。

这里是sudo netstat -at | less的输出 sudo netstat -at | less

 Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 *:ssh *:* LISTEN tcp 0 0 localhost:ipp *:* LISTEN tcp 0 0 *:15672 *:* LISTEN tcp 0 0 *:postgresql *:* LISTEN tcp 0 0 localhost:smtp *:* LISTEN tcp 0 0 *:25672 *:* LISTEN tcp 0 0 *:48142 *:* LISTEN tcp 0 0 *:sunrpc *:* LISTEN tcp 0 0 *:epmd *:* LISTEN tcp 0 0 bob-acer:34866 104.16.33.249:http ESTABLISHED tcp 0 0 bob-acer:42380 stackoverflow.com:https ESTABLISHED tcp 0 0 bob-acer:42543 stackoverflow.com:https ESTABLISHED tcp 0 0 bob-acer:42525 stackoverflow.com:https ESTABLISHED tcp 0 0 bob-acer:44076 stackoverflow.com:https ESTABLISHED tcp 0 0 bob-acer:42944 stackoverflow.com:https ESTABLISHED tcp 0 0 localhost:epmd localhost:50831 ESTABLISHED tcp 0 0 bob-acer:42655 stackoverflow.com:https ESTABLISHED tcp 0 0 bob-acer:42384 stackoverflow.com:https ESTABLISHED tcp 0 0 bob-acer:44626 stackoverflow.com:https ESTABLISHED tcp 0 0 bob-acer:42390 stackoverflow.com:https ESTABLISHED tcp 0 0 localhost:50831 localhost:epmd ESTABLISHED tcp 0 0 bob-acer:48301 c2.52.c0ad.ip4.st:https ESTABLISHED tcp 0 0 bob-acer:42151 stackoverflow.com:https ESTABLISHED tcp 0 0 bob-acer:42205 stackoverflow.com:https ESTABLISHED tcp 0 0 bob-acer:42539 stackoverflow.com:https ESTABLISHED tcp 0 0 bob-acer:44737 stackoverflow.com:https ESTABLISHED tcp 0 0 bob-acer:39648 77.94.164.251:https ESTABLISHED tcp6 0 0 [::]:ssh [::]:* LISTEN tcp6 0 0 localhost:ipp [::]:* LISTEN tcp6 0 0 [::]:postgresql [::]:* LISTEN tcp6 0 0 localhost:smtp [::]:* LISTEN tcp6 0 0 [::]:44794 [::]:* LISTEN tcp6 0 0 [::]:8000 [::]:* LISTEN tcp6 0 0 [::]:amqp [::]:* LISTEN tcp6 0 0 [::]:sunrpc [::]:* LISTEN tcp6 1 0 localhost:58497 localhost:ipp CLOSE_WAIT 

正如你所看到的,没有报告端口80和端口443。 workflows-django端口8000由于某种原因在IPv6接口上打开。 而且,我忘了在主机上禁用postgres,并且仍然不会和postgres容器的workflows-db相冲突。

一切都在我的本地笔记本上运行,所以我想不能和主机混淆。

我的docker版本是:

 docker --version Docker version 1.10.3, build 20f81dd 

更新2:这与docker EXPOSE参数有关。 如果您在dockerfile中写入此行并使用-p运行容器,则端口将在netstat中可见。 如果您使用-p但不写入EXPOSE,则您的端口将不会被netstat列出。

netstat应该显示暴露的端口。 这是一个例子

 anovil@anovil-Latitude-E6440:docker$ sudo netstat -at|grep 3030 anovil@anovil-Latitude-E6440:docker$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES anovil@anovil-Latitude-E6440:docker$ docker run -d -p 3030:80 httpd:2.4 4310ac5fbdbc7314ab4d23e34099a710a3a8790dcf2c6d0a84202c1de5c9fd30 anovil@anovil-Latitude-E6440:docker$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4310ac5fbdbc httpd:2.4 "httpd-foreground" 3 minutes ago Up 3 minutes 0.0.0.0:3030->80/tcp hungry_fermat anovil@anovil-Latitude-E6440:docker$ sudo netstat -at|grep 3030 tcp6 0 0 [::]:3030 [::]:* LISTEN anovil@anovil-Latitude-E6440:docker$ sudo netstat -tulpn|grep 3030 tcp6 0 0 :::3030 :::* LISTEN 10294/docker-proxy anovil@anovil-Latitude-E6440:docker$ 

您需要validation自己的一些基本的东西:

  1. 你是否用提升的权限运行netstat? 当你非root时,有些东西可能会漏掉
  2. 您的docker容器是否在您所期望的相同的主机上运行? 用docker ps检查
  3. docker ps是否列出端口转发? 像上面这样,你应该可以看到类似于0.0.0.0:3030->80/tcp东西

另请注意,docker-proxy是在主机上运行的代理。 上面的所有命令都假定你在linux上运行。 这是testing与Ubuntu 15.10

如果你仍然觉得你错过了转发,那么请回到你的操作系统,docker版本等。

谢谢,