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)
(nsenter是util-linux包的一部分)
@larsks答案中的两个命令合并为一个直线-无需复制粘贴PID(只需替换container_name_or_id):
sudo nsenter -t $(docker inspect -f '{{.State.Pid}}' container_name_or_id) -n netstat
如果你已经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)
它将显示TCP和UDP
| 归档时间: |
|
| 查看次数: |
34646 次 |
| 最近记录: |