Docker 镜像容器自动清理教程
搬瓦工 VPS 的磁盘空间通常有限,特别是入门方案只有 20GB SSD。Docker 在日常使用中会积累大量的废弃镜像、停止的容器、无用的网络和悬空数据卷,如果不定期清理,很快就会耗尽磁盘空间。本文将全面介绍 Docker 资源清理的各种方法,以及如何设置自动化清理策略。
一、了解 Docker 磁盘占用
在清理之前,首先需要了解 Docker 占用了多少磁盘空间:
# 查看 Docker 总体磁盘使用情况
docker system df
# 查看详细信息(包括每个镜像和容器)
docker system df -v
该命令会显示镜像(Images)、容器(Containers)、数据卷(Volumes)和构建缓存(Build Cache)各自的占用空间,以及可回收的空间大小。
Docker 数据默认存储在 /var/lib/docker/ 目录下。你可以使用 du 命令查看具体占用:
du -sh /var/lib/docker/
du -sh /var/lib/docker/overlay2/
du -sh /var/lib/docker/volumes/
du -sh /var/lib/docker/image/
二、手动清理方法
2.1 清理停止的容器
# 查看所有停止的容器
docker ps -a --filter "status=exited"
# 删除所有停止的容器
docker container prune -f
# 删除指定容器
docker rm container_id
2.2 清理悬空镜像
悬空镜像(dangling images)是指没有标签、不被任何容器引用的镜像层:
# 查看悬空镜像
docker images -f "dangling=true"
# 删除悬空镜像
docker image prune -f
# 删除所有未被使用的镜像(包括有标签但未被容器引用的)
docker image prune -a -f
2.3 清理无用网络
# 查看所有网络
docker network ls
# 删除未使用的网络
docker network prune -f
2.4 清理无主数据卷
# 查看所有数据卷
docker volume ls
# 查看悬空数据卷
docker volume ls -f "dangling=true"
# 删除悬空数据卷(谨慎操作)
docker volume prune -f
注意:数据卷可能包含重要数据,在清理前务必确认不再需要。
2.5 一键清理所有未使用资源
# 清理停止的容器、悬空镜像和未使用的网络
docker system prune -f
# 更彻底的清理(包括未使用的镜像和数据卷)
docker system prune -a --volumes -f
三、按时间清理
Docker 支持按时间过滤资源,可以只清理超过指定时间的旧资源:
# 清理24小时前创建的停止容器
docker container prune -f --filter "until=24h"
# 清理7天前的悬空镜像
docker image prune -f --filter "until=168h"
# 清理30天前的所有未使用镜像
docker image prune -a -f --filter "until=720h"
# 综合清理:删除超过48小时的未使用资源
docker system prune -f --filter "until=48h"
四、设置定时自动清理
4.1 使用 Crontab 定时清理
在搬瓦工 VPS 上设置定时任务,自动清理 Docker 资源:
# 创建清理脚本
cat > /opt/docker-cleanup.sh <<'EOF'
#!/bin/bash
echo "=== Docker Cleanup Start: $(date) ==="
# 删除停止超过24小时的容器
docker container prune -f --filter "until=24h"
# 删除7天前的悬空镜像
docker image prune -f --filter "until=168h"
# 删除未使用的网络
docker network prune -f
# 清理构建缓存(保留最近7天)
docker builder prune -f --filter "until=168h"
# 显示清理后的磁盘使用
echo "=== Disk Usage After Cleanup ==="
docker system df
df -h /var/lib/docker/
echo "=== Docker Cleanup End: $(date) ==="
EOF
chmod +x /opt/docker-cleanup.sh
# 添加定时任务:每天凌晨3点执行清理
crontab -e
# 添加以下行:
# 0 3 * * * /opt/docker-cleanup.sh >> /var/log/docker-cleanup.log 2>&1
4.2 使用 Docker 容器定时清理
也可以部署一个专门的清理容器:
cat > /opt/docker-gc/docker-compose.yml <<'EOF'
services:
docker-gc:
image: clockworksoul/docker-gc-cron:latest
container_name: docker-gc
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- CRON=0 3 * * *
- FORCE_IMAGE_REMOVAL=1
- FORCE_CONTAINER_REMOVAL=1
- GRACE_PERIOD_SECONDS=86400
- DRY_RUN=0
- CLEAN_UP_VOLUMES=1
EOF
cd /opt/docker-gc && docker compose up -d
五、配置 Docker 日志轮转
Docker 容器日志也是磁盘空间的主要消耗者。配置日志轮转可以防止日志文件无限增长:
# 编辑 Docker 守护进程配置
cat > /etc/docker/daemon.json <<'EOF'
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"storage-driver": "overlay2"
}
EOF
# 重启 Docker 使配置生效
systemctl daemon-reload
systemctl restart docker
此配置限制每个容器的日志文件最大 10MB,最多保留 3 个文件,总计不超过 30MB。注意此配置只对新创建的容器生效,已有容器需要重建。
清理现有容器的大日志文件
# 查找最大的日志文件
find /var/lib/docker/containers/ -name "*-json.log" -exec ls -lh {} \; | sort -k5 -h
# 清空特定容器的日志(不影响容器运行)
truncate -s 0 /var/lib/docker/containers/容器ID/容器ID-json.log
# 清空所有容器日志
find /var/lib/docker/containers/ -name "*-json.log" -exec truncate -s 0 {} \;
六、磁盘空间监控告警
设置一个简单的磁盘空间监控脚本,在空间不足时自动触发清理:
cat > /opt/disk-monitor.sh <<'EOF'
#!/bin/bash
THRESHOLD=80
USAGE=$(df /var/lib/docker/ | tail -1 | awk '{print $5}' | sed 's/%//')
if [ "$USAGE" -gt "$THRESHOLD" ]; then
echo "$(date): Disk usage ${USAGE}% exceeds threshold ${THRESHOLD}%, starting cleanup..."
docker system prune -f --filter "until=24h"
docker image prune -a -f --filter "until=168h"
echo "$(date): Cleanup completed. Current usage: $(df /var/lib/docker/ | tail -1 | awk '{print $5}')"
fi
EOF
chmod +x /opt/disk-monitor.sh
# 每小时检查一次
# 在 crontab 中添加:
# 0 * * * * /opt/disk-monitor.sh >> /var/log/disk-monitor.log 2>&1
七、常见问题
清理后磁盘空间未释放
# 确认没有进程占用已删除的文件
lsof +D /var/lib/docker/ | grep deleted
# 重启 Docker 释放所有句柄
systemctl restart docker
/var/lib/docker/overlay2 占用过大
这通常是由于容器内部生成了大量临时文件。除了清理外,建议在应用层面控制文件生成,或使用 tmpfs 挂载临时目录。
总结
对于搬瓦工 VPS 用户来说,定期清理 Docker 资源是保持系统正常运行的必要操作。建议结合定时脚本和磁盘监控,实现自动化的清理策略。你还可以使用 Dive 分析镜像层来优化镜像大小,或参考 数据卷管理教程 合理管理持久化数据。选购搬瓦工 VPS 请访问 bwh81.net,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的折扣。