Skip to content

Docker 清理构建缓存

磁盘空间管理

shell
# 查看缓存占用
docker system df

Docker 用久了,磁盘空间很容易被各种资源占用,及时清理可以有效释放空间。

先查看 Docker 磁盘使用情况

开始清理前,建议先了解当前 Docker 资源的磁盘占用情况,以便有针对性地清理。

bash
docker system df

这个命令会显示四类资源的空间使用情况:

  • Images:镜像占用的空间
  • Containers:容器占用的空间
  • Local Volumes:数据卷占用的空间
  • Build Cache:构建缓存占用的空间

RECLAIMABLE 列显示了可以回收的空间大小。

你还可以查看 Docker 相关目录的空间占用:

bash
du -sh /var/lib/docker/*

这能帮你判断是哪个部分(如 overlay2, volumes, containers)占用了最多空间。

Docker 清理命令及作用

下表总结了常用的 Docker 清理命令及其效果和安全性,你可以根据自己的需求选择使用:

提示:可增加 -f 参数避免二次确认。但是,除非明确意图,否则不要使用 -f (force) 参数强制删除运行中的容器,这可能导致服务中断或数据不一致。

清理对象命令作用风险说明
所有未使用资源docker system prune清理停止的容器、未被使用的网络、悬空镜像、构建缓存相对安全,但会删除所有未使用的资源
所有资源 (强制)docker system prune -a --volumes清理所有未使用的镜像、容器、卷和网络高风险,会删除所有未使用的资源,包括可能重要的数据卷
停止的容器docker container prune清理所有处于停止状态的容器相对安全,建议先确认停止的容器中无重要数据
未使用的镜像docker image prune -a删除所有未被容器使用的镜像中等风险,可能会删除一些以后需要用到的镜像,但当前未使用的镜像
悬空镜像docker image prunedocker rmi $(docker images -f "dangling=true" -q)删除所有没有标签(未被引用)的镜像低风险,这些通常是构建过程的中间层,通常可以安全删除
未使用的数据卷docker volume prune删除所有未被容器引用的数据卷高风险,数据卷通常包含持久化数据(如数据库文件),删除可能导致数据丢失
未使用的网络docker network prune删除所有未被使用的自定义网络低风险,通常自定义网络容易重建
构建缓存docker builder prune -a删除所有构建缓存低风险,但下次构建镜像时可能会变慢
构建缓存(按时间保留缓存)docker builder prune --filter "until=240h" -f删除所有构建缓存(按时间保留缓存)低风险,但下次构建镜像时可能会变慢
容器日志truncate -s 0 /var/lib/docker/containers/*/*-json.log清空所有容器日志文件的内容(不建议直接删除日志文件)中等风险,清空日志后可能影响故障排查,但不会影响容器运行

清理注意事项

清理 Docker 资源时,尤其是容器、镜像和数据卷,需要格外小心,以避免意外删除重要数据或影响正在运行的服务。

  1. 数据备份最重要:在执行任何可能删除数据的清理操作(尤其是 docker volume prunedocker system prune -a --volumes)之前,请务必确认你已经备份了所有重要数据。数据卷通常用于数据库、应用程序配置等持久化数据,一旦删除难以恢复。
  2. 理解命令作用:清楚每个 docker prune 命令的具体作用对象和范围。使用 -a (all) 和 --volumes 参数时要特别谨慎。
  3. 避免删除运行中容器:除非明确意图,否则不要使用 -f (force) 参数强制删除运行中的容器,这可能导致服务中断或数据不一致。
  4. 生产环境格外小心:在生产环境中执行清理操作前,最好在测试环境验证清理脚本和命令,并选择业务低峰期进行。

清理步骤参考

你可以根据下表推荐的顺序和场景进行清理:

顺序操作推荐命令适用场景
1查看磁盘空间docker system df清理前了解占用情况
2清理停止的容器docker container prune定期维护,删除已停止的容器
3清理悬空镜像docker image prune定期维护,这些是无用的镜像层
4清理构建缓存docker builder prune构建镜像较多,磁盘空间紧张时
5清理未使用的镜像docker image prune -a确认某些镜像不再使用且需要释放大量空间时
6谨慎操作docker volume rm <volume_name>删除特定已知不再使用的数据卷绝对不要盲目使用 prune
7清理未使用的网络docker network prune网络配置过多时
8全面清理 (强制)docker system prune -a --volumes需要彻底清理且已备份所有重要数据
9清理容器日志配置日志轮转或手动清空日志文件过大导致磁盘空间不足时
10验证清理效果docker system dfdf -h清理后查看空间释放情况

日常维护与预防

养成良好的 Docker 使用习惯,可以从源头上减少磁盘空间的过度占用:

  1. 配置日志轮转:防止容器日志无限增长,这是常见的磁盘空间"杀手"。在 /etc/docker/daemon.json 中配置日志大小和数量限制:
json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}
  • 配置后需要重启 Docker 服务生效。

总结

清理 Docker 磁盘空间时,谨慎总是没错的,尤其涉及数据卷时。优先使用针对特定资源的 prune 命令(如 container prune, image prune),而非一刀切的 system prune --volumes

对于大多数日常维护,按顺序执行以下命令通常就能安全地回收不少空间:

bash
docker system df                # 首先查看情况
docker container prune          # 删除停止的容器
docker image prune              # 删除悬空镜像
docker builder prune            # 清理构建缓存
docker system df                # 再次查看效果