docker system prune 详解

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

最佳实践

  1. 定期清理:设置自动清理计划
  2. 先查看再清理:使用 docker system df 预览
  3. 保留最近资源:使用 --filter "until=..."
  4. 不要随意清理卷docker volume prune 慎重使用
  5. CI 环境中彻底清理prune -a + builder prune

docker system prune 是 Docker 空间管理的瑞士军刀,合理使用可以保持系统干净整洁。

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容