Docker 清理构建缓存
磁盘空间管理
shell
# 查看缓存占用
docker system dfDocker 用久了,磁盘空间很容易被各种资源占用,及时清理可以有效释放空间。
先查看 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 prune 或 docker 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 资源时,尤其是容器、镜像和数据卷,需要格外小心,以避免意外删除重要数据或影响正在运行的服务。
- 数据备份最重要:在执行任何可能删除数据的清理操作(尤其是
docker volume prune或docker system prune -a --volumes)之前,请务必确认你已经备份了所有重要数据。数据卷通常用于数据库、应用程序配置等持久化数据,一旦删除难以恢复。 - 理解命令作用:清楚每个
docker prune命令的具体作用对象和范围。使用-a(all) 和--volumes参数时要特别谨慎。 - 避免删除运行中容器:除非明确意图,否则不要使用
-f(force) 参数强制删除运行中的容器,这可能导致服务中断或数据不一致。 - 生产环境格外小心:在生产环境中执行清理操作前,最好在测试环境验证清理脚本和命令,并选择业务低峰期进行。
清理步骤参考
你可以根据下表推荐的顺序和场景进行清理:
| 顺序 | 操作 | 推荐命令 | 适用场景 |
|---|---|---|---|
| 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 df 和 df -h | 清理后查看空间释放情况 |
日常维护与预防
养成良好的 Docker 使用习惯,可以从源头上减少磁盘空间的过度占用:
- 配置日志轮转:防止容器日志无限增长,这是常见的磁盘空间"杀手"。在
/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 # 再次查看效果