我已经连接到一个Docker容器,并需要找出Java应用程序打开的套接字数量。不幸的是,容器中没有lsof或netstat命令可用。在/proc/PID/net/tcp
中也没有数据。是否有任何方法可以找到这些数据?
我已经连接到一个Docker容器,并需要找出Java应用程序打开的套接字数量。不幸的是,容器中没有lsof或netstat命令可用。在/proc/PID/net/tcp
中也没有数据。是否有任何方法可以找到这些数据?
我推荐使用 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
或者,只要您在与Docker守护程序相同的主机上,您就可以看到此内容:/proc/PID/net/tcp
。这比@BMitch的答案不太优雅。
您需要做的是在容器外部(在主PID名称空间中,严格来说是在主机上)找到您的进程的PID。
ps aux | grep java
在您的容器内,java
有一个进程ID;但在外部,它有另一个进程ID,您可以使用它来访问您请求的信息:/proc/PID/net/tcp