当前位置:首页>Linux>Docker 网络管理工具|AI+Linux 实战营

Docker 网络管理工具|AI+Linux 实战营

  • 2026-09-02 19:31:29
Docker 网络管理工具|AI+Linux 实战营

Docker 网络管理工具


🔥CentOS 7 运维神器!纯Shell实现Docker网络一键诊断,容器互通/端口冲突/网络排查全搞定!


大家好,这里是「运维 AI 实战营」!

在前几篇文章中,我们已经完成了 Docker 集群监控大屏、容器一键管理、自动化部署、日志收集、健康巡检、备份恢复、镜像管理等实战脚本。✅

今天是 第 8 篇,给大家带来一款 纯 Shell 编写、零第三方依赖 的 Docker 网络管理工具,支持 网络诊断、容器互通检测、端口冲突排查、网桥管理,解决 Docker 网络问题定位难、排查慢的运维痛点!

一键诊断网络状态、检测容器互通、排查端口冲突,本地实测零报错,运维日常必备!


✅ 功能清单

  • • ✅ 查看所有网络:清晰展示网络名称、驱动类型、子网、网关信息
  • • ✅ 查看容器网络详情:展示每个容器的 IP 地址、MAC 地址、网络模式
  • • ✅ 网络连通性测试:检测容器与宿主机、容器与容器之间的网络连通
  • • ✅ 端口冲突检测:扫描宿主机端口占用情况,排查端口冲突
  • • ✅ 容器互通检测:检测同一网络内容器是否能互相通信
  • • ✅ 网桥详情查看:展示 Docker 网桥配置、路由表信息
  • • ✅ DNS 解析测试:测试容器内 DNS 解析是否正常
  • • ✅ 网络流量统计:查看容器网络流量使用情况
  • • ✅ 创建自定义网络:一键创建 bridge/overlay 网络
  • • ✅ 删除指定网络:清理无用网络,释放资源
  • • ✅ 循环菜单:操作完成后自动返回菜单,无需重新启动工具

📌 必看说明

  • • ✅ 零依赖:仅用 CentOS 7 原生 bash + docker 命令,无需安装任何第三方工具
  • • ✅ 防误操作:删除网络前会检测是否有容器正在使用,避免误删
  • • ✅ 已真机验证:CentOS 7 最小化系统实测通过,复制命令直接运行
  • • ✅ 诊断全面:覆盖网络配置、连通性、端口、DNS 等全方位检测

一键安装脚本(100% 可运行)

⚠️ 全程 root 用户操作,无需修改任何命令,直接复制粘贴即可!

1. 清理旧环境(必执行,避免冲突)

# 杀死旧管理工具进程pkill -f docker_network_manager.sh# 删除旧脚本文件rm -f /usr/local/bin/docker_network_manager.sh

2. 部署管理工具

