本文目录导读:

在Shell脚本中查看容器网络连接,主要取决于你使用的容器运行时(Docker、Podman、containerd等),以下是几种常见的方法:
Docker 容器
查看容器内部网络连接
#!/bin/bash
# 方法1:使用 docker exec 进入容器查看
docker exec <容器名或ID> netstat -tlnp
# 或
docker exec <容器名或ID> ss -tlnp
# 或
docker exec <容器名或ID> cat /proc/net/tcp
# 方法2:查看容器网络命名空间
# 获取容器PID
CONTAINER_PID=$(docker inspect --format '{{.State.Pid}}' <容器名或ID>)
# 使用nsenter进入网络命名空间
nsenter -t $CONTAINER_PID -n netstat -tlnp
查看宿主机视角的容器网络
#!/bin/bash
# 查看Docker网络信息
docker network ls
docker network inspect <网络名>
# 查看容器端口映射
docker port <容器名或ID>
# 查看容器IP地址
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <容器名或ID>
# 查看所有容器的网络连接
docker ps --format "table {{.Names}}\t{{.Ports}}"
完整脚本示例
#!/bin/bash
# container_network_check.sh
# 检查容器网络连接的脚本
CONTAINER_NAME="$1"
if [ -z "$CONTAINER_NAME" ]; then
echo "使用方法: $0 <容器名或ID>"
exit 1
fi
# 检查容器是否存在
if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
echo "错误: 容器 $CONTAINER_NAME 未运行"
exit 1
fi
echo "=== 容器基本信息 ==="
docker inspect --format '容器名称: {{.Name}}
容器ID: {{.ID}}
状态: {{.State.Status}}
IP地址: {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}
主机名: {{.Config.Hostname}}
' "$CONTAINER_NAME"
echo -e "\n=== 端口映射 ==="
docker port "$CONTAINER_NAME"
echo -e "\n=== 容器内部网络连接 ==="
# 尝试多种方式查看网络连接
echo "--- TCP连接 ---"
docker exec "$CONTAINER_NAME" ss -tlnp 2>/dev/null || \
docker exec "$CONTAINER_NAME" netstat -tlnp 2>/dev/null || \
echo "容器内未安装 ss 或 netstat"
echo -e "\n--- UDP连接 ---"
docker exec "$CONTAINER_NAME" ss -ulnp 2>/dev/null || \
docker exec "$CONTAINER_NAME" netstat -ulnp 2>/dev/null || \
echo "容器内未安装 ss 或 netstat"
echo -e "\n=== 网络接口 ==="
docker exec "$CONTAINER_NAME" ip addr 2>/dev/null || \
docker exec "$CONTAINER_NAME" ifconfig 2>/dev/null || \
echo "容器内未安装 ip 或 ifconfig"
echo -e "\n=== 路由表 ==="
docker exec "$CONTAINER_NAME" ip route 2>/dev/null || \
docker exec "$CONTAINER_NAME" route -n 2>/dev/null || \
echo "容器内未安装 ip 或 route"
使用 nsenter 高级方法
#!/bin/bash
# 使用网络命名空间检查
check_container_network_ns() {
local CONTAINER_NAME="$1"
local CONTAINER_PID
# 获取容器PID
CONTAINER_PID=$(docker inspect --format '{{.State.Pid}}' "$CONTAINER_NAME" 2>/dev/null)
if [ -z "$CONTAINER_PID" ] || [ "$CONTAINER_PID" = "0" ]; then
echo "错误: 无法获取容器PID"
return 1
fi
echo "容器PID: $CONTAINER_PID"
# 进入容器网络命名空间查看
echo "=== 网络接口 ==="
nsenter -t $CONTAINER_PID -n ip addr
echo -e "\n=== 路由表 ==="
nsenter -t $CONTAINER_PID -n ip route
echo -e "\n=== 网络连接 ==="
nsenter -t $CONTAINER_PID -n ss -tlnp
echo -e "\n=== ARP表 ==="
nsenter -t $CONTAINER_PID -n arp -n
}
# 使用示例
check_container_network_ns "your_container_name"
监控所有容器网络
#!/bin/bash
# 监控所有运行容器的网络连接
monitor_all_containers_network() {
local CONTAINERS=$(docker ps --format '{{.Names}}')
for CONTAINER in $CONTAINERS; do
echo "=========================================="
echo "容器: $CONTAINER"
echo "=========================================="
# 获取容器信息
local IP=$(docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$CONTAINER")
local PORTS=$(docker port "$CONTAINER" 2>/dev/null)
echo "IP地址: $IP"
echo "端口映射:"
echo "$PORTS"
echo -e "\n活跃连接数:"
docker exec "$CONTAINER" ss -tlnp 2>/dev/null | wc -l || echo "0"
echo ""
done
}
# 执行监控
monitor_all_containers_network
常用查看命令汇总
#!/bin/bash
# 快速查看容器网络状态
quick_network_check() {
local CONTAINER_NAME="$1"
# 1. 查看容器IP
echo "1. IP地址:"
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}} {{.Gateway}}{{end}}' "$CONTAINER_NAME"
# 2. 查看端口映射
echo -e "\n2. 端口映射:"
docker port "$CONTAINER_NAME"
# 3. 查看DNS
echo -e "\n3. DNS配置:"
docker inspect --format '{{.HostConfig.Dns}}' "$CONTAINER_NAME"
# 4. 查看网络模式
echo -e "\n4. 网络模式:"
docker inspect --format '{{.HostConfig.NetworkMode}}' "$CONTAINER_NAME"
# 5. 查看网络连接数
echo -e "\n5. ESTABLISHED连接数:"
docker exec "$CONTAINER_NAME" ss -tlnp 2>/dev/null | grep -c "ESTAB" || echo "0"
}
注意事项
- 容器内工具依赖:部分容器可能没有安装
ss、netstat等网络工具,需要先安装或使用其他方法 - 权限问题:某些操作可能需要
sudo权限 - 安全考虑:在脚本中避免硬编码密码或敏感信息
- 兼容性:不同版本Docker的命令可能略有差异
这些脚本可以根据你的具体需求进行调整和扩展。