docker system prune 详解
什么是 docker system prune
docker system prune 是 Docker 的清理命令,用于删除不再使用的 Docker 资源(容器、网络、镜像、构建缓存等),释放磁盘空间。它是 Docker 维护中最常用的命令之一。
基本用法
# 交互式确认删除
docker system prune
# 直接删除,不提示
docker system prune -f
# 删除所有未使用的资源(包括镜像)
docker system prune -a
不同维度的清理
只清理容器
# 清理所有已停止的容器
docker container prune
# 清理 24 小时前停止的容器
docker container prune --filter "until=24h"
只清理镜像
# 清理未被任何容器使用的镜像(dangling images)
docker image prune
# 清理所有未被使用的镜像
docker image prune -a
# 清理 7 天前的镜像
docker image prune -a --filter "until=168h"
只清理网络
# 清理未被容器使用的网络
docker network prune
# 清理 24 小时前创建且未使用的网络
docker network prune --filter "until=24h"
只清理卷
# 清理未被容器使用的卷
docker volume prune
# 注意:卷默认不会被 docker system prune 删除!
# 需要使用 --volumes 标志
只清理构建缓存
# 清理 BuildKit 构建缓存
docker builder prune
# 清理所有构建缓存
docker builder prune -a
docker system prune 参数详解
# 完整命令
docker system prune [OPTIONS]
# 常用选项
-f, --force # 不提示确认
-a, --all # 删除所有未使用的资源,不仅仅是 dangling
--filter # 按条件过滤
--volumes # 同时删除未使用的卷
# 实际使用
docker system prune -a --volumes -f
清理对象详解
什么是 dangling 资源
# Dangling images: 没有标签的镜像层
docker images -f "dangling=true"
# REPOSITORY TAG IMAGE ID
# abc123
# Dangling volumes
docker volume ls -f "dangling=true"
prune 删除的资源
docker system prune 删除:
- 所有已停止的容器
- 所有未使用的网络
- 所有 dangling 镜像
- 所有 dangling 构建缓存
docker system prune -a 额外删除:
- 未被任何容器引用的镜像
- 所有构建缓存
docker system prune --volumes 额外删除:
- 未被任何容器使用的卷
使用 filter 精细控制
# 按时间过滤
docker system prune -a --filter "until=24h"
docker system prune --filter "until=168h"
# 按标签过滤
docker system prune --filter "label!=keep"
docker system prune --filter "label=maintained=no"
# 按条件组合
docker system prune --filter "until=24h" --filter "label=environment=dev"
安全使用策略
1. 先查看再删除
# 查看将删除的资源
docker system df
# 查看各部分占用空间
docker system df -v
# TYPE TOTAL ACTIVE SIZE RECLAIMABLE
# Images 10 3 2.345GB 1.234GB (52%)
# Containers 8 2 1.234KB 0B (0%)
# Local Volumes 5 2 500MB 300MB (60%)
# Build Cache 0B 0B
2. 使用 dry-run 风格
# docker 没有 dry-run 选项
# 可以先使用不带 -f 的命令预览
docker system prune -a # 会列出要删除的内容,等待确认
3. 设定保留策略
# 保留最近 7 天的构建
docker system prune -a --filter "until=168h"
# 保留当前使用的镜像
# prune -a 不会删除正在使用的镜像
自动化清理
cron 任务
# crontab -e
# 每日凌晨 3 点清理
0 3 * * * docker system prune -af --filter "until=24h"
# 每周日清理未使用的镜像
0 4 * * 0 docker image prune -af
systemd timer
# /etc/systemd/system/docker-cleanup.service
[Unit]
Description=Docker Cleanup
[Service]
Type=oneshot
ExecStart=/usr/bin/docker system prune -af
# /etc/systemd/system/docker-cleanup.timer
[Unit]
Description=Docker Cleanup Timer
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
磁盘空间分析
# 总览
docker system df
docker system df -v
# 查看容器日志大小
ls -lh /var/lib/docker/containers/*/*-json.log
# 查看镜像大小
docker images --format "{{.Repository}}:{{.Tag}}: {{.Size}}"
# 查看卷大小
du -sh /var/lib/docker/volumes/*/
实际场景
日常开发
# 每天结束前清理
docker system prune -f
# 清理后查看空间
docker system df
CI/CD 环境
# 构建前后清理
docker system prune -af --filter "until=1h"
docker builder prune -af
磁盘空间告警
#!/bin/bash
# check-disk-and-clean.sh
THRESHOLD=80
USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ "$USAGE" -gt "$THRESHOLD" ]; then
echo "Disk usage at ${USAGE}%, cleaning..."
docker system prune -af --volumes
docker builder prune -af
echo "Cleanup complete"
fi
常见问题
# 问题:prune 后空间没有释放
# 可能原因:
# 1. 日志文件未清理(docker logs)
# 2. 有容器在运行
# 3. 文件被进程占用
# 解决方案:
docker container prune
docker image prune -a
docker volume prune
sudo journalctl --vacuum-size=100M
最佳实践
- 定期清理:设置自动清理计划
- 先查看再清理:使用
docker system df预览 - 保留最近资源:使用
--filter "until=..." - 不要随意清理卷:
docker volume prune慎重使用 - CI 环境中彻底清理:
prune -a+builder prune
docker system prune 是 Docker 空间管理的瑞士军刀,合理使用可以保持系统干净整洁。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END


暂无评论内容