cat > /usr/local/bin/docker_network_manager.sh <<'EOF'#!/bin/bash# 颜色定义RED='\033[0;31m'GREEN='\033[0;32m'YELLOW='\033[1;33m'BLUE='\033[0;34m'CYAN='\033[0;36m'NC='\033[0m' # No Color# 检查是否为 root 用户check_root() {    if [ "$EUID" -ne 0 ]; then        echo -e "${RED}[!] 警告:当前非 root 用户,部分操作可能需要 sudo${NC}"    fi}# 显示菜单show_menu() {    clear    echo -e "${BLUE}=================================================${NC}"    echo -e "${GREEN}      Docker 网络管理工具(CentOS 7)${NC}"    echo -e "${BLUE}=================================================${NC}"    echo ""    echo -e "${YELLOW}  1${NC}  查看所有网络(名称/驱动/子网/网关)"    echo -e "${YELLOW}  2${NC}  查看容器网络详情(IP/MAC/网络模式)"    echo -e "${YELLOW}  3${NC}  网络连通性测试(容器↔宿主机)"    echo -e "${YELLOW}  4${NC}  端口冲突检测(扫描宿主机端口占用)"    echo -e "${YELLOW}  5${NC}  容器互通检测(同一网络内容器通信)"    echo -e "${YELLOW}  6${NC}  网桥详情查看(路由表/网桥配置)"    echo -e "${YELLOW}  7${NC}  DNS 解析测试(容器内域名解析)"    echo -e "${YELLOW}  8${NC}  网络流量统计(容器流量使用情况)"    echo -e "${YELLOW}  9${NC}  创建自定义网络(bridge/overlay)"    echo -e "${YELLOW} 10${NC}  删除指定网络(带使用检测)"    echo -e "${YELLOW}  0${NC}  退出工具"    echo ""    echo -e "${BLUE}=================================================${NC}"}# 1. 查看所有网络list_networks() {    echo -e "\n${GREEN}[+] Docker 网络列表:${NC}\n"    printf "%-20s %-15s %-20s %-15s\n" "网络名称" "驱动类型" "子网" "网关"    printf "%-20s %-15s %-20s %-15s\n" "--------------------" "---------------" "--------------------" "---------------"    docker network ls --format "{{.Name}}|{{.Driver}}" | while IFS='|' read -r name driver; do        if [ "$name" != "NAME" ]; then            subnet=$(docker network inspect "$name" --format='{{range .IPAM.Config}}{{.Subnet}}{{end}}' 2>/dev/null | head -1)            gateway=$(docker network inspect "$name" --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}' 2>/dev/null | head -1)            [ -z "$subnet" ] && subnet="N/A"            [ -z "$gateway" ] && gateway="N/A"            printf "%-20s %-15s %-20s %-15s\n" "$name" "$driver" "$subnet" "$gateway"        fi    done    echo ""}# 2. 查看容器网络详情container_network_details() {    echo -e "\n${GREEN}[+] 容器网络详情:${NC}\n"    printf "%-20s %-15s %-18s %-20s %-15s\n" "容器名称" "网络模式" "IP 地址" "MAC 地址" "所属网络"    printf "%-20s %-15s %-18s %-20s %-15s\n" "--------------------" "---------------" "------------------" "--------------------" "---------------"    docker ps --format "{{.Names}}" | while read -r container; do        if [ -n "$container" ]; then            network_mode=$(docker inspect "$container" --format='{{.HostConfig.NetworkMode}}' 2>/dev/null)            ip_address=$(docker inspect "$container" --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 2>/dev/null | head -1)            mac_address=$(docker inspect "$container" --format='{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}' 2>/dev/null | head -1)            network_name=$(docker inspect "$container" --format='{{range $k, $v := .NetworkSettings.Networks}}{{$k}}{{end}}' 2>/dev/null)            [ -z "$network_mode" ] && network_mode="N/A"            [ -z "$ip_address" ] && ip_address="N/A"            [ -z "$mac_address" ] && mac_address="N/A"            [ -z "$network_name" ] && network_name="N/A"            printf "%-20s %-15s %-18s %-20s %-15s\n" "$container" "$network_mode" "$ip_address" "$mac_address" "$network_name"        fi    done    echo ""}# 3. 网络连通性测试network_connectivity_test() {    echo -e "\n${GREEN}[+] 网络连通性测试:${NC}\n"    # 测试容器到宿主机的连通性    echo -e "${CYAN}--- 容器到宿主机连通性 ---${NC}"    host_ip=$(hostname -I | awk '{print $1}')    echo "宿主机 IP: $host_ip"    docker ps --format "{{.Names}}" | head -3 | while read -r container; do        if [ -n "$container" ]; then            echo -e "\n测试容器 ${YELLOW}$container${NC} -> 宿主机:"            docker exec "$container" ping -c 2 "$host_ip" 2>/dev/null | grep -E "(64 bytes|packet loss)" || echo -e "${RED}  无法连通${NC}"        fi    done    echo ""}# 4. 端口冲突检测check_port_conflicts() {    echo -e "\n${GREEN}[+] 宿主机端口占用情况:${NC}\n"    printf "%-10s %-20s %-15s %-20s\n" "端口" "进程名称" "PID" "容器映射"    printf "%-10s %-20s %-15s %-20s\n" "----------" "--------------------" "---------------" "--------------------"    # 获取 Docker 容器映射的端口    docker ps --format "{{.Names}}|{{.Ports}}" | while IFS='|' read -r name ports; do        if [ -n "$ports" ] && [ "$ports" != "PORTS" ]; then            echo "$ports" | tr ',' '\n' | while read -r port_map; do                if echo "$port_map" | grep -q "0.0.0.0"; then                    host_port=$(echo "$port_map" | grep -oP '0\.0\.0\.0:\K[0-9]+' | head -1)                    if [ -n "$host_port" ]; then                        # 检查该端口是否被其他进程占用                        other_proc=$(ss -tlnp | grep ":$host_port " | grep -v docker | awk '{print $6}' | head -1)                        if [ -n "$other_proc" ]; then                            printf "%-10s %-20s %-15s %-20s\n" "$host_port" "$other_proc" "N/A" "$name"                        fi                    fi                fi            done        fi    done    # 显示所有监听端口    echo -e "\n${CYAN}--- 所有监听端口 ---${NC}"    ss -tlnp | grep LISTEN | head -10    echo ""}# 5. 容器互通检测container_interconnect_test() {    echo -e "\n${GREEN}[+] 容器互通检测:${NC}\n"    # 获取默认 bridge 网络的容器    bridge_containers=$(docker network inspect bridge --format='{{range .Containers}}{{.Name}} {{end}}' 2>/dev/null)    if [ -z "$bridge_containers" ]; then        echo -e "${YELLOW}[-] bridge 网络中没有容器${NC}"        return    fi    echo -e "${CYAN}bridge 网络中的容器:${NC}"    echo "$bridge_containers" | tr ' ' '\n' | head -5    # 测试第一个容器 ping 其他容器    first_container=$(echo "$bridge_containers" | awk '{print $1}')    if [ -n "$first_container" ]; then        echo -e "\n测试容器 ${YELLOW}$first_container${NC} 与其他容器连通性:"        docker network inspect bridge --format='{{range .Containers}}{{.IPv4Address}} {{end}}' 2>/dev/null | tr ' ' '\n' | while read -r ip; do            if [ -n "$ip" ]; then                ip_clean=$(echo "$ip" | cut -d'/' -f1)                if [ -n "$ip_clean" ]; then                    echo -n "  -> $ip_clean: "                    result=$(docker exec "$first_container" ping -c 1 -W 2 "$ip_clean" 2>/dev/null | grep "1 received" | wc -l)                    if [ "$result" -eq 1 ]; then                        echo -e "${GREEN}连通✓${NC}"                    else                        echo -e "${RED}不通✗${NC}"                    fi                fi            fi        done    fi    echo ""}# 6. 网桥详情查看bridge_details() {    echo -e "\n${GREEN}[+] Docker 网桥详情:${NC}\n"    echo -e "${CYAN}--- Docker 网桥接口 ---${NC}"    ip addr show | grep -A 2 "docker"    echo -e "\n${CYAN}--- 网桥路由表 ---${NC}"    ip route | grep docker    echo -e "\n${CYAN}--- iptables NAT 规则 ---${NC}"    iptables -t nat -L DOCKER -n 2>/dev/null | head -10 || echo "无 DOCKER 链"    echo ""}# 7. DNS 解析测试dns_resolution_test() {    echo -e "\n${GREEN}[+] DNS 解析测试:${NC}\n"    docker ps --format "{{.Names}}" | head -3 | while read -r container; do        if [ -n "$container" ]; then            echo -e "容器 ${YELLOW}$container${NC} DNS 解析测试:"            # 测试解析百度            echo -n "  baidu.com -> "            result=$(docker exec "$container" nslookup baidu.com 2>/dev/null | grep "Address:" | tail -1 | awk '{print $2}')            if [ -n "$result" ]; then                echo -e "${GREEN}$result ✓${NC}"            else                echo -e "${RED}解析失败 ✗${NC}"            fi            # 测试解析阿里云            echo -n "  aliyun.com -> "            result=$(docker exec "$container" nslookup aliyun.com 2>/dev/null | grep "Address:" | tail -1 | awk '{print $2}')            if [ -n "$result" ]; then                echo -e "${GREEN}$result ✓${NC}"            else                echo -e "${RED}解析失败 ✗${NC}"            fi            echo ""        fi    done}# 8. 网络流量统计network_traffic_stats() {    echo -e "\n${GREEN}[+] 容器网络流量统计:${NC}\n"    printf "%-20s %-15s %-15s %-15s %-15s\n" "容器名称" "接收数据" "发送数据" "接收包数" "发送包数"    printf "%-20s %-15s %-15s %-15s %-15s\n" "--------------------" "---------------" "---------------" "---------------" "---------------"    # 获取容器统计信息    docker stats --no-stream --format "{{.Name}}|{{.NetIO}}" 2>/dev/null | while IFS='|' read -r name netio; do        if [ -n "$name" ] && [ "$name" != "NAME" ]; then            # 解析 NetIO 格式 "1.2MB / 500kB"            rx=$(echo "$netio" | awk -F' / ' '{print $1}')            tx=$(echo "$netio" | awk -F' / ' '{print $2}')            printf "%-20s %-15s %-15s %-15s %-15s\n" "$name" "$rx" "$tx" "N/A" "N/A"        fi    done    echo ""}# 9. 创建自定义网络create_network() {    echo -e "\n${GREEN}[+] 创建自定义网络:${NC}\n"    echo "网络类型:"    echo "  1. bridge(桥接网络,单机使用)"    echo "  2. overlay(覆盖网络,Swarm 集群使用)"    read -p "请选择网络类型 [1-2]: " net_type    read -p "输入网络名称:" net_name    if [ "$net_type" = "1" ]; then        docker network create --driver bridge "$net_name"        if [ $? -eq 0 ]; then            echo -e "${GREEN}[✓] bridge 网络 $net_name 创建成功!${NC}"        else            echo -e "${RED}[!] 网络创建失败${NC}"        fi    elif [ "$net_type" = "2" ]; then        docker network create --driver overlay "$net_name"        if [ $? -eq 0 ]; then            echo -e "${GREEN}[✓] overlay 网络 $net_name 创建成功!${NC}"        else            echo -e "${RED}[!] 网络创建失败(需要 Swarm 模式)${NC}"        fi    else        echo -e "${RED}[-] 无效选择${NC}"    fi    echo ""}# 10. 删除指定网络delete_network() {    echo -e "\n${GREEN}[+] 删除网络:${NC}\n"    echo "现有网络列表:"    docker network ls --format "  - {{.Name}} ({{.Driver}})"    echo ""    read -p "输入要删除的网络名称:" net_name    # 检查网络是否存在    if ! docker network ls --format "{{.Name}}" | grep -q "^${net_name}$"; then        echo -e "${RED}[!] 网络 $net_name 不存在${NC}"        return    fi    # 检查是否有容器正在使用该网络    containers_using=$(docker network inspect "$net_name" --format='{{range .Containers}}{{.Name}} {{end}}' 2>/dev/null)    if [ -n "$containers_using" ]; then        echo -e "${YELLOW}[!] 警告:以下容器正在使用此网络:${NC}"        echo "$containers_using"        read -p "强制删除网络(容器将断开连接)?(y/n): " force_delete        if [ "$force_delete" != "y" ] && [ "$force_delete" != "Y" ]; then            echo -e "${RED}[-] 已取消${NC}"            return        fi    fi    read -p "确定删除网络 $net_name ?(y/n): " confirm    if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then        docker network rm "$net_name"        if [ $? -eq 0 ]; then            echo -e "${GREEN}[✓] 网络已删除${NC}"        else            echo -e "${RED}[!] 删除失败${NC}"        fi    else        echo -e "${RED}[-] 已取消${NC}"    fi    echo ""}# 主程序main() {    check_root    while true; do        show_menu        read -p "请输入操作编号:" choice        case $choice in            1) list_networks ;;            2) container_network_details ;;            3) network_connectivity_test ;;            4) check_port_conflicts ;;            5) container_interconnect_test ;;            6) bridge_details ;;            7) dns_resolution_test ;;            8) network_traffic_stats ;;            9) create_network ;;            10) delete_network ;;            0)                echo -e "\n${GREEN}[+] 感谢使用,再见!${NC}\n"                exit 0                 ;;            *)                echo -e "\n${RED}[-] 输入错误,请重新选择${NC}\n"                ;;        esac        echo -e "\n按回车键返回菜单..."        read    done}mainEOF

3. 添加执行权限

chmod +x /usr/local/bin/docker_network_manager.sh

📌 重要提示:终极避坑提醒

  1. 1. 删除网络需谨慎:删除网络前会检测是否有容器正在使用,强制删除会导致容器断网
  2. 2. overlay 网络需 Swarm:创建 overlay 网络前需要先初始化 Docker Swarm 集群
  3. 3. 端口冲突排查:检测到的端口冲突可能是系统服务占用,请谨慎处理
  4. 4. DNS 测试依赖:容器内需要安装 nslookup 或 dig 命令才能进行 DNS 测试

使用方法

启动工具

docker_network_manager.sh

工具界面效果

=================================================      Docker 网络管理工具(CentOS 7)=================================================  1  查看所有网络(名称/驱动/子网/网关)  2  查看容器网络详情(IP/MAC/网络模式)  3  网络连通性测试(容器↔宿主机)  4  端口冲突检测(扫描宿主机端口占用)  5  容器互通检测(同一网络内容器通信)  6  网桥详情查看(路由表/网桥配置)  7  DNS 解析测试(容器内域名解析)  8  网络流量统计(容器流量使用情况)  9  创建自定义网络(bridge/overlay) 10  删除指定网络(带使用检测)  0  退出工具=================================================请输入操作编号:

运行效果

查看容器网络详情

[+] 容器网络详情:容器名称              网络模式        IP 地址            MAC 地址              所属网络       -------------------- --------------- ------------------ -------------------- ---------------nginx                 bridge          172.17.0.2         02:42:ac:11:00:02    bridge         redis                 bridge          172.17.0.3         02:42:ac:11:00:03    bridge         mysql                 bridge          172.17.0.4         02:42:ac:11:00:04    bridge         

容器互通检测

[+] 容器互通检测:bridge 网络中的容器:nginxredismysql测试容器 nginx 与其他容器连通性:  -> 172.17.0.2: 连通✓  -> 172.17.0.3: 连通✓  -> 172.17.0.4: 连通✓按回车键返回菜单...

适合人群

• 运维新手:不熟悉 Docker 网络原理,想要可视化工具排查问题• 服务器管理员:需要定期检查网络配置,排查连通性问题• DevOps 工程师:需要快速诊断容器网络故障,定位问题根源• Docker 初学者:想要学习容器网络模式、网桥原理等知识• 系统架构师:需要规划容器网络架构,设计网络隔离方案


下期预告

下一期我们将带来 Docker 容器资源限制工具,支持 CPU/内存限制设置、资源配额管理、OOM 防护,让容器资源管控更精准!

觉得有用欢迎 点赞、在看、关注,持续更新极简、无坑的运维实战脚本!


🚀评论区留言"网络管理",获取更多 CentOS 7 Docker 运维实战脚本!

最新文章

随机文章