解决Docker磁盘空间告急:认识并清理“悬空镜像”
引言如果你经常使用 Docker,可能会在某天发现磁盘空间莫名变小。执行 docker images命令后,列表中那些既没有名字(REPOSITORY)也没有标签(TAG)、显示为 : 的镜像,很可能就是罪魁祸首。这些就是“悬空镜像”,今天我们就来彻底了解它。
1.什么是悬空镜像?
简单来说,悬空镜像就像是软件开发的“旧版本安装包”。它们是失去了名称和标签,并且没有被任何容器使用的镜像层。由于没有标签标识,它们在镜像列表中就成了“无名氏”。
2.悬空镜像是如何产生的?(最常见的三种情况)
2.1 频繁构建新镜像
在开发过程中,我们经常重复执行 docker build -t my-app:latest .。每次构建,latest标签都会从旧镜像上剥离,并贴到新构建的镜像上。那个失去了标签的旧镜像,就变成了悬空镜像。
2.2 拉取镜像的新版本
当你运行 docker pull nginx:latest来获取最新版本的 Nginx 时,Docker 会把 latest标签指向刚下载的新镜像。本地上一个被标记为 nginx:latest的镜像就会变成悬空镜像。
2.3 使用 docker tag重新打标
当你为某个镜像创建一个新标签时,如果旧标签不再被其他镜像引用,它也可能变成悬空镜像。例如,你将一个测试版镜像标记为稳定版:docker tag my-app:test my-app:stable,如果 my-app:test没有其他引用,它就可能成为悬空镜像。
3.如何识别悬空镜像?
使用以下命令可以专门列出所有悬空镜像:
docker images -f "dangling=true"4.如何安全清理?
清理悬空镜像非常安全,因为它们已经被新版本替代,且没有被任何容器依赖。Docker 提供了强大的清理工具。
4.1 首选命令(推荐)
docker system prune这个命令会智能地一次性清理多种无用资源,包括:
[*]所有已停止的容器
[*]所有悬空镜像(这正是我们想要的)
[*]所有未被使用的网络
[*]所有悬空的构建缓存
执行后,系统会提示你确认,输入y即可。 如果只想清理镜像,可以执行:
docker image prune这个命令默认只删除悬空镜像。
4.2 高级警告(谨慎使用!)
命令 docker system prune -a或 docker image prune -a会删除所有未被容器使用的镜像,而不仅仅是悬空镜像。这可能会误删一些你暂时不用但以后可能需要的基础镜像(如 ubuntu, python),使用前请务必三思!
5.如何从源头减少悬空镜像?
一个有效的实践是使用 Docker 的多阶段构建。它可以在最终镜像中只保留运行所需的文件,避免包含构建阶段的中间层,从而从源头上减少悬空镜像的产生。
6.总结
悬空镜像是 Docker 正常运作的副产品。定期使用 docker system prune清理它们,是一个保持开发环境整洁、高效的好习惯。现在,就打开终端,为你的 Docker 进行一次“大扫除”吧!
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! 东西不错很实用谢谢分享 用心讨论,共获提升! 热心回复! 感谢分享 感谢分享,下载保存了,貌似很强大 不错,里面软件多更新就更好了 新版吗?好像是停更了吧。 yyds。多谢分享 喜欢鼓捣这些软件,现在用得少,谢谢分享! 感谢分享 谢谢分享,辛苦了 这个好,看起来很实用 热心回复! 收藏一下 不知道什么时候能用到 谢谢楼主提供! 新版吗?好像是停更了吧。 东西不错很实用谢谢分享 感谢分享,下载保存了,貌似很强大 懂技术并乐意极积无私分享的人越来越少。珍惜
页:
[1]
2