Shell脚本如何查看容器网络连接

wen 实用脚本 1

本文目录导读:

Shell脚本如何查看容器网络连接

  1. Docker 容器
  2. 完整脚本示例
  3. 使用 nsenter 高级方法
  4. 监控所有容器网络
  5. 常用查看命令汇总
  6. 注意事项

在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"
}

注意事项

  1. 容器内工具依赖:部分容器可能没有安装 ssnetstat 等网络工具,需要先安装或使用其他方法
  2. 权限问题:某些操作可能需要 sudo 权限
  3. 安全考虑:在脚本中避免硬编码密码或敏感信息
  4. 兼容性:不同版本Docker的命令可能略有差异

这些脚本可以根据你的具体需求进行调整和扩展。

抱歉,评论功能暂时关闭!