自动检测并交互删除未使用 Docker 自定义网桥
Docker 的“废弃网桥”(没有容器使用的网络)如果不删除,会有以下几个影响:
1. IP 地址空间被占用
-
每个 Docker 网络都会占用一个子网(比如
172.19.0.0/16
)。 -
即使里面没有容器,这个网段也不能再被 Docker 用于新网络。
-
如果你创建很多临时网络,长期不清理,可能会把常用的
172.16.0.0/12
、192.168.0.0/16
等私网段占满,后面新建网络时可能报错:Error response from daemon: Pool overlaps with other one on this address space
2. 配置混乱,管理困难
docker network ls
会列出一堆没用的网桥,看着非常乱。- 有时候误以为还在用,实际已经没人使用。
- 对排查网络冲突、调试容器网络非常不友好。
3. 可能增加冲突风险
- 如果 Docker 网络占用的子网和宿主机内网冲突(比如公司用
172.18.0.0/16
,Docker 也占了),就可能导致容器和宿主机/其他服务器网络互通异常。 - 废弃网桥越多,越难管理这些冲突。
4. 资源消耗(轻微)
- 每个网络都会在宿主机上生成一对 虚拟网桥接口,虽然资源消耗不大,但几十上百个废弃接口还是会让
ip addr
/ifconfig
的输出变得很臃肿。
总结
- 短期:不清理没大问题,主要就是列表乱。
- 长期:可能导致 IP 网段冲突、新建网络失败、排查困难。
所以:
- 日常开发环境,建议定期用
docker network prune
清理。 - 生产环境,最好手工检查后删除,避免误删还在用的网络。
脚本:clean_unused_networks.sh
#!/bin/bash
# 自动清理未使用的 Docker 网络# 列出所有自定义 bridge 网络(排除 host、none、bridge)
networks=$(docker network ls --filter driver=bridge --format '{{.Name}}' | grep -vE '^(bridge|host|none)$')if [ -z "$networks" ]; thenecho "没有找到自定义的 bridge 网络。"exit 0
fiecho "检测到以下自定义 bridge 网络:"
for net in $networks; docontainers=$(docker network inspect -f '{{json .Containers}}' "$net")if [ "$containers" = "{}" ]; thenecho "🟢 $net (未使用,可以删除)"unused_networks="$unused_networks $net"elseecho "🔵 $net (正在使用,跳过)"fi
doneif [ -z "$unused_networks" ]; thenecho "没有发现未使用的网络。"exit 0
fiecho
echo "是否要删除这些未使用的网络?"
echo "$unused_networks"
read -p "输入 y 确认删除: " confirmif [ "$confirm" = "y" ]; thendocker network rm $unused_networksecho "✅ 已删除未使用的网络。"
elseecho "❌ 已取消。"
fi
使用方法
-
保存为
clean_unused_networks.sh
-
赋予执行权限:
chmod +x clean_unused_networks.sh
-
执行:
./clean_unused_networks.sh
- 自动找出所有 自定义 bridge 网络
- 判断是否被容器使用
- 给出提示,只删除未使用的