查看和管理 Docker 容器建立的网络连接。
使用 Docker 容器时,您经常需要检查容器使用的网络连接以进行初始调试或故障排除。您可能想查看哪些 IP 正在侦听端口或容器中当前有多少连接处于活动状态。
Docker 是一个隔离环境,因此在服务器上运行 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 days ago Up 9 days 0.0.0.0:5432->5432/tcp relicflare_server_postgres
[root@relicflare-shared-services ~]#
接下来,运行如下 docker 命令来查看与容器建立的所有连接。
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 日志和进程日志以进一步排除故障。




![2021 年如何设置 Raspberry Pi Web 服务器 [指南]](https://i0.wp.com/pcmanabu.com/wp-content/uploads/2019/10/web-server-02-309x198.png?w=1200&resize=1200,0&ssl=1)

