使用Docker时,ESTABLISHED连接不会出现在netstat中

use*_*178 14 sockets netstat docker

我有一个使用Docker 1.7.0在RHEL 7上运行的docker容器.在此容器中运行的程序侦听端口5000上的TCP连接.在我的Dockerfile中,我将句子EXPOSE 5000和我使用以下命令运行容器:

docker run \
--name myProgram \
--detach \
--publish 5000:5000 \
--volume /home/docker/apps/myProgram/logs:/var/log/myProgram/ \
--volume /home/docker/apps/myProgram/conf:/usr/local/snnotificationreceiver/conf/ \
--restart always \
10.167.152.15:5000/myProgram:1.0.0
Run Code Online (Sandbox Code Playgroud)

当我在主机上执行netstat时,我看到了LISTEN套接字:

[root@server bin]# netstat -naop | grep 5000
tcp6       0      0 :::5000                 :::*                    LISTEN      33595/docker-proxy   off (0.00/0/0)
Run Code Online (Sandbox Code Playgroud)

我可以通过连接到端口5000上的主机IP地址连接到应用程序,并且我发送给应用程序的数据到达.我知道这是因为我在应用程序日志中看到它,应用程序也通过套接字发送数据.但是我在docker主机上看不到使用netstat的任何ESTABLISHED连接:

[root@server bin]# netstat -naop | grep ESTABLISHED 
Run Code Online (Sandbox Code Playgroud)

我在客户端看到了不使用docker的ESTABLISHED连接:

[root@client ~]# netstat -naop | grep 5000
tcp        0      0 10.167.43.73:39218      10.167.152.138:5000     ESTABLISHED 21429/telnet         off (0.00/0/0)
Run Code Online (Sandbox Code Playgroud)

我没有发现任何与netstat相当或类似的docker命令这是正常的吗?如何查看与容器或docker-proxy的ESTABLISHED连接?

谢谢

Adv*_*ser 17

你可以这样做:

docker exec <containerid> netstat -tan | grep ESTABLISHED
Run Code Online (Sandbox Code Playgroud)

或者如果您的docker镜像中没有netstat:

docker inspect -f '{{.State.Pid}}' <containerid> # note the PID
sudo nsenter -t <pid> -n netstat | grep ESTABLISHED
Run Code Online (Sandbox Code Playgroud)

nsenter是util-linux包的一部分.(抄袭@larsks)

  • 实际上这是一个有效的解决方案,但命令应该类似于“sudo nsenter -t &lt;pid&gt; -n netstat | grep 已建立`。注意“-n”选项。更多信息可以在这里找到:http://stackoverflow.com/a/40352004/1201488。 (2认同)
  • 使用 'ss' 而不是 'netstat' 可能更可取。您可以指定一个可选过滤器并查看连接的两端。示例输入:```nsenter -t 73647 -n ss -pnt state created 'dport = 3128' dst 10.1.2.3``` (2认同)

thi*_*rer 6

您可以使用此代码片段来获取一行中所有码头工人的所有 ESTABLISHED (如果您有nsenter

docker inspect --format '{{.State.Pid}} {{printf "%.13s" .ID}} {{.Name}}' \
$(docker ps --format '{{.ID}}') | while read dockpid dockid dockname
    do
    echo $dockid $dockname
    sudo nsenter -t $dockpid -n netstat -pan | grep ESTABLISHED
done
Run Code Online (Sandbox Code Playgroud)

请注意 中的 ESTABLISHED grep

netstat -pnl您可以更改为TCP 和 UDP 的监听连接

docker inspect --format '{{.State.Pid}} {{printf "%.13s" .ID}} {{.Name}}' \
$(docker ps --format '{{.ID}}') | while read dockpid dockid dockname
    do
    echo $dockid $dockname
    sudo nsenter -t $dockpid -n netstat -pnl
done
Run Code Online (Sandbox Code Playgroud)

或仅 TCP 监听

docker inspect --format '{{.State.Pid}} {{printf "%.13s" .ID}} {{.Name}}' \
$(docker ps --format '{{.ID}}') | while read dockpid dockid dockname
    do
    echo $dockid $dockname
    sudo nsenter -t $dockpid -n netstat -pnlt
done
Run Code Online (Sandbox Code Playgroud)