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

问题描述 投票:0回答:8

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

我想我可以直接查看 /proc 文件系统,但此时,我不妨将 docker cp netstat 放入容器中并执行它。我想知道 docker 是否可以为此提供任何设施。

docker netstat alpine-linux
8个回答
229
投票

您可以使用

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"

nsenter
util-linux
包的一部分)


48
投票

@larsks 回答中的两个命令合并为一行 - 无需复制粘贴 PID(只需替换

container_name_or_id
):

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

6
投票

如果您安装了

iproute2
软件包,则可以使用

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

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

它将显示

TCP
UDP


4
投票

如果您想要全部(所有容器),请尝试此操作。

$ for i in `docker ps -q` ; do sudo nsenter -t $(docker inspect -f '{{.State.Pid}}' $i) -n netstat ; done

1
投票

我尝试了其他解决方案,但它对我不起作用,我的同事给了我这个解决方案。我想我会在这里为像我这样的其他人提一下,并供我稍后参考哈哈。

docker exec -it [容器名称] bash

grep -v“rem_address”/proc/net/tcp


0
投票

在 Macos 和 Linux 中,这里列出了跨所有容器在 docker 内运行的所有端口:

docker ps -q | xargs -n 1 docker port


-1
投票

码头工人检查

  • 在“配置”中查找“ExpedPorts”

-3
投票

服务器:docker容器ls

CONTAINER ID    IMAGE              COMMAND                  CREATED          STATUS           PORTS       NAMES

80acfa804b59    admirito/gsad:10   "docker-entrypoint.s…"   18 minutes ago   Up 10 minutes    80/tcp      gvmcontainers_gsad_1
© www.soinside.com 2019 - 2024. All rights reserved.