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. 删除网络需谨慎:删除网络前会检测是否有容器正在使用,强制删除会导致容器断网
- 2. overlay 网络需 Swarm:创建 overlay 网络前需要先初始化 Docker Swarm 集群
- 3. 端口冲突排查:检测到的端口冲突可能是系统服务占用,请谨慎处理
- 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 运维实战脚本!