1、在宿主机上查找容器的进程号:
docker inspect -f {{.State.Pid}} nginx
![]()
2、进入该进程的network命名空间,然后查看相应端口的外部连接情况
nsenter -n -t 36156

3、可以使用watch命令持续监视
watch "netstat -antupl |grep 80"

4、编写shell脚本docker_aip.sh来获取访问IP信息
脚本功能
-
获取 Nginx 容器 PID
-
进入容器网络 namespace 查看 80 端口连接
-
过滤掉 0.0.0.0、去重
-
输出 当前时间 + 有效 IP 到
access.log -
自动处理异常(容器不存在、无连接等)
#!/bin/bash
# 切换到脚本所在的目录
cd "$(dirname "$0")"
# 1. 获取 Nginx 容器 PID
NGINX_PID=$(docker inspect -f '{{.State.Pid}}' nginx 2>/dev/null)
# 判断容器是否存在/运行
if [ -z "$NGINX_PID" ] || [ "$NGINX_PID" = "0" ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 错误:未找到运行中的 nginx 容器" >> access.log
exit 1
fi
# 2. 进入容器网络空间获取 80 端口连接 IP
# 解析目标IP(外部访问nginx的客户端IP)
IP_LIST=$(nsenter -n -t "$NGINX_PID" netstat -tan 2>/dev/null | \
grep ":80" | \
awk '{print $5}' | \
cut -d: -f1 | \
grep -v '0.0.0.0' | \
grep -v '::' | \
sort | uniq)
# 3. 如果没有有效IP,记录日志
if [ -z "$IP_LIST" ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 无有效80端口连接" >> access.log
exit 0
fi
# 4. 逐行输出 时间 + IP 到日志
CURRENT_TIME=$(date '+%Y-%m-%d %H:%M:%S')
echo "$IP_LIST" | while read -r IP; do
if [ -n "$IP" ]; then
echo "[$CURRENT_TIME] 有效连接IP:$IP" >> access.log
fi
done
5、执行脚本
watch docker_aip.sh
6、查看输出
cat access.log


2153

被折叠的 条评论
为什么被折叠?



