当前位置:首页>Linux>Linux&Docker磁盘占用清理篇2,附带可执行脚本

Linux&Docker磁盘占用清理篇2,附带可执行脚本

  • 2026-08-25 07:09:40
Linux&Docker磁盘占用清理篇2,附带可执行脚本
“

我是大树,一个差点开始放弃折腾的AGI学习与实践者。

最近在探索和从事的事儿:

  • 企业自动化、AGI创作与出海:自动化工作流搭建,AI 转型技术咨询
  • 重新拾起自媒体平台,倒逼自己动脑和记录日常的所思所感,不止技术

欢迎大家关注微信公众号 做棵大树,有想要长期联系的朋友也可以通过公众号菜单栏找到我~

”
之前写了一篇linux空间占用排查的文章:Linux服务器磁盘占用分析和清理,然后最近发现自己的服务器空间占用又涨起来了,摸索着排查了一次下来,再记录一下。
文末有整理后的 bash脚本 ,希望能给大家一点帮助。skill 因为格式排版问题贴不出来,有兴趣的朋友复制保存到本地,让claude自建一个就行。

一、问题现象

执行 df -h 发现根分区 /dev/vda2 已用 83%(30G/39G),可用空间仅剩 6.6G,且系统存在多个 Docker 容器在运行。

$ df -hFilesystem      Size  Used Avail Use% Mounted on/dev/vda2        39G   30G  6.6G  83% /

二、排查步骤

三、逐步排查定位空间占用

“

说明:以下排查命令均为只读操作,不会删除任何数据,可放心执行。

”

3.1 查看整体磁盘占用分布

sudo du -sh /* 2>/dev/null | sort -hr | head -20

结果示例:

19G /var11G /opt4.0G    /usr...

结论:/var 和 /opt 占用最大,其中 /var 达 19G。

3.2 深入分析 /var 目录

sudo du -sh /var/* 2>/dev/null | sort -hr | head -10

结果:

17G /var/lib1.6G    /var/log...

继续深入 /var/lib:

sudo du -sh /var/lib/* 2>/dev/null | sort -hr | head -10

关键发现:

17G /var/lib/docker...

3.3 检查 Docker 的“表面”占用

docker system df

输出:

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLEImages          12        10        5.193GB   2.024GB (38%)Containers      10        10        151.4MB   0B (0%)Local Volumes   0         0         0B        0BBuild Cache     24        0         6.506MB   6.506MB

Docker 自身统计仅 5.35GB,但 /var/lib/docker 实际占 17GB,差额约 12GB。可能原因:存在悬空的 overlay2 层、未使用的镜像、停止的容器残留、构建缓存等未被 docker system df 完全统计。

3.4 检查容器日志文件(常被忽略的大户)

sudo du -sh /var/lib/docker/containers/*/*-json.log | sort -hr | head -10

发现:存在约 5GB 的容器标准输出日志。

3.5 检查系统日志(journald)

journalctl --disk-usage

若占用较大,后续可清理。

四、安全清理操作(不影响运行中的服务)

“

注意:以下所有命令均不会停止或删除正在运行的容器,也不会删除正在使用的镜像或卷。请根据实际情况选择性执行。

”

4.1 清理 Docker 冗余资源(可跳过:如果 Docker 占用不大)

# 删除所有停止的容器docker container prune -f# 删除未被任何容器使用的镜像(包括悬空镜像和完全未使用的)docker image prune -a -f# 删除未被任何容器引用的卷(谨慎,会丢失数据,建议先确认)docker volume prune -f# 删除构建缓存docker builder prune -a -f

执行后再次检查 /var/lib/docker 大小,通常会显著下降。

4.2 清理容器日志文件(必须执行,释放 5GB+)

4.2.1 查看日志归属容器

sudo du -sh /var/lib/docker/containers/*/*-json.log | sort -hr | whileread size path; do    container_id=$(echo$path | cut -d'/' -f6)    container_info=$(docker ps -a --filter "id=$container_id" --format "{{.Names}} ({{.Image}})" 2>/dev/null)echo"$size$container_info"done

4.2.2 清空所有容器日志(推荐)

sudo truncate -s 0 /var/lib/docker/containers/*/*-json.log
“

为什么用 truncate 而不是 rm?rm 删除后,Docker 进程仍持有文件句柄,空间不会立即释放,直到容器重启。truncate -s 0 立即清空内容,瞬间释放磁盘空间。

”

4.2.3 设置日志轮转(防止未来再次占满)

编辑 /etc/docker/daemon.json:

{"log-driver": "json-file","log-opts": {"max-size": "50m","max-file": "3"  }}

重启 Docker(会短暂中断容器,生产环境请谨慎):

sudo systemctl restart docker

4.3 清理 systemd journal 日志(可跳过:如果占用不大)

# 限制 journal 总大小(例如 200MB)sudo journalctl --vacuum-size=200M# 或按时间清理(保留最近 7 天)sudo journalctl --vacuum-time=7d

4.4 其他常规清理(可选)

# 清理包管理器缓存sudo apt clean && sudo apt autoremove -y   # Debian/Ubuntusudo yum clean all && sudo yum autoremove -y   # CentOS/RHEL# 清理临时文件sudo rm -rf /tmp/* /var/tmp/*# 清理旧内核(Ubuntu/Debian)sudo apt autoremove --purge

五、常态化检查脚本

将以下脚本保存为 disk_cleanup.sh,设置定时任务(如每周执行)可自动保持磁盘健康。

#!/bin/bash# 磁盘空间清理脚本 - 安全版(不影响运行中服务)set -eLOG_FILE="/var/log/disk_cleanup.log"echo"[$(date)] 开始磁盘清理" | tee -a $LOG_FILE# 1. 清理 Docker 停止的容器和悬空镜像echo">>> 清理 Docker 停止容器..." | tee -a $LOG_FILEdocker container prune -f >> $LOG_FILE 2>&1echo">>> 清理 Docker 未使用镜像..." | tee -a $LOG_FILEdocker image prune -a -f >> $LOG_FILE 2>&1echo">>> 清理 Docker 构建缓存..." | tee -a $LOG_FILEdocker builder prune -a -f >> $LOG_FILE 2>&1# 2. 清理容器日志(清空所有 json 日志文件)echo">>> 清空容器日志文件..." | tee -a $LOG_FILEsudo truncate -s 0 /var/lib/docker/containers/*/*-json.log 2>/dev/null || true# 3. 清理 journal 日志(保留 200MB)echo">>> 清理 systemd journal..." | tee -a $LOG_FILEsudo journalctl --vacuum-size=200M >> $LOG_FILE 2>&1# 4. 清理包管理器缓存(根据发行版选择)ifcommand -v apt &> /dev/null; thenecho">>> 清理 apt 缓存..." | tee -a $LOG_FILE    sudo apt clean >> $LOG_FILE 2>&1    sudo apt autoremove -y >> $LOG_FILE 2>&1elifcommand -v yum &> /dev/null; thenecho">>> 清理 yum 缓存..." | tee -a $LOG_FILE    sudo yum clean all >> $LOG_FILE 2>&1    sudo yum autoremove -y >> $LOG_FILE 2>&1fi# 5. 清理 /tmp 目录(7 天以上文件)echo">>> 清理过期临时文件..." | tee -a $LOG_FILEsudo find /tmp -type f -atime +7 -delete 2>/dev/null || truesudo find /var/tmp -type f -atime +7 -delete 2>/dev/null || true# 6. 输出当前磁盘使用情况echo">>> 当前磁盘使用率:" | tee -a $LOG_FILEdf -h / | tail -1 | tee -a $LOG_FILEecho"[$(date)] 清理完成" | tee -a $LOG_FILE

赋予执行权限并设置 cron:

chmod +x disk_cleanup.sh# 每周日凌晨 3 点执行sudo crontab -e# 添加一行:0 3 * * 0 /path/to/disk_cleanup.sh

六、总结

这次排查清理过程共释放约 12GB 空间,主要来源:

  • Docker 悬空层和未使用镜像(约 7GB)
  • 容器标准输出日志(约 5GB)
  • systemd journal 日志(根据设置释放数百 MB)

关键经验:

  1. docker system df 不一定反映实际磁盘占用,需结合 du -sh /var/lib/docker 确认。
  2. 容器日志是常见“隐形杀手”,应配置日志轮转或定期清空。
  3. 使用 truncate 而非 rm 清空正在写入的日志文件。
  4. 定期运行自动化脚本可避免磁盘占满导致服务故障。
“

可跳过步骤汇总:

  • 如果 Docker 空间正常(/var/lib/docker 与 docker system df 相差不大),可跳过 docker image prune -a 和 docker builder prune -a。
  • 如果 journal 日志很小,可跳过 journalctl --vacuum。
  • 如果包管理器缓存已清理过,可跳过相关命令。
  • 脚本中的 /tmp 清理可根据需求调整保留时间。
”

推荐阅读
Linux服务器磁盘占用分析和清理
再来一篇Docker磁盘占用分析与安全清理的参考
AI笔记戒指Vocci Ring开售:通往AI Agent的最短物理路径?

最新文章

随机文章