我有一个使用Docker 1.7.0在RHEL 7上运行的docker容器。在此容器中运行的程序侦听端口5000上的TCP连接。 在我的Dockerfile中,我把句子EXPOSE 5000和我用以下命令运行容器:
docker run \
--name myProgram \
--detach \
--publish 5000:5000 \
--volume /home/docker/apps/myProgram/logs:/var/log/myProgram/ \
--volume /home/docker/apps/myProgram/conf:/usr/local/snnotificationreceiver/conf/ \
--restart always \
10.167.152.15:5000/myProgram:1.0.0
当我在主机上执行netstat时,我看到了LISTEN套接字:
[root@server bin]# netstat -naop | grep 5000
tcp6 0 0 :::5000 :::* LISTEN 33595/docker-proxy off (0.00/0/0)
我可以通过连接到端口5000上的主机IP地址连接到应用程序,并且我发送给应用程序的数据到达。我知道这是因为我在应用程序日志中看到它,应用程序也通过套接字发送数据。但是我在docker主机上看不到使用netstat的任何ESTABLISHED连接:
[root@server bin]# netstat -naop | grep ESTABLISHED
我在客户端看到了ESTABLISHED连接,它不使用docker:
[root@client ~]# netstat -naop | grep 5000
tcp 0 0 10.167.43.73:39218 10.167.152.138:5000 ESTABLISHED 21429/telnet off (0.00/0/0)
我没有找到与netstat等效或类似的任何docker命令 这是正常的吗?如何查看与容器或docker-proxy的ESTABLISHED连接?
由于
答案 0 :(得分:12)
您可以这样做:
docker exec <containerid> netstat -tan | grep ESTABLISHED
或者如果您的docker镜像中没有netstat:
docker inspect -f '{{.State.Pid}}' <containerid> # note the PID
sudo nsenter -t <pid> -n netstat | grep ESTABLISHED
nsenter是util-linux软件包的一部分。 (抄袭@larsks)
答案 1 :(得分:1)
您可以使用此代码段获取一行中所有泊坞广告的所有ESTABLISHED(如果您有nsenter
)
docker inspect --format '{{.State.Pid}} {{printf "%.13s" .ID}} {{.Name}}' \
$(docker ps --format '{{.ID}}') | while read dockpid dockid dockname
do
echo $dockid $name
sudo nsenter -t $dockpid -n netstat -pan | grep ESTABLISHED
done
请注意grep
中的ESTABLISHED。
您可以使用netstat -pnl
TCP和UDP
docker inspect --format '{{.State.Pid}} {{printf "%.13s" .ID}} {{.Name}}' \
$(docker ps --format '{{.ID}}') | while read dockpid dockid dockname
do
echo $dockid $name
sudo nsenter -t $dockpid -n netstat -pnl
done
或仅限TCP LISTEN
docker inspect --format '{{.State.Pid}} {{printf "%.13s" .ID}} {{.Name}}' \
$(docker ps --format '{{.ID}}') | while read dockpid dockid dockname
do
echo $dockid $name
sudo nsenter -t $dockpid -n netstat -pnlt
done