我想在正在运行的docker容器中执行netstat以查看打开的TCP套接字及其状态。但是,在我的一些docker容器上,netstat不可用。有没有办法通过一些docker API获得开放套接字(及其状态,以及它们连接的IP地址,如果有的话)而不使用netstat? (顺便说一句,我的容器使用docker-proxy - 也就是说,没有直接桥接)
我想我可以直接查看/ proc文件系统,但在那时,我可能还将docker cp netstat放入容器并执行它。我想知道码头可能为此提供了什么设施。
答案 0 :(得分:72)
您可以使用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
包的一部分)
答案 1 :(得分:5)
@larsks回答中的两个命令合并为一个直线-无需复制粘贴PID(只需替换container_name_or_id
):
sudo nsenter -t $(docker inspect -f '{{.State.Pid}}' container_name_or_id) -n netstat
答案 2 :(得分: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
答案 3 :(得分:0)
server:docker容器ls
library(ggplot2)
ggplot(res, aes(time, P)) +
geom_ribbon(aes(ymin = lower, ymax = upper, fill = CIF), alpha = 0.2) +
geom_line(aes(color = CIF)) +
scale_fill_manual(values = c("#F0746B", "#51BFC4"), name="", label=c("Recurrent","Non-recurrent")) +
scale_color_manual(values = c("#F0746B", "#51BFC4"), name="",label=c("Recurrent","Non-recurrent")) +
scale_x_continuous(name="Time (months)", breaks=seq(0,84,12)) +
scale_y_continuous(name="Cumulative incidence", breaks=seq(0,1,0.1), limits=c(0,1), label=c("0%","10%","20%","30%","40%","50%","60%","70%","80%","90%","100%")) +
coord_cartesian(xlim = c(0,90), expand = TRUE)