“我是大树,一个差点开始放弃折腾的AGI学习与实践者。
最近在探索和从事的事儿:
企业自动化、AGI创作与出海:自动化工作流搭建,AI 转型技术咨询 重新拾起自媒体平台,倒逼自己动脑和记录日常的所思所感,不止技术 欢迎大家关注微信公众号
”做棵大树,有想要长期联系的朋友也可以通过公众号菜单栏找到我~
执行 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。
/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...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.506MBDocker 自身统计仅 5.35GB,但 /var/lib/docker 实际占 17GB,差额约 12GB。可能原因:存在悬空的 overlay2 层、未使用的镜像、停止的容器残留、构建缓存等未被 docker system df 完全统计。
sudo du -sh /var/lib/docker/containers/*/*-json.log | sort -hr | head -10发现:存在约 5GB 的容器标准输出日志。
journalctl --disk-usage若占用较大,后续可清理。
“注意:以下所有命令均不会停止或删除正在运行的容器,也不会删除正在使用的镜像或卷。请根据实际情况选择性执行。
”
# 删除所有停止的容器docker container prune -f# 删除未被任何容器使用的镜像(包括悬空镜像和完全未使用的)docker image prune -a -f# 删除未被任何容器引用的卷(谨慎,会丢失数据,建议先确认)docker volume prune -f# 删除构建缓存docker builder prune -a -f执行后再次检查 /var/lib/docker 大小,通常会显著下降。
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"donesudo truncate -s 0 /var/lib/docker/containers/*/*-json.log“为什么用
”truncate而不是rm?rm删除后,Docker 进程仍持有文件句柄,空间不会立即释放,直到容器重启。truncate -s 0立即清空内容,瞬间释放磁盘空间。
编辑 /etc/docker/daemon.json:
{"log-driver": "json-file","log-opts": {"max-size": "50m","max-file": "3" }}重启 Docker(会短暂中断容器,生产环境请谨慎):
sudo systemctl restart docker# 限制 journal 总大小(例如 200MB)sudo journalctl --vacuum-size=200M# 或按时间清理(保留最近 7 天)sudo journalctl --vacuum-time=7d# 清理包管理器缓存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 system df 不一定反映实际磁盘占用,需结合 du -sh /var/lib/docker 确认。truncate 而非 rm 清空正在写入的日志文件。“可跳过步骤汇总:
”
如果 Docker 空间正常( /var/lib/docker与docker system df相差不大),可跳过docker image prune -a和docker builder prune -a。如果 journal 日志很小,可跳过 journalctl --vacuum。如果包管理器缓存已清理过,可跳过相关命令。 脚本中的 /tmp清理可根据需求调整保留时间。