docker如何删除镜像:先清关联容器再执行删除指令

docker如何删除镜像:先清关联容器再执行删除指令

前段时间线上测试服务器突然弹出磁盘占用告警,存储空间直接顶满,翻查半天,才发现是长期堆积的docker镜像占用了大半磁盘,也是这次紧急排障,彻底摸透了docker如何删除镜像的实操流程,顺带踩遍了新手最容易犯的低级错误。

最开始压根没分清镜像和容器的区别。

随手敲了删除镜像的基础命令,直接输入docker rmi 镜像ID,回车之后疯狂报错,页面一直提示镜像被容器占用无法删除。当时只觉得莫名其妙,明明这个镜像已经很久没用了,也没手动启动过相关程序,死活删不掉。反复试了好几次同样的命令,结果都是一模一样的报错,白白浪费了十几分钟,一度以为是命令输入格式出了问题,逐字核对参数、大小写、空格,全部检查一遍,完全没有出错,就是执行失败,整个人被这个无解的问题卡的有点烦躁。

后来才反应过来,镜像和容器是绑定的,只要存在基于该镜像创建的容器,哪怕容器已经停止运行、处于闲置状态,镜像也会被系统锁定,不允许直接删除。这是绝大多数人删除镜像失败的核心原因,不是命令不对,是前置步骤没做对。

先打开终端用docker ps -a查看所有容器,不管运行中还是停止的容器都会全部展示出来。屏幕瞬间刷出一堆废弃容器,全是之前迭代测试项目残留的冗余数据,每一个都绑定着我需要清理的老旧镜像。没有偷懒批量操作,挨个复制对应的容器ID,用docker rm 容器ID逐一删除所有关联容器,把所有占用关系彻底解除干净。

清空容器之后,再重新执行docker rmi 镜像ID的删除命令,这次没有任何报错,镜像直接被成功清理。

操作过程里还碰到了虚悬镜像的问题,就是列表里显示标签为none的无效镜像。这类镜像都是镜像更新迭代后残留的旧版本,堆积多了特别占空间,而且没办法通过普通检索精准筛选。折腾好久才搞明白,不用逐个找ID删除,直接执行专属清理命令,就能一次性清空所有虚悬镜像,省事很多。

还有个容易翻车的细节,绝对不要直接执行全量删除镜像的指令。当时清理完冗余镜像后,差点手快输入批量删除命令,还好及时停手。服务器里还留存着正在运行的业务镜像,盲目批量删除会直接导致测试环境瘫痪,得不偿失。

全部操作结束后,再次输入docker images查看镜像列表,页面只剩下当前项目正在使用的有效镜像,几十G的冗余空间全部释放,服务器的磁盘告警也随之消失。

关掉终端的时候,电脑屏幕只剩黑漆漆的命令行界面。最后悔的是平时疏于整理,让无用镜像堆积到爆盘才处理。

了解更多百科知识请访问 百科