Docker:在运行的docker容器中列出打开套接字的任何方法?

Adv*_*ser 39 netstat docker alpine-linux

我想在正在运行的docker容器中执行netstat以查看打开的TCP套接字及其状态.但是,在我的一些docker容器上,netstat不可用.有没有办法通过一些docker API获得开放套接字(及其状态,以及它们连接的IP地址,如果有的话)而不使用netstat?(顺便说一句,我的容器使用docker-proxy - 也就是说,没有直接桥接)

我想我可以直接查看/ proc文件系统,但是在那一点上,我可能还将docker cp netstat放入容器并执行它.我想知道码头可能提供的任何设施.

lar*_*sks 86

您可以使用该nsenter命令在Docker容器的网络命名空间内的主机上运行命令.只需获取Docker容器的PID:

docker inspect -f '{{.State.Pid}}' container_name_or_id
Run Code Online (Sandbox Code Playgroud)

例如,在我的系统上:

$ docker inspect -f '{{.State.Pid}}' c70b53d98466
15652
Run Code Online (Sandbox Code Playgroud)

一旦你有了PID,就用它作为target(-t)选项的参数nsenter.例如,要netstat在容器网络命名空间内运行:

$ sudo nsenter -t 15652 -n netstat
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN     
Run Code Online (Sandbox Code Playgroud)

请注意,即使容器未netstat安装,这仍然有效:

$ docker exec -it c70b53d98466 netstat
rpc error: code = 13 desc = invalid header field value "oci runtime error: exec failed: container_linux.go:247: starting container process caused \"exec: \\\"netstat\\\": executable file not found in $PATH\"\n"
Run Code Online (Sandbox Code Playgroud)

(nsenterutil-linux包的一部分)

  • 这个解决方案是否适用于其他平台,如windows、mac等? (3认同)

mik*_*tuo 9

@larsks答案中的两个命令合并为一个直线-无需复制粘贴PID(只需替换container_name_or_id):

sudo nsenter -t $(docker inspect -f '{{.State.Pid}}' container_name_or_id) -n netstat


Yog*_*dav 6

如果你已经iproute2安装了包,你可以使用

sudo nsenter -t $(docker inspect -f '{{.State.Pid}}' container_name_or_id) -n ss
Run Code Online (Sandbox Code Playgroud)

或者

sudo nsenter -t $(docker inspect -f '{{.State.Pid}}' container_name_or_id) -n ss -ltu
Run Code Online (Sandbox Code Playgroud)

它将显示TCPUDP