首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Linux&Docker磁盘占用清理篇2,附带可执行脚本

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

作者头像
做棵大树
发布2026-04-09 21:32:56
发布2026-04-09 21:32:56
980
举报
文章被收录于专栏:代码日志代码日志

“我是大树,一个差点开始放弃折腾的AGI学习与实践者。 最近在探索和从事的事儿:

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

之前写了一篇linux空间占用排查的文章:Linux服务器磁盘占用分析和清理,然后最近发现自己的服务器空间占用又涨起来了,摸索着排查了一次下来,再记录一下。

文末有整理后的 bash脚本 ,希望能给大家一点帮助。skill 因为格式排版问题贴不出来,有兴趣的朋友复制保存到本地,让claude自建一个就行。

一、问题现象

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

代码语言:javascript
复制
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda2        39G   30G  6.6G  83% /
代码语言:javascript
复制

二、排查步骤

三、逐步排查定位空间占用 “ 说明:以下排查命令均为只读操作,不会删除任何数据,可放心执行。 ” 3.1 查看整体磁盘占用分布 sudo du -sh /* 2>/dev/null | sort -hr | head -20

结果示例

代码语言:javascript
复制
19G /var
11G /opt
4.0G    /usr
...

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

3.2 深入分析 /var 目录

代码语言:javascript
复制
sudo du -sh /var/* 2>/dev/null | sort -hr | head -10

结果

代码语言:javascript
复制
17G /var/lib
1.6G    /var/log
...

继续深入 /var/lib

代码语言:javascript
复制
sudo du -sh /var/lib/* 2>/dev/null | sort -hr | head -10

关键发现

代码语言:javascript
复制
17G /var/lib/docker
...

3.3 检查 Docker 的“表面”占用

代码语言:javascript
复制
docker system df

输出

代码语言:javascript
复制
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          12        10        5.193GB   2.024GB (38%)
Containers      10        10        151.4MB   0B (0%)
Local Volumes   0         0         0B        0B
Build Cache     24        0         6.506MB   6.506MB

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

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

代码语言:javascript
复制
sudo du -sh /var/lib/docker/containers/*/*-json.log | sort -hr | head -10

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

3.5 检查系统日志(journald)

代码语言:javascript
复制
journalctl --disk-usage

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

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

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

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

代码语言:javascript
复制
# 删除所有停止的容器
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 查看日志归属容器
代码语言:javascript
复制
sudo du -sh /var/lib/docker/containers/*/*-json.log | sort -hr | while read 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 清空所有容器日志(推荐)
代码语言:javascript
复制
sudo truncate -s 0 /var/lib/docker/containers/*/*-json.log

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

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

编辑 /etc/docker/daemon.json

代码语言:javascript
复制
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "50m",
    "max-file": "3"
  }
}

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

代码语言:javascript
复制
sudo systemctl restart docker

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

代码语言:javascript
复制
# 限制 journal 总大小(例如 200MB)
sudo journalctl --vacuum-size=200M

# 或按时间清理(保留最近 7 天)
sudo journalctl --vacuum-time=7d

4.4 其他常规清理(可选)

代码语言:javascript
复制
# 清理包管理器缓存
sudo apt clean && sudo apt autoremove -y   # Debian/Ubuntu
sudo yum clean all && sudo yum autoremove -y   # CentOS/RHEL

# 清理临时文件
sudo rm -rf /tmp/* /var/tmp/*

# 清理旧内核(Ubuntu/Debian)
sudo apt autoremove --purge

五、常态化检查脚本

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

代码语言:javascript
复制
#!/bin/bash
# 磁盘空间清理脚本 - 安全版(不影响运行中服务)

set -e

LOG_FILE="/var/log/disk_cleanup.log"
echo"[$(date)] 开始磁盘清理" | tee -a $LOG_FILE

# 1. 清理 Docker 停止的容器和悬空镜像
echo">>> 清理 Docker 停止容器..." | tee -a $LOG_FILE
docker container prune -f >> $LOG_FILE 2>&1

echo">>> 清理 Docker 未使用镜像..." | tee -a $LOG_FILE
docker image prune -a -f >> $LOG_FILE 2>&1

echo">>> 清理 Docker 构建缓存..." | tee -a $LOG_FILE
docker builder prune -a -f >> $LOG_FILE 2>&1

# 2. 清理容器日志(清空所有 json 日志文件)
echo">>> 清空容器日志文件..." | tee -a $LOG_FILE
sudo truncate -s 0 /var/lib/docker/containers/*/*-json.log 2>/dev/null || true

# 3. 清理 journal 日志(保留 200MB)
echo">>> 清理 systemd journal..." | tee -a $LOG_FILE
sudo journalctl --vacuum-size=200M >> $LOG_FILE 2>&1

# 4. 清理包管理器缓存(根据发行版选择)
ifcommand -v apt &> /dev/null; then
    echo">>> 清理 apt 缓存..." | tee -a $LOG_FILE
    sudo apt clean >> $LOG_FILE 2>&1
    sudo apt autoremove -y >> $LOG_FILE 2>&1
elifcommand -v yum &> /dev/null; then
    echo">>> 清理 yum 缓存..." | tee -a $LOG_FILE
    sudo yum clean all >> $LOG_FILE 2>&1
    sudo yum autoremove -y >> $LOG_FILE 2>&1
fi

# 5. 清理 /tmp 目录(7 天以上文件)
echo">>> 清理过期临时文件..." | tee -a $LOG_FILE
sudo find /tmp -type f -atime +7 -delete 2>/dev/null || true
sudo find /var/tmp -type f -atime +7 -delete 2>/dev/null || true

# 6. 输出当前磁盘使用情况
echo">>> 当前磁盘使用率:" | tee -a $LOG_FILE
df -h / | tail -1 | tee -a $LOG_FILE

echo"[$(date)] 清理完成" | tee -a $LOG_FILE

赋予执行权限并设置 cron

代码语言:javascript
复制
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/dockerdocker system df 相差不大),可跳过 docker image prune -adocker builder prune -a
  • 如果 journal 日志很小,可跳过 journalctl --vacuum
  • 如果包管理器缓存已清理过,可跳过相关命令。
  • 脚本中的 /tmp 清理可根据需求调整保留时间。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-04-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 做棵大树 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、问题现象
    • 3.2 深入分析 /var 目录
    • 3.3 检查 Docker 的“表面”占用
    • 3.4 检查容器日志文件(常被忽略的大户)
    • 3.5 检查系统日志(journald)
  • 四、安全清理操作(不影响运行中的服务)
    • 4.1 清理 Docker 冗余资源(可跳过:如果 Docker 占用不大)
    • 4.2 清理容器日志文件(必须执行,释放 5GB+)
      • 4.2.1 查看日志归属容器
      • 4.2.2 清空所有容器日志(推荐)
      • 4.2.3 设置日志轮转(防止未来再次占满)
    • 4.3 清理 systemd journal 日志(可跳过:如果占用不大)
    • 4.4 其他常规清理(可选)
  • 五、常态化检查脚本
  • 六、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档