如何清理旧的、不再使用的 Docker 镜像?
docker image prune 清悬空(<none>)镜像;docker image prune -a 清所有没被容器使用的镜像;docker system prune -a 连容器网络一起清。本文区分"悬空"与"未使用"并给清理策略。
两级清理:docker image prune 清悬空镜像**(重新构建后失去标签的 <none> 层,安全无害);docker image prune -a 清所有未被任何容器引用的镜像(含带标签的,较激进)。日常定期跑前者,磁盘告急时用后者。**
两个概念先分清
- 悬空镜像(dangling):
<none>:<none>——重建同名镜像后旧版本失去标签变成的残留 - 未使用镜像(unused):没有任何容器(含停止的)在引用它,可能还带着正常标签
docker images -f dangling=true # 看悬空镜像
清理命令
docker image prune # 只清悬空(安全)
docker image prune -a # 清全部未被引用的(激进)
docker system prune -a # 未用镜像+停止容器+未用网络 一锅端
加 -f 跳过确认;--filter "until=168h" 可只清一周前的。
保留策略示例
清理但保留最近在用和基础镜像:
# 列出一周前创建的镜像 ID
docker images --format '{{.ID}} {{.CreatedAt}}' | sort -k2 | head -20
# 或按过滤清
docker image prune -a --filter "until=720h" # 30 天前且未使用的
不同角色的清理节奏
| 机器角色 | 建议 |
|---|---|
| CI 构建机 | 每天 docker system prune -f,构建缓存另设 builder prune |
| 开发机 | 每周一次 image prune |
| 生产主机 | 保留当前+上一个版本镜像用于回滚,其余定期清 |
观测云对照
镜像卫生指标化。 各主机镜像数量、磁盘占用、悬空层体积由 DataKit 采集成趋势,"哪台机该清了"看板直答,监控器对磁盘水位告警兜底。
常见问题(FAQ)
Q:prune -a 会不会把正在用的镜像删了?
A:不会。被任何容器(运行或停止)引用的镜像都受保护;但"备着没跑"的镜像会被清,执行前过一遍 docker images。
Q:清理后 pull 会变慢吗?
A:被清掉的镜像下次用要重新拉取,内网仓库影响不大。
Q:私有仓库里的旧镜像怎么清?
A:本地 prune 管不到远端;Harbor 配保留策略(保留最近 N 个 tag),Registry 原生要调 API 删 manifest 再 GC。