当前位置: 首页 > 知识库问答 >
问题:

Docker和netstat:netstat不显示端口,由docker容器公开

赵明亮
2023-03-14

我向主机公开contaners的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在此报告将容器端口转发到主机。此外,如果我停止工作流nginx容器,它将停止通过http(端口80)响应浏览器。如果我再次启动它,它会再次开始响应。

这是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。由于某种原因,在IPv6接口上打开了工作流django的8000端口。此外,我忘了在主机上禁用postgres,但它们仍然不会与postgres容器、工作流数据库发生冲突。

所有的东西都在我本地的笔记本上运行,所以我想不会与主机有任何混淆。

我的docker版本是:

docker --version
Docker version 1.10.3, build 20f81dd

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

共有3个答案

陆宏扬
2023-03-14

此代码将向您显示打开的端口以及容器内的PID:

container_name=some_container_name
c_pid=`docker container inspect -f "{{.State.Pid}}" ${container_name}`
nsenter -t ${c_pid} -n netstat -anp
公良阳波
2023-03-14

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$ 

您需要验证自己的一些基本情况:

  1. 您是否使用提升的权限运行netstat?当你不是root时,有些东西可能会错过
  2. docker容器是否与预期的运行在同一主机上?与docker ps核对
  3. docker ps是否列出端口转发?正如上面所述,您应该能够看到类似这样的内容0.0.0.0:3030-

还要注意,docker代理是在主机上运行的代理。以上所有命令都假定您在linux上运行。这是用ubuntu 15.10测试的

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

谢谢

沈成天
2023-03-14

回答问题永远不嫌晚。

使用netstat-tln,而不是netstat-at。

如果您通知netstat--numic选项,答案非常简单。通过使用此选项,netstat将使用数字而不是有意义的字符串打印地址。然后您可以按照您提到的那样grep它们。下面展示了它的工作原理。

[root@A01-R26-I52-155-3002023 ~]# netstat -tl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 localhost.localdom:smux 0.0.0.0:*               LISTEN     
tcp        0      0 localhost.localdo:18121 0.0.0.0:*               LISTEN     
tcp        0      0 localhost.localdo:18122 0.0.0.0:*               LISTEN     
tcp        0      0 localhost.localdo:18123 0.0.0.0:*               LISTEN     
tcp        0      0 localhost.localdo:18124 0.0.0.0:*               LISTEN     
tcp        0      0 localhost.localdo:18125 0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:sunrpc          0.0.0.0:*               LISTEN     
tcp        0      0 localhost.localdo:18928 0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:20080           0.0.0.0:*               LISTEN     
tcp        0      0 A01-R26-:univ-appserver 0.0.0.0:*               LISTEN     
tcp        0      0 A01-R26-:univ-appserver 0.0.0.0:*               LISTEN     
tcp        0      0 localhost.:search-agent 0.0.0.0:*               LISTEN     
tcp        0      0 localhost:mosaicsyssvc1 0.0.0.0:*               LISTEN     
tcp        0      0 A01-R26-I52-155-300:ssh 0.0.0.0:*               LISTEN     
tcp6       0      0 [::]:37611              [::]:*                  LISTEN     
tcp6       0      0 [::]:sunrpc             [::]:*                  LISTEN     
tcp6       0      0 [::]:microsan           [::]:*                  LISTEN     
tcp6       0      0 [::]:commtact-http      [::]:*                  LISTEN     
[root@A01-R26-I52-155-3002023 ~]# netstat -tln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 127.0.0.1:199           0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:18121         0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:18122         0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:18123         0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:18124         0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:18125         0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:18928         0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:20080           0.0.0.0:*               LISTEN     
tcp        0      0 10.217.52.155:1233      0.0.0.0:*               LISTEN     
tcp        0      0 10.218.52.155:1233      0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:1234          0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:1235          0.0.0.0:*               LISTEN     
tcp        0      0 10.217.52.155:22        0.0.0.0:*               LISTEN     
tcp6       0      0 :::37611                :::*                    LISTEN     
tcp6       0      0 :::111                  :::*                    LISTEN     
tcp6       0      0 :::20001                :::*                    LISTEN     
tcp6       0      0 :::20002                :::*                    LISTEN
 类似资料:
  • 我正在尝试创建一个Docker容器,它的作用就像一个完整的虚拟机。我知道我可以使用Dockerfile中的EXPOSE指令来公开端口,并且我可以使用标志和来分配端口,但是一旦容器实际运行,是否有命令来实时打开/映射其他端口? 例如,假设我有一个正在运行sshd的Docker容器。另一个使用容器SSH的人安装了httpd。有没有一种方法可以公开容器上的端口80,并将其映射到主机上的端口8080,这样

  • 问题内容: 我正在尝试创建一个行为像完整虚拟机的Docker容器。我知道我可以在Dockerfile中使用EXPOSE指令公开端口,并且可以使用标志来分配端口,但是一旦容器实际运行,是否有命令打开/映射其他端口? 例如,假设我有一个运行sshd的Docker容器。有人使用ssh容器安装了httpd。有没有办法公开容器上的端口80并将其映射到主机上的端口8080,以便人们可以访问容器中运行的Web服

  • 我在CentOS docker主机上有一个CentOS docker容器。当我使用此命令运行docker映像,docker容器获得主机的IP,但没有分配给它的端口。 如果运行相同的命令而不使用“--net=host”,docker会公开端口,但使用不同的IP。docker版本为1.10.1。我希望docker容器具有与暴露端口的主机相同的IP。我还在中提到了指令,但当命令中提到“--net=hos

  • 主机:Mac OS X 10.10.5 Docker 1.10.1 我做过这样的事: 步骤1:为永久postgres数据创建卷 -->没有打开端口5432 更新2:更陌生。我也这样做过: 阻止Docker。然后,在我的主机中运行一个普通的PostgreSQL 9.4.4实例(这里不涉及docker,只在Mac OS X主机中运行postgres,监听端口5432)。一切正常: 为什么? 有道理吗?

  • 问题内容: 我在Docker中设置了一个简单的节点服务器。 Docker文件 example.js 现在建立图像 现在在容器中运行 验证容器正在运行并且端口已映射: 现在,让我们附加到容器并验证服务器是否在其中运行: 并在容器命令行中输入: 看起来不错吧? 问题 当我在主机上执行相同的curl命令(或使用浏览器导航到http:// localhost:1337 )时,什么都看不到。 知道为什么容器

  • 问题内容: 我在CentOS docker主机上有一个CentOS docker容器。当我使用此命令运行docker映像时,docker容器获取主机的IP,但没有为其分配端口。 如果我在不使用“ –net = host”的情况下运行相同的命令,则docker 将公开端口,但使用不同的IP。码头工人版本是1.10.1。我希望Docker容器具有与主机相同的IP,并具有暴露的端口。我在指令中也提到过,