· Jeff · 教程 · 4 分钟阅读
Docker悬空镜像与闲置镜像清理指南
搞清楚 docker image prune 和 docker rmi 的区别,精准清理 Docker 镜像,释放磁盘空间。
Docker 悬空镜像与闲置镜像清理指南
用了
docker image prune发现磁盘没腾出多少空间?不是命令不好使,是你清理的对象不对。
一、两种”没用”的镜像
Docker 有两类”没用但占磁盘”的镜像,很多人搞混:
1. 悬空镜像(Dangling Image)
docker images 中 REPOSITORY 和 TAG 都显示 <none>:
REPOSITORY TAG IMAGE ID SIZE
<none> <none> a1b2c3d4e5f6 1.2GB通常是构建新镜像时旧版标签被摘掉留下的。没有任何容器引用,纯占磁盘。
2. 闲置镜像(Unused Image)
有正常的标签,比如 decolua/9router:0.5.40,但没有任何容器在用它。常见场景:升级到新版本后,旧版镜像的标签还在。
Dokploy 面板里会标 U(In Use),没标的就是闲置的。
二、怎么查
# 标准终端:看全部镜像
docker images
# 只看悬空镜像
docker images -f "dangling=true"
# 看哪些镜像正被容器使用
docker ps -a --format 'table {{.Image}}'三、清理命令的区别(重点)
| 命令 | 清理范围 | 适用场景 |
|---|---|---|
docker image prune | 仅悬空镜像 | 日常清理 |
docker image prune -f | 同上,跳过确认提示 | 脚本/自动化 |
docker rmi <镜像:标签> | 精确删除指定标签 | 删旧版闲置镜像 |
一句话总结
prune只管<none>:<none>,有标签的一律不动。
所以升级镜像后留下的旧版(比如 decolua/9router:0.5.40),prune 碰都不会碰。必须用 docker rmi 指名道姓删。
# 清理所有悬空
docker image prune -f
# 删除指定的旧版闲置镜像
docker rmi decolua/9router:0.5.40四、实战演示
假设服务器上有 6 个镜像:
| 镜像 | 标签 | 大小 | 在用 | 处理 |
|---|---|---|---|---|
nousresearch/hermes-agent | v2026.7.30 | 4GB | ✅ | 保留 |
decolua/9router | 0.5.45 | 849MB | ✅ | 保留 |
mazzolino/restic | latest | 299MB | ✅ | 保留 |
filebrowser/filebrowser | v2.63.14 | 55MB | ✅ | 保留 |
decolua/9router | 0.5.40 | 843MB | ❌ | 删 |
nousresearch/hermes-agent | latest | 5.3GB | ❌ | 删 |
清理后释放约 6.1GB 磁盘空间。
docker rmi decolua/9router:0.5.40 nousresearch/hermes-agent:latest五、一键清理脚本
#!/bin/bash
# 清理悬空 + 指定旧版闲置镜像
# 1. 清悬空
docker image prune -f
# 2. 删已知旧版标签(按需修改)
docker rmi decolua/9router:0.5.40 nousresearch/hermes-agent:latest 2>/dev/null
# 3. 报告剩余
echo "=== 清理后 ==="
docker images --format 'table {{.Repository}}\t{{.Tag}}\t{{.Size}}'六、注意事项
docker image prune不会删除任何有标签的镜像,即使它们完全闲置- 删除前确认目标镜像不在任何容器(包括已停止的)中使用
- 如果镜像被多个标签引用,
docker rmi只会摘掉指定标签,不删除实际层数据 - 定期清理建议:悬空镜像每周一次,闲置旧版每次升级后立即清理,避免积压
☕ 如果这篇文章对你有帮助
欢迎请 Jeff 喝杯咖啡,支持我持续分享更多软件技巧~
打赏功能即将上线,先点个赞也是支持 ❤️