Docker在删除容器或镜像后,确实会留下一些缓存文件。它不会自动清理所有类型的缓存,但针对构建缓存有一套自动的垃圾回收(Garbage Collection, GC)机制。
缓存主要有哪些,如何清理?
-
构建缓存 (Build Cache):这是最主要的缓存来源,由
docker build产生,用于加速后续构建。如果长期不清理,会占用大量空间。 -
悬空镜像 (Dangling Images):即没有标签 (
<none>:<none>) 且不被任何容器使用的镜像层。这是删除旧镜像后最常见的一种残留。 -
已停止的容器 (Stopped Containers):使用
docker rm删除容器后,如果容器已经停止,它的文件系统层可能依然存在。
Docker 会自动清理缓存吗?
这需要分两种情况看:
-
构建缓存:会自动清理(有一定条件) Docker 的构建缓存确实有自动垃圾回收(GC)机制,它会定期运行。在默认配置下,它会遵循以下策略:
- 按时间清理:删除超过48小时未使用的、可轻松重建的缓存;以及超过60天未被任何构建使用的缓存。
- 按空间清理:当缓存总大小超过限制时,会删除最不常用的部分。
对于大多数用户,这套默认策略已经够用,无需手动干预。
-
其他资源(容器、镜像、卷等):不会自动清理 对于已停止的容器、悬空镜像、未使用的网络和数据卷,Docker 不会自动清理它们。这些资源会一直保留在磁盘上,直到你主动删除。
手动清理缓存的命令
如果需要立即释放空间,或想清理自动GC未覆盖到的资源,可以手动执行以下命令。
强烈建议:在执行清理前,先用 docker system df 命令查看磁盘使用情况,做到心中有数。
| 命令 | 作用 | 注意事项 |
|---|---|---|
docker system prune | 一键清理:删除所有已停止的容器、悬空镜像、未使用的网络和构建缓存。 | 最常用、最安全的清理方式。执行前会提示确认。 |
docker system prune -a | 深度清理:在 prune 基础上,额外删除所有未被容器使用的镜像(不仅仅是悬空镜像)。 | 谨慎使用!可能会删除你需要但当前未运行的镜像。 |
docker builder prune | 专门清理:仅清理构建缓存。 | 可以配合 --filter 使用,例如 --filter "until=24h" 只清理24小时前的缓存。 |
docker image prune | 清理镜像:仅删除悬空镜像。 | 比 system prune -a 更安全。 |
docker container prune | 清理容器:仅删除所有已停止的容器。 | 不会影响正在运行的容器。 |
docker volume prune | 清理卷:危险操作!删除所有未被容器使用的匿名卷。 | 务必小心,卷通常用来存放重要数据,一旦删除可能无法恢复。 |
总结与建议
- 缓存确实存在:删除容器或镜像后,构建缓存等会残留。
- 自动清理有限:只有构建缓存有自动GC,其他资源需要手动清理。
- 最佳实践:养成定期(例如每月)手动运行
docker system prune的习惯。 - 高级技巧:如果需要更精细的控制,可以配置
daemon.json文件来调整GC策略,或者设置一个Cron任务来定时执行清理脚本。