Docker缓存

0 阅读3分钟

Docker在删除容器或镜像后,确实会留下一些缓存文件。它不会自动清理所有类型的缓存,但针对构建缓存有一套自动的垃圾回收(Garbage Collection, GC)机制。

缓存主要有哪些,如何清理?

  • 构建缓存 (Build Cache):这是最主要的缓存来源,由 docker build 产生,用于加速后续构建。如果长期不清理,会占用大量空间。

  • 悬空镜像 (Dangling Images):即没有标签 (<none>:<none>) 且不被任何容器使用的镜像层。这是删除旧镜像后最常见的一种残留。

  • 已停止的容器 (Stopped Containers):使用 docker rm 删除容器后,如果容器已经停止,它的文件系统层可能依然存在。

Docker 会自动清理缓存吗?

这需要分两种情况看:

  1. 构建缓存:会自动清理(有一定条件) Docker 的构建缓存确实有自动垃圾回收(GC)机制,它会定期运行。在默认配置下,它会遵循以下策略:

    • 按时间清理:删除超过48小时未使用的、可轻松重建的缓存;以及超过60天未被任何构建使用的缓存。
    • 按空间清理:当缓存总大小超过限制时,会删除最不常用的部分。

    对于大多数用户,这套默认策略已经够用,无需手动干预。

  2. 其他资源(容器、镜像、卷等):不会自动清理 对于已停止的容器悬空镜像未使用的网络数据卷,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任务来定时执行清理脚本。