问题背景
容器运行时(如Docker、Podman)会缓存拉取的镜像层、中间构建结果以及已停止容器的文件系统,长期积累可能导致磁盘空间被大量冗余文件占用。特别是开发或CI/CD环境中,频繁构建和拉取镜像容易产生数十GB的废弃数据。
清理前的检查
执行清理操作前,建议先评估当前磁盘占用状况:
- 查看总占用:
docker system df 或 podman system df - 分析镜像、容器、卷和构建缓存:
docker system df -v - 确认正在运行的容器:
docker ps,避免误删关联数据
常用清理命令
安全的最低清理
只清理悬垂镜像(无标签且无依赖的镜像层):
docker image prune
podman image prune
清理所有未使用的资源
包括停止的容器、未使用的网络、悬垂镜像和构建缓存:
docker system prune -a
podman system prune -a
加 -f 可跳过确认提示。
定向清理构建缓存
Docker BuildKit 缓存:docker builder prune
Podman 构建缓存:podman system prune --build
手动清理残留文件
当极端冗余或命令无法释放全部空间时,可手动操作:
- 停止所有容器:
docker stop $(docker ps -aq) - 删除所有容器:
docker rm $(docker ps -aq)(确认无重要数据) - 清理存储目录(以root执行):
- Docker:
rm -rf /var/lib/docker/overlay2/* 注意会保留 image 子目录,建议用 docker system prune 替代 - Podman:
rm -rf /var/lib/containers/storage/overlay/*
- 重建默认存储:重启Docker daemon后执行
docker system prune -af 并 docker image ls 确认
自动化与定期清理
推荐通过 cron 或 systemd timer 定期执行:
# 每天凌晨3点清理悬垂镜像和构建缓存(保留最近24小时的运行容器)
0 3 * * * /usr/bin/docker system prune -f --filter "until=24h"
可调整过滤条件,如 --filter "label!=keep" 保留特定标签资源。
注意事项
- 不要直接删除
/var/lib/docker 目录,可能导致容器和镜像元数据丢失。 - 使用前备份重要卷数据,
docker volume prune 会删除匿名卷。 - 区分容器运行时与镜像缓存:
docker container prune 仅移除停止容器,不影响镜像。 - 检查符号链接:若将存储目录挂载为软链接,清理前需确认链接目标。