资讯动态

从日志到Docker:详解Linux磁盘空间被占用的6大元凶及清理方案

发布时间:2026/8/4 10:46:52 来源:尧图企业网站定制
从日志到Docker详解Linux磁盘空间被占用的6大元凶及清理方案当你登录服务器准备部署新应用时终端突然弹出No space left on device的红色警告——这种场景对Linux运维人员来说再熟悉不过。磁盘空间如同城市的地下排水系统平时容易被忽视一旦出问题却可能引发连锁反应。本文将带您深入挖掘那些吞噬磁盘空间的隐形杀手并提供可立即上手的解决方案。1. 诊断工具快速定位磁盘黑洞在开始清理之前我们需要一套精准的探测仪。df -h无疑是第一把手术刀它能直观显示各分区的使用情况$ df -h Filesystem Size Used Avail Use% Mounted on /dev/nvme0n1p2 100G 93G 2.1G 98% /当根分区使用率达到98%时就该祭出更精细的分析工具了。ncduNCurses Disk Usage是我最推荐的交互式分析工具安装和使用都非常简单# Debian/Ubuntu系 $ sudo apt install ncdu -y # RHEL/CentOS系 $ sudo yum install ncdu -y # 扫描根目录 $ sudo ncdu /这个工具的优势在于可视化界面树状结构展示目录大小占比交互操作支持直接删除或跳转到可疑目录快速扫描比传统du命令效率提升30%以上对于需要脚本化处理的场景可以组合使用这些命令# 查找大于100MB的文件 $ find / -type f -size 100M -exec ls -lh {} \; # 按修改时间排序 $ find /var/log -type f -exec ls -lt {} | head -n 102. 六大空间杀手及其剿灭方案2.1 失控的日志文件/var/log目录是首要检查对象。某次巡检中我发现一台Nginx服务器的access.log竟然达到了47GB处理日志问题需要分三步走紧急止血# 清空当前日志确保服务支持日志重载 $ sudo truncate -s 0 /var/log/nginx/access.log # 或者使用更安全的方式 $ sudo /var/log/nginx/access.log长期治理 配置/etc/logrotate.d/nginx示例/var/log/nginx/*.log { daily missingok rotate 14 compress delaycompress notifempty create 0640 www-data adm sharedscripts postrotate [ -f /var/run/nginx.pid ] kill -USR1 cat /var/run/nginx.pid endscript }系统日志管理 对于systemd系统定期清理journal日志# 查看日志占用空间 $ journalctl --disk-usage # 保留最近500MB $ sudo journalctl --vacuum-size500M2.2 Docker的存储泄漏Docker就像个贪吃蛇不知不觉就会吞掉大量空间。某生产环境曾因未清理的镜像导致磁盘爆满处理这类问题需要多管齐下镜像清理# 删除所有悬空镜像 $ docker image prune -f # 删除超过30天未使用的镜像 $ docker image prune -a --filter until720h容器日志管理# 查看容器日志大小 $ docker ps -q | xargs docker inspect --format{{.LogPath}} | xargs ls -lh # 全局日志驱动配置/etc/docker/daemon.json { log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 } }存储驱动优化# 查看存储使用情况 $ docker system df # 彻底清理慎用 $ docker system prune --all --volumes2.3 临时文件的僵尸军团/tmp和/var/tmp目录经常成为文件坟场。建议创建定期清理任务# 每日凌晨清理/tmp下超过7天的文件 $ sudo vim /etc/cron.daily/tmpclean #!/bin/sh find /tmp -type f -atime 7 -delete对于关键系统可以使用tmpfs优化# /etc/fstab 添加 tmpfs /tmp tmpfs defaults,noatime,nosuid,nodev,size2G 0 02.4 软件包的缓存废墟不同包管理器的缓存位置包管理器缓存路径清理命令apt/var/cache/apt/archivessudo apt cleanyum/var/cache/yumsudo yum clean allpip~/.cache/pippip cache purgenpm~/.npmnpm cache clean --force2.5 幽灵文件已删除但未释放当df显示空间不足但du统计却正常时可能是被删除的文件仍被进程占用# 查找被删除但仍被占用的文件 $ sudo lsof L1 | grep deleted # 输出示例 nginx 1234 www-data 12w REG 253,0 4294967296 0 10485760 /var/log/nginx.log (deleted)解决方法# 优雅重启相关进程 $ sudo systemctl restart nginx # 如果不知道是哪个进程可以重启服务器生产环境慎用 $ sudo reboot2.6 备份文件的野蛮生长数据库备份脚本是另一个常见陷阱。某MySQL服务器曾因每日全量备份导致磁盘告警优化方案# 改进的备份脚本示例 #!/bin/bash BACKUP_DIR/backups/mysql DATE$(date %Y%m%d) KEEP_DAYS7 # 压缩备份 mysqldump -u backup -ppassword --all-databases | gzip $BACKUP_DIR/full_$DATE.sql.gz # 清理旧备份 find $BACKUP_DIR -name *.gz -type f -mtime $KEEP_DAYS -delete3. 防御性运维构建空间防护体系3.1 实时监控方案配置Prometheus报警规则示例groups: - name: disk.rules rules: - alert: DiskSpaceCritical expr: 100 - (node_filesystem_avail_bytes{mountpoint/} * 100 / node_filesystem_size_bytes{mountpoint/}) 90 for: 5m labels: severity: critical annotations: summary: Critical disk space alert on {{ $labels.instance }} description: {{ $labels.mountpoint }} on {{ $labels.instance }} has only {{ printf %.2f $value }}% free space3.2 自动化清理脚本#!/bin/bash THRESHOLD90 CURRENT$(df / --outputpcent | tail -1 | tr -d % ) if [ $CURRENT -ge $THRESHOLD ]; then echo $(date) - Disk space alert: ${CURRENT}% /var/log/disk_cleaner.log # 执行清理操作 docker image prune -a --filter until24h -f journalctl --vacuum-size200M find /tmp -type f -mtime 3 -delete # 发送通知 echo 清理完成当前使用率: $(df / --outputpcent | tail -1) | \ mail -s 磁盘清理报告 $(hostname) adminexample.com fi3.3 分区规划最佳实践推荐的分区方案针对100GB磁盘挂载点建议大小文件系统说明/20GBext4系统核心/var30GBxfs日志和可变数据/home10GBext4用户数据/data35GBxfs应用数据swap内存1.5倍swap根据内存大小调整4. 高阶技巧深入文件系统层当常规方法无效时可能需要检查文件系统本身# 检查inode使用情况某些场景下inode耗尽会导致类似空间不足的错误 $ df -i # 查找硬链接文件 $ find / -type f -links 3 -exec ls -li {} \; # 检查是否有被隐藏的保留块通常为5% $ tune2fs -l /dev/nvme0n1p2 | grep Reserved block count # 临时调整保留空间紧急情况下 $ sudo tune2fs -m 1 /dev/nvme0n1p2在处理某次Kubernetes节点的磁盘危机时我发现/var/lib/docker/overlay2占据了异常空间。最终解决方案是# 查看各容器实际磁盘占用 $ docker ps -s # 清理无效存储层 $ docker system prune --volumes # 限制Docker日志驱动 $ docker run --log-driverjournald my-image

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价