惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Cloudflare Blog
小众软件
小众软件
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
Tailwind CSS Blog
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
博客园 - 司徒正美
V
Visual Studio Blog
G
Google Developers Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
月光博客
月光博客
aimingoo的专栏
aimingoo的专栏
博客园_首页
Blog — PlanetScale
Blog — PlanetScale
博客园 - 聂微东
S
SegmentFault 最新的问题
T
The Blog of Author Tim Ferriss
D
Docker
Vercel News
Vercel News
Recent Announcements
Recent Announcements
Last Week in AI
Last Week in AI
爱范儿
爱范儿
J
Java Code Geeks
大猫的无限游戏
大猫的无限游戏

博客园 - 人艰不拆_zmc

15000mAh 到底是什么概念?一篇看懂电池容量 go2_ros2_sdk 到底是干什么的?从 Go2、官方 SDK、ROS2 一路讲到 SLAM 和 Nav2 买了宇树 Go2 以后怎么二次开发?写给第一次做机器狗项目的人 买了一块 NVIDIA Jetson,怎么在上面安装 ROS2?从 JetPack 到 ROS2 的完整入门指南 NVIDIA Jetson 到底是什么?写给第一次接触机器人和边缘 AI 的人 ROS / ROS2 到底是什么?写给第一次接触机器人开发的人 大模型到底能同时多少人用?一篇看懂并发、排队与容量估算 大模型为什么有快有慢?一篇看懂响应速度背后的关键因素 技术小白也能看懂:大模型里的量化、蒸馏到底是什么意思? Codex 使用技巧:从“会聊天”到“真正能干活” 我终于搞懂了:Codex 对话中插件和 Skill 到底怎么用 我终于搞懂了 Agent Spec:它其实就是 Agent 的“标准设计图” 我终于搞懂了 Tool:原来不只是 Function Calling 里的函数 Skill 里的 Python 脚本,到底是不是 Tool? 我终于搞懂了 Codex 的 Plugin 和 Skill:顺便把 App、MCP 一次理清 我终于搞懂了 Codex 的“应用”:App 到底是什么,怎么添加和维护? 我终于搞懂了 Tool、Function Calling 和 MCP:大模型到底怎么知道该调哪个接口? 我终于搞懂了 MCP:从 HTTP API 到 ERP MCP Server 的完整入门 我终于搞懂了 Codex 的“记忆”是怎么回事 Codex 用久了越来越慢?我的上下文管理小技巧 我终于搞懂了 Codex 里的 Thread、Turn 和 Session 从 Qwen3.8-27B 到 FP8、NVFP4、MoE:一次搞懂几个常见大模型概念 FPS 是什么意思?简单理解 60 FPS、25 FPS 和视频帧率 DeepSeek Harness 明明像 AI Coding 工具,为什么又能用来构建各种 Agent? 使用 Codex 开发项目,怎么才能节约 Token? 模型里的 32K、128K、256K 是什么意思?简单聊聊上下文限制 Codex 一次对话到底会给模型发送什么?以 Spring Boot 项目为例讲清 Context、代码读取与 Token 消耗 AI Agent 中的 Rule 是什么?以 Codex 为例,小白也能看懂 我终于搞懂了 Harness:它不是论文,也不是标准,更不是 Codex 独有 小白也能看懂:RTSP 到底是什么?
解决Docker磁盘空间告急:认识并清理“悬空镜像”
人艰不拆_zmc · 2025-12-19 · via 博客园 - 人艰不拆_zmc

引言

如果你经常使用 Docker,可能会在某天发现磁盘空间莫名变小。执行 docker images命令后,列表中那些既没有名字(REPOSITORY)也没有标签(TAG)、显示为 <none>:<none> 的镜像,很可能就是罪魁祸首。这些就是“悬空镜像”,今天我们就来彻底了解它。

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 首选命令(推荐)

这个命令会智能地一次性清理多种无用资源,包括:

  • 所有已停止的容器
  • 所有悬空镜像(这正是我们想要的)
  • 所有未被使用的网络
  • 所有悬空的构建缓存

执行后,系统会提示你确认,输入y即可。 如果只想清理镜像,可以执行:

这个命令默认只删除悬空镜像。

4.2 高级警告(谨慎使用!)

命令 docker system prune -a或 docker image prune -a会删除所有未被容器使用的镜像,而不仅仅是悬空镜像。这可能会误删一些你暂时不用但以后可能需要的基础镜像(如 ubuntu, python),使用前请务必三思!

5.如何从源头减少悬空镜像?

一个有效的实践是使用 Docker 的多阶段构建。它可以在最终镜像中只保留运行所需的文件,避免包含构建阶段的中间层,从而从源头上减少悬空镜像的产生。

6.总结

悬空镜像是 Docker 正常运作的副产品。定期使用 docker system prune清理它们,是一个保持开发环境整洁、高效的好习惯。现在,就打开终端,为你的 Docker 进行一次“大扫除”吧!