Docker:有什么方法可以列出正在运行的 docker 容器中打开的套接字?

新手上路,请多包涵

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

我想我可以直接查看 /proc 文件系统,但在这一点上,我还不如将 docker cp netstat 放入容器并执行它。我想知道码头工人是否可以为此提供任何设施。

原文由 AdvilUser 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

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

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

例如,在我的系统上:

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

一旦你有了 PID,就用它作为 — 的目标( -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 包的一部分)

原文由 larsks 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

原文由 mikatuo 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题