如何在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和进程日志来进行故障排除。

类似文章