Shell脚本如何清理容器残留网络

wen 实用脚本 2

本文目录导读:

Shell脚本如何清理容器残留网络

  1. 清理 Docker 残留网络
  2. 清理 Podman 残留网络
  3. 清理 iptables 残留规则
  4. 清理残留的网络接口
  5. 清理 containerd 的残留网络(非 Docker 但使用 containerd)
  6. 综合清理脚本示例
  7. ⚠️ 注意事项

在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 显示残留网络(如 nonehost 或自定义网络),但仍无法删除:

# 先强制删除该网络(如果无容器使用)
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 "残留网络清理完成!"

⚠️ 注意事项

  1. 谨慎使用 -a--volumes:会删除所有未使用的资源,包括容器、镜像、卷等。
  2. iptables 规则清理:如果没有容器运行,清理 Docker 创建的规则是安全的,但不要误删系统自定义规则。
  3. 备份 CNI 信息:如果使用 Kubernetes 或 Podman,清理 CNI 文件可能导致现有容器无法启动,建议先停止所有容器。
  4. 权限:清理网络接口和 iptables 规则通常需要 sudo 权限。

如果需要更精细的清理(如指定某个网络名称或接口),可以结合 docker network inspectip link show 等命令先查看残留资源,再针对性清理。

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