Docker 磁盘空间不足时,最稳妥的做法是先使用 docker system df 查看占用分布,再根据是否保留停止的容器和未使用的卷选择 prune 命令。生产环境务必先备份数据再执行清理。
先说结论:清理操作不可逆,尤其是卷和数据容器,务必先确认哪些数据不再需要再执行删除命令。
- 先看:用 docker system df 确认空间被镜像、容器还是卷占用
- 先做:停止不再需要的容器,备份重要数据卷
- 建议:生产环境避免使用 -a 参数一次性清理所有未使用镜像,防止误删回滚版本
- 注意:Windows 用户请使用绝对路径,避免使用 $(pwd) 等 Linux shell 变量
核心清理命令
# 查看磁盘使用情况
docker system df
# 清理停止的容器、dangling 镜像、未使用的网络(安全)
docker system prune
# 清理所有未使用的镜像(不仅仅是 dangling,慎用)
docker system prune -a
# 清理未使用的卷(危险,会删除数据)
docker volume prune
# 清理构建缓存
docker builder prune实操步骤
第一步:检查当前占用
执行 docker system df 查看 Images、Containers、Volumes 和 Build Cache 的具体占用大小。
第二步:停止并备份
确认哪些容器不再需要。对于数据卷,建议先备份重要数据。Windows 用户请使用绝对路径,Linux 用户可使用 $(pwd)。
第三步:执行清理
根据检查结果选择命令。如果只想清理 dangling 镜像和停止的容器,使用 docker system prune。如果需要清理所有未使用的镜像,加上 -a。如果确定卷无用,再执行 docker volume prune。
数据卷备份方案
清理卷之前,建议将重要数据卷打包备份。以下命令将卷内容备份到宿主机当前目录。
# Linux/Mac (支持 $(pwd))
docker run `--rm` -v 卷名:/data -v $(pwd):/backup alpine tar czf /backup/vol.tar.gz -C /data .
# Windows CMD (使用绝对路径)
docker run `--rm` -v 卷名:/data -v D:/backup:/backup alpine tar czf /backup/vol.tar.gz -C /data .
# PowerShell (使用绝对路径)
docker run `--rm` -v 卷名:/data -v C:/backup:/backup alpine tar czf /backup/vol.tar.gz -C /data .注意:请将“卷名”替换为实际卷名,将路径替换为实际存在的目录。
高级用法:按时间过滤
如果只想清理特定时间之前产生的无用资源,可以使用 `--filter` 参数。
# 清理 24 小时前创建的悬空镜像和停止容器
docker system prune `--filter` "until=24h"
# 清理特定标签之前的镜像
docker image prune `--filter` "until=2023-01-01T00:00:00"跨平台注意事项与常见坑
1. 路径兼容性:Linux 命令中的 $(pwd) 在 Windows CMD 中无效,会导致备份路径错误。Windows 用户建议直接使用绝对路径(如 D:/docker/backup)。
2. 误删数据卷:docker volume prune 会删除所有未被容器挂载的卷。如果某些容器只是停止状态但未来需要启动,其关联的数据卷会被清除,导致数据丢失。
3. 误删回滚镜像:使用 docker system prune -a 会删除所有未被运行容器使用的镜像,包括你保留用于快速回滚的旧版本镜像。
4. 构建缓存误判:清理构建缓存可能影响后续构建速度,但通常不影响运行中的容器。
怎么验证是否生效
再次运行 docker system df 对比清理前后的 SIZE 列数值。同时可以使用 df -h (Linux/Mac) 或资源管理器 (Windows) 查看宿主机的磁盘挂载点使用情况是否回升。
参考来源
- Docker 官方文档 - Manage disk space: https://docs.docker.com/config/pruning/
- Docker 官方文档 - docker system prune: https://docs.docker.com/engine/reference/commandline/system_prune/