Docker:有什么方法可以在 运行 docker 容器中列出打开的套接字?
Docker: any way to list open sockets inside a running docker container?
我想在 运行 docker 容器内执行 netstat 以查看打开的 TCP 套接字及其状态。但是,在我的某些 docker 容器上,netstat 不可用。有没有什么方法可以在不使用 netstat 的情况下通过一些 docker API 获取打开的套接字(及其状态,以及它们连接到的 IP 地址(如果有))? (顺便说一句,我的容器使用 docker-proxy - 即不直接桥接)
我想我可以直接查看/proc 文件系统,但到那时,我还不如docker cp netstat 进入容器并执行它。我想知道 docker 是否可以为此提供任何便利。
您可以使用 nsenter
命令在 Docker 容器的网络名称空间内的主机上 运行 命令。只需获取 Docker 容器的 PID:
docker inspect -f '{{.State.Pid}}' container_name_or_id
例如,在我的系统上:
$ docker inspect -f '{{.State.Pid}}' c70b53d98466
15652
获得 PID 后,将其用作 nsenter
的目标 (-t
) 选项的参数。例如容器网络命名空间里面的运行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
包的一部分)
来自@larsks answer 的两个命令合并为一行 - 无需复制粘贴 PID(只需替换 container_name_or_id
):
sudo nsenter -t $(docker inspect -f '{{.State.Pid}}' container_name_or_id) -n netstat
server:docker container 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
如果你安装了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
如果你想要全部(所有容器)试试这个。
$ for i in `docker ps -q` ; do sudo nsenter -t $(docker inspect -f '{{.State.Pid}}' $i) -n netstat ; done
我尝试了其他解决方案,但我的同事给我的这个解决方案对我不起作用。以为我会在这里为像我这样的其他人提一下,供我以后参考哈哈。
docker exec -it [容器名称] bash
grep -v “rem_address” /proc/net/tcp
docker 检查
- 在“配置”中查找“ExposedPorts”
我想在 运行 docker 容器内执行 netstat 以查看打开的 TCP 套接字及其状态。但是,在我的某些 docker 容器上,netstat 不可用。有没有什么方法可以在不使用 netstat 的情况下通过一些 docker API 获取打开的套接字(及其状态,以及它们连接到的 IP 地址(如果有))? (顺便说一句,我的容器使用 docker-proxy - 即不直接桥接)
我想我可以直接查看/proc 文件系统,但到那时,我还不如docker cp netstat 进入容器并执行它。我想知道 docker 是否可以为此提供任何便利。
您可以使用 nsenter
命令在 Docker 容器的网络名称空间内的主机上 运行 命令。只需获取 Docker 容器的 PID:
docker inspect -f '{{.State.Pid}}' container_name_or_id
例如,在我的系统上:
$ docker inspect -f '{{.State.Pid}}' c70b53d98466
15652
获得 PID 后,将其用作 nsenter
的目标 (-t
) 选项的参数。例如容器网络命名空间里面的运行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
包的一部分)
来自@larsks answer 的两个命令合并为一行 - 无需复制粘贴 PID(只需替换 container_name_or_id
):
sudo nsenter -t $(docker inspect -f '{{.State.Pid}}' container_name_or_id) -n netstat
server:docker container 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
如果你安装了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
如果你想要全部(所有容器)试试这个。
$ for i in `docker ps -q` ; do sudo nsenter -t $(docker inspect -f '{{.State.Pid}}' $i) -n netstat ; done
我尝试了其他解决方案,但我的同事给我的这个解决方案对我不起作用。以为我会在这里为像我这样的其他人提一下,供我以后参考哈哈。
docker exec -it [容器名称] bash
grep -v “rem_address” /proc/net/tcp
docker 检查
- 在“配置”中查找“ExposedPorts”