如何在Docker容器中检查已建立的网络连接
查看和管理由Docker容器建立的网络连接。
在使用Docker容器时,我们经常需要查看容器使用的网络连接,进行初始调试或故障排除。您可能想要查看哪个IP正在监听某个端口,或者容器中当前有多少活动连接。
由于Docker是一个隔离的环境,对服务器运行netstat不会给出容器的网络连接。相反,您要么必须进入容器内部运行netstat,要么远程运行netstat。
我们来看看这两个选项…
# 1. 进入Docker容器运行netstat
首先,找到要排查故障的容器的容器ID。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0ce7cfb9be37 nginx "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp web-server
4ab8551671d7 nginx "/docker-entrypoint.…" 6 minutes ago Up 6 minutes 80/tcp vigilant_ganguly
$
这里我要排查故障的是ID为0ce7cfb9be37
的容器。现在要获取此容器的shell(bash)会话,请使用:
$ docker exec -it 0ce7cfb9be37 bash
这会将您带到容器内部的bash提示符中。
root@0ce7cfb9be37:/#
您可以安装netstat
包来查找已建立的网络连接。默认情况下,这些实用程序可能在容器内不可用。
所以要安装它,请使用:
apt update apt install net-tools
现在,我们可以像往常一样使用netstat命令。
# netstat -an
输出:
Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN tcp 0 0 172.17.0.3:80 223.233.99.46:64429 FIN_WAIT2 tcp 0 0 172.17.0.3:80 223.233.99.46:4811 ESTABLISHED tcp 0 0 172.17.0.3:80 223.233.99.46:64430 FIN_WAIT2 tcp 0 0 172.17.0.3:80 223.233.99.46:4810 ESTABLISHED tcp6 0 0 :::80 :::* LISTEN Active UNIX domain sockets (servers and established) Proto RefCnt Flags Type State I-Node Path unix 3 [ ] STREAM CONNECTED 35748 unix 3 [ ] STREAM CONNECTED 35749
从上面的输出中可以看到,列出了与其源地址和目标地址建立的连接。要查看监听端口的进程,可以使用:
# netstat -tulnp
输出:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1/nginx: master pro
tcp6 0 0 :::80 :::* LISTEN 1/nginx: master pro
# 2. 不进入容器运行netstat
首先,我们需要使用docker ps
命令获取容器ID。
[root@relicflare-shared-services ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5db9a01d4a8 postgres:13.1-alpine "docker-entrypoint.s…" 9 天前 Up 9 天 0.0.0.0:5432->5432/tcp relicflare_server_postgres
[root@relicflare-shared-services ~]#
然后,运行如下的docker command来查找容器的所有已建立连接。
docker exec e5db9a01d4a8 netstat |grep ESTABLISHED
这将会得到类似下面的结果。
[root@relicflare-shared-services ~]# docker exec e5db9a01d4a8 netstat | grep ESTABLISHED
tcp 0 0 e5db9a01d4a8:postgresql 161.35.XXX.XXX:49128 ESTABLISHED
udp 0 0 localhost:48818 localhost:48818 ESTABLISHED
[root@relicflare-shared-services ~]#
所以,思路是运行netstat命令以及docker exec
命令。
结论
现在您拥有所需的连接详细信息,可以通过进一步查看Docker和进程日志来进行故障排除。