veth 接口残留的 docker network prune 与 containerd 清理

发布时间 - 2026-01-28 00:00:00    点击率:
docker network prune 删不掉 veth 接口,因为它只清理未被引用的用户自定义网络元数据,不调用 CNI 插件,也不处理内核层 veth 设备;残留通常源于容器异常退出导致 CNI DE

L 操作未执行。

docker network prune 为什么删不掉 veth 接口

因为 docker network prune 只清理「未被任何容器引用」的用户自定义网络(bridge、overlay 等),它完全不触碰默认 bridge 网络,也不管内核层面的 veth 设备。这些接口残留通常来自异常退出的容器、docker kill -9 强杀、或 containerd 没有正确回调 CNI 插件释放资源。

常见现象是:ip link show 里一堆 vethxxxxxx@if2,但 docker ps -adocker network ls 都看不到对应容器或网络。

  • 根本原因:CNI 插件(如 bridge)在容器销毁时负责执行 DEL 操作解绑并删除 veth,但 containerd 或 dockerd 进程崩溃、OOM kill、或 CNI 超时失败都会导致这步跳过
  • docker network prune 不调用 CNI,只是删 Docker 内存/磁盘里的网络对象记录,属于“元数据清理”,不是“设备清理”
  • 默认 docker0 网桥上的 veth 更不会动——它由 Docker daemon 启动时创建,生命周期绑定 daemon 进程

containerd 场景下如何安全清理残留 veth

containerd 的容器生命周期由 ctrcrictl 管理,其网络释放依赖 netns 文件是否存在 + CNI DEL 执行成功。若 netns 已销毁但 veth 还挂着,说明 CNI 没收到通知或执行失败。

手动清理前先确认:该 veth 是否真无主(没被任何 netns 持有、没被 iptables/ebtables 引用、没被 tc/qdisc 绑定):

  • 查归属:readlink /sys/class/net/vethabc123/nameif(若返回 No such file,说明 netns 已消失)
  • 查引用:ls -l /sys/class/net/vethabc123/master(若有输出,表示还连着网桥,不能直接删)
  • 查 netns 关联:grep -l "vethabc123" /proc/*/net/ns(无结果才可删)

确认无主后,用 ip link delete vethabc123 删除。不要用 ifconfig vethxxx down && ifconfig vethxxx delete——老式 ifconfig 不支持 veth 删除。

自动化清理脚本要注意的三个坑

网上流传的 “一键清空所有闲置 veth” 脚本容易误删,关键在判断逻辑是否严谨:

  • 不能只靠名字匹配 veth 前缀——有些自建 CNI 或 SR-IOV 驱动也会创建 veth 开头的设备,它们有业务意义
  • 不能跳过 master 检查——直接删正在桥接中的 veth 会导致宿主机网络抖动甚至断连
  • containerd + nerdctl 场景下,/run/containerd/io.containerd.runtime.v2.task/k8s.io/xxx/rootfs 下的 netns 可能残留,得配合 nsenter -n -t PID ip link 核对,否则脚本会漏判

推荐最小化检查命令组合:

ip -br link | awk '$1 ~ /^veth/ && $NF == "DOWN" {print $1}' | while read dev; do
[ ! -e "/sys/class/net/$dev/master" ] && ip link delete "$dev"
done

重启 containerd 能不能顺带清掉 veth

不能。containerd 本身不持有或管理 veth 设备,它只通过 CNI 插件间接调用。重启 containerd 后,已残留的 veth 依然挂在内核里,且没有自动回收机制。

唯一例外是:如果容器对应的 netns 文件还在 /proc/PID/ns/net 下,且你用 nsenter 进入后执行 ip link 能看到该 veth,那说明这个 netns 实际上还活着(比如进程僵死但没退出),此时应先 kill -9 PID 再删设备。

真正有效的兜底方式只有两个:手动按上述步骤删,或重启宿主机(强制释放所有 netns 和关联设备)。后者在生产环境显然不可取,所以重点还是把清理逻辑做细——尤其是 masternetns 的双重校验,少一步都可能让问题从“网络杂乱”升级成“业务断网”。


# docker  # ai  # 为什么  # 接口  #   # class  # delete  # 对象  # 自动化  # 重启  # 也不  # 自定义  # 绑定  # 跳过  # 未被  # 它只  # 无主  # 网桥  # 也会 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Python自然语言搜索引擎项目教程_倒排索引查询优化案例  jQuery validate插件功能与用法详解  焦点电影公司作品,电影焦点结局是什么?  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  如何在云服务器上快速搭建个人网站?  Python文件流缓冲机制_IO性能解析【教程】  EditPlus中的正则表达式实战(5)  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  Laravel如何实现多对多模型关联?(Eloquent教程)  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  无锡营销型网站制作公司,无锡网选车牌流程?  如何在云主机上快速搭建网站?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  Laravel怎么使用artisan命令缓存配置和视图  JavaScript如何实现路由_前端路由原理是什么  详解jQuery中基本的动画方法  JavaScript常见的五种数组去重的方式  浅述节点的创建及常见功能的实现  使用spring连接及操作mongodb3.0实例  EditPlus中的正则表达式实战(6)  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  php 三元运算符实例详细介绍  Bootstrap CSS布局之列表  php json中文编码为null的解决办法  Python3.6正式版新特性预览  三星网站视频制作教程下载,三星w23网页如何全屏?  Python图片处理进阶教程_Pillow滤镜与图像增强  制作公司内部网站有哪些,内网如何建网站?  JavaScript如何实现音频处理_Web Audio API如何工作?  网站建设整体流程解析,建站其实很容易!  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  高端建站三要素:定制模板、企业官网与响应式设计优化  linux写shell需要注意的问题(必看)  如何在IIS中新建站点并配置端口与IP地址?  如何在橙子建站上传落地页?操作指南详解  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】