在Docker容器中查找打开的套接字

3

我已经连接到一个Docker容器,并需要找出Java应用程序打开的套接字数量。不幸的是,容器中没有lsof或netstat命令可用。在/proc/PID/net/tcp中也没有数据。是否有任何方法可以找到这些数据?


Sysdig将为您提供跨容器查看此信息的视图,同时充当非常高性能的完整系统strace。 - Charles Duffy
2个回答

4

我推荐使用 netshoot 来实现此功能。您可以在相同的网络和进程命名空间中运行一个容器,并使用 netshoot 中的工具来分析其他容器的网络。

$ docker run -d -p 8888:80 --name nginx-test nginx
d8a90f5c7d1744483ae6d26cc97dad222ed237b5c4211f711c9f15f88252897f

$ docker run --net container:nginx-test --pid container:nginx-test -it --rm nicolaka/netshoot

/ # netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1/nginx: master pro
/ # ps -ef
PID   USER     TIME   COMMAND
    1 root       0:00 nginx: master process nginx -g daemon off;
    7 104        0:00 nginx: worker process
    8 root       0:00 sh
   15 root       0:00 ps -ef

2

或者,只要您在与Docker守护程序相同的主机上,您就可以看到此内容:/proc/PID/net/tcp。这比@BMitch的答案不太优雅。

您需要做的是在容器外部(在主PID名称空间中,严格来说是在主机上)找到您的进程的PID。

ps aux | grep java

在您的容器内,java有一个进程ID;但在外部,它有另一个进程ID,您可以使用它来访问您请求的信息:/proc/PID/net/tcp


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接