Docker:在运行的docker容器中列出打开套接字的任何方法?

时间:2016-10-31 20:56:34

标签: docker netstat alpine

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

我想我可以直接查看/ proc文件系统,但在那时,我可能还将docker cp netstat放入容器并执行它。我想知道码头可能为此提供了什么设施。

4 个答案:

答案 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"

nsenterutil-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

它将显示 TCPUDP

答案 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)