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自己的一些基本的东西:
- 你是否用提升的权限运行netstat? 当你非root时,有些东西可能会漏掉
- 您的docker容器是否在您所期望的相同的主机上运行? 用
docker ps
检查 -
docker ps
是否列出端口转发? 像上面这样,你应该可以看到类似于0.0.0.0:3030->80/tcp
东西
另请注意,docker-proxy是在主机上运行的代理。 上面的所有命令都假定你在linux上运行。 这是testing与Ubuntu 15.10
如果你仍然觉得你错过了转发,那么请回到你的操作系统,docker版本等。
谢谢,