本文目录导读:

- 清理 Docker 残留网络
- 清理 Podman 残留网络
- 清理 iptables 残留规则
- 清理残留的网络接口
- 清理 containerd 的残留网络(非 Docker 但使用 containerd)
- 综合清理脚本示例
- ⚠️ 注意事项
在Shell脚本中清理容器残留网络,主要涉及 Docker 和 Podman(或 containerd 等容器运行时) 遗留的网络资源(如网络接口、iptables 规则、网桥等),以下是一些常见且有效的清理方法:
清理 Docker 残留网络
1 清理未使用的网络
# 删除所有未使用的 Docker 网络(不会被任何容器使用) docker network prune -f # 如果有多个未使用网络,使用 -a 删除所有(谨慎) docker network prune -a -f
2 清理已停止容器的网络
# 删除所有已停止的容器 docker container prune -f
3 彻底清理所有残留资源(包括网络)
# 清理所有未被使用的 Docker 对象(容器、网络、镜像、卷等) docker system prune -a -f --volumes
4 手动清理特定的残留网络
docker network ls 显示残留网络(如 none、host 或自定义网络),但仍无法删除:
# 先强制删除该网络(如果无容器使用) docker network rm <network_name> --force
清理 Podman 残留网络
Podman 使用 CNI(容器网络接口)管理网络,残留网络可能存在于 /var/lib/cni/networks/ 中。
1 清理未使用的 Podman 网络
# 删除所有未使用的 Podman 网络 podman network prune -f # 删除特定网络 podman network rm <network_name> --force
2 删除残留的 CNI 网络文件
podman network ls 显示残留网络但无法删除:
# 停止所有容器(避免冲突) podman stop -a # 删除残留的 CNI 文件 sudo rm -rf /var/lib/cni/networks/* # 重新启动 Podman 服务(如果使用 systemd) sudo systemctl restart podman
清理 iptables 残留规则
容器运行时会创建 iptables 规则,如果清理网络后 iptables 规则未自动删除,需要手动清理。
1 删除 Docker 或 Podman 创建的 iptables 规则
# 备份当前规则(可选) sudo iptables-save > /tmp/iptables_backup.txt # 删除 Docker 链(所有 DOCKER 相关规则) sudo iptables -t nat -F DOCKER sudo iptables -t filter -F DOCKER sudo iptables -t filter -F DOCKER-ISOLATION-STAGE-1 sudo iptables -t filter -F DOCKER-ISOLATION-STAGE-2 # 删除 Docker 链本身 sudo iptables -t nat -X DOCKER sudo iptables -t filter -X DOCKER sudo iptables -t filter -X DOCKER-ISOLATION-STAGE-1 sudo iptables -t filter -X DOCKER-ISOLATION-STAGE-2
2 重启 Docker 服务自动重建规则
sudo systemctl restart docker # 或 sudo service docker restart
清理残留的网络接口
容器删除后,有时 ip link 仍显示残留的 veth* 接口。
1 手动删除残留的 veth 接口
# 列出所有网络接口,查找 veth 开头或残留的接口 ip link show | grep -E 'veth|br-' # 删除特定接口(如 veth1234) sudo ip link delete veth1234 type veth
2 批量删除所有 veth 接口
# 获取所有 veth 接口名称并删除
for iface in $(ip link show | grep -o 'veth[a-f0-9]*'); do
sudo ip link delete "$iface" type veth
done
清理 containerd 的残留网络(非 Docker 但使用 containerd)
如果系统使用 containerd 管理容器(如 k3s、nerdctl):
1 使用 nerdctl 清理
# 清理未使用的网络(类似 Docker) nerdctl network prune -f # 删除特定网络 nerdctl network rm <network_name>
2 清理 CNI 配置和状态
# 删除 CNI 配置文件(备份前) sudo rm -rf /etc/cni/net.d/* # 清理 CNI 状态(可能包含残留 IP 分配) sudo rm -rf /var/lib/cni/*
综合清理脚本示例
以下脚本可集成到你的 Shell 脚本中,自动清理 Docker 和 Podman 的残留网络:
#!/bin/bash
echo "开始清理容器残留网络..."
# 清理 Docker
if command -v docker &> /dev/null; then
echo "清理 Docker 残留网络..."
docker container prune -f
docker network prune -f
docker system prune -a -f --volumes
fi
# 清理 Podman
if command -v podman &> /dev/null; then
echo "清理 Podman 残留网络..."
podman stop -a 2>/dev/null
podman container prune -f
podman network prune -f
sudo rm -rf /var/lib/cni/networks/*
sudo systemctl restart podman 2>/dev/null
fi
# 清理残留 veth 接口
echo "清理残留 veth 接口..."
for iface in $(ip link show | grep -o 'veth[a-f0-9]*'); do
sudo ip link delete "$iface" type veth 2>/dev/null || true
done
# 清理残留网桥(Docker 创建的 br-xxx 接口)
echo "清理残留网桥..."
for br in $(ip link show | grep -o 'br-[a-f0-9]*'); do
sudo ip link delete "$br" type bridge 2>/dev/null || true
done
# 清理 iptables 规则(仅清理 Docker 相关)
echo "清理 Docker iptables 规则..."
sudo iptables -t nat -F DOCKER 2>/dev/null || true
sudo iptables -t filter -F DOCKER 2>/dev/null || true
sudo iptables -t nat -X DOCKER 2>/dev/null || true
sudo iptables -t filter -X DOCKER 2>/dev/null || true
echo "残留网络清理完成!"
⚠️ 注意事项
- 谨慎使用
-a或--volumes:会删除所有未使用的资源,包括容器、镜像、卷等。 - iptables 规则清理:如果没有容器运行,清理 Docker 创建的规则是安全的,但不要误删系统自定义规则。
- 备份 CNI 信息:如果使用 Kubernetes 或 Podman,清理 CNI 文件可能导致现有容器无法启动,建议先停止所有容器。
- 权限:清理网络接口和 iptables 规则通常需要
sudo权限。
如果需要更精细的清理(如指定某个网络名称或接口),可以结合 docker network inspect、ip link show 等命令先查看残留资源,再针对性清理。