一尘不染

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

docker

我想在正在运行的docker容器中执行netstat,以查看打开的TCP套接字及其状态。但是,在我的某些Docker容器上,netstat不可用。是否可以通过某些Docker
API在不使用netstat的情况下获取打开的套接字(及其状态以及它们连接到的IP地址,如果有的话)的任何方法?(顺便说一句,我的容器使用docker-
proxy-即不直接桥接)

我想我可以直接查看/ proc文件系统,但是到那时,我最好将docker cp netstat放入容器并执行它。我想知道码头工人是否可以提供任何便利。


阅读 307

收藏
2020-06-17

共1个答案

一尘不染

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

docker inspect -f '{{.State.Pid}}' container_name_or_id

例如,在我的系统上:

$ docker inspect -f '{{.State.Pid}}' c70b53d98466
15652

并且一旦有了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

请注意,即使容器尚未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"

nsenterutil-linux包装的一部分)

2020-06-17