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% 的折扣。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。