Docker-排查占用磁盘空间大问题

文章目录

概述

最近连续遇到两次,docker占用大量磁盘空间,磁盘告警的情况。把排查过程记录如下。

环境

系统

  • CentOS 7.9
  • Docker 26.1.4

现象

磁盘使用率98%,监控告警。经排查发现都是/var/lib/docker目录下占用的。

bash 复制代码
[root@centos7.9]# du -sh  --exclude="mysql" /var/lib/* | sort -rh
425G     /var/lib/docker
101M    /var/lib/rpm
14M     /var/lib/yum
4.5M    /var/lib/samba
224K    /var/lib/containerd
120K    /var/lib/alternatives
64K     /var/lib/systemd
8.0K    /var/lib/NetworkManager
8.0K    /var/lib/authconfig

......

0       /var/lib/avahi-autoipd

解决

情况1-容器日志大

  1. 使用以下命令排查,发现某个容器日志占用了200G
bash 复制代码
sudo du -sh /var/lib/docker/containers/*/*-json.log | sort -rh
bash 复制代码
[root@centos7 var]# sudo du -sh /var/lib/docker/containers/*/*-json.log | sort -rh
200G     /var/lib/docker/containers/39b55d6c55766a08953411f7dfa88f198779105202d5a07175d07cf26af23765/39b55d6c55766a08953411f7dfa88f198779105202d5a07175d07cf26af23765-json.log
16M     /var/lib/docker/containers/249693a2d4580c375b164af52ba576b6d8ea448179c7496b9f0d94627dec1016/249693a2d4580c375b164af52ba576b6d8ea448179c7496b9f0d94627dec1016-json.log

快速解决-清理日志

  1. 手动清除日志
bash 复制代码
sudo truncate -s 0 /var/lib/docker/containers/39b55d6c55766a08953411f7dfa88f198779105202d5a07175d07cf26af23765/39b55d6c55766a08953411f7dfa88f198779105202d5a07175d07cf26af23765-json.log
  1. 增加cron定时任务
  • 强制清除超过10G的容器日志文件
bash 复制代码
# 查询命令
# find /var/lib/docker/containers/ -name "*-json.log" -size +10G -ls
# 清理任务
0 0 * * *  find /var/lib/docker/containers/ -name "*-json.log" -size +10G -exec truncate -s 0 {} \;

长期解决-限制日志大小

  1. 修改容器配置
bash 复制代码
vim /etc/docker/daemon.json
  • 确认配置支持热加载 "live-restore": true。如果之前未配置,需要配置后重启docker
  • 增加日志限制
    • max-size: "1g":单个日志文件最大 1 GB
    • max-file: "10":最多保留 10 个日志文件
json 复制代码
{
  "live-restore": true,
  "insecure-registries": ["192.168.6.5:5000"],
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://registry.docker-cn.com"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "1g",
    "max-file": "10"
  }
}
  1. 热加载配置(需要预先配置 live-restore,并重启过docker)
bash 复制代码
systemctl reload docker
  1. 重建容器
  • 注意:只有重建后的容器才受到日志限制约束,所以必须销毁并重建容器
bash 复制代码
docker rm -f test-service
bash 复制代码
docker run -d --name test-service ..... 

情况2-构建缓存大

  1. 查看 Docker 整体磁盘使用情况
bash 复制代码
docker system df
# 查看更详细的版本,会列出所有容器、镜像等
#docker system df -v
bash 复制代码
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          7         2         1.693GB   1.431GB 
Containers      2         2         51.04MB   0B (0%)
Local Volumes   0         0         0B        0B
Build Cache     24        0         960B      147.3GB

快速解决-清理缓存

  1. 手动清除48小时以前创建的缓存
bash 复制代码
docker builder prune --filter until=48h -f
  1. 增加cron定时任务
  • 强制清除创建超过7天的缓存
  • 强制清理创建超过30天的系统垃圾
bash 复制代码
# 清理7天前创建的缓存
0 1 * * 0  docker builder prune --filter until=168h -f > /dev/null 2>&1
# 清理30天的创建或停止的镜像、网络、容器及缓存等
0 1 * * 6 /usr/bin/docker system prune -f --filter "until=720h" >> /dev/null 2>&1

长期解决-限制构建缓存大小

  1. 修改容器配置
bash 复制代码
vim /etc/docker/daemon.json
  • 增加构建缓存限制
    • "defaultKeepStorage": "20GB":限制 20GB
json 复制代码
{
  "live-restore": true,
  "insecure-registries": ["192.168.6.5:5000"],
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://registry.docker-cn.com"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "500m",
    "max-file": "5"
  },
  "builder": {
    "gc": {
      "enabled": true,
      "defaultKeepStorage": "20GB"
    }
  }
}
  1. 重启docker生效
bash 复制代码
systemctl restart docker
  1. 查看新策略自动清理结果
bash 复制代码
docker system df -v
相关推荐
weixin_6042366720 小时前
华三 路由器 极简核心配置
运维·服务器·网络·h3c·h3c路由器
鹤落晴春21 小时前
【Linux复习】管理SELinux安全性
linux·运维·服务器
梦梦代码精21 小时前
2026年PHP开源商城系统实测对比:架构、多商户、商用授权,谁才是真·省心?
vue.js·docker·架构·开源·代码规范
AI智图坊21 小时前
多件装组合SKU图的批量生产效率分析:从PS手工到AI自动化的工作流改造
大数据·运维·人工智能·gpt·ai作画·自动化·aigc
鹤落晴春1 天前
【K8s】Pod调度、configMaps
云原生·容器·kubernetes
极客先躯1 天前
高级java每日一道面试题-2026年02月02日-实战篇[Docker]-如何实现容器的持久化存储?
docker·容器·面试宝典·持久化·存储·韵味·java高级面试题
云计算磊哥@1 天前
运维开发宝典026-MySQL02数据库表操作
运维·数据库·运维开发
天天进步20151 天前
Tunnelto 源码解析 #9:控制服务器设计:Warp、WebSocket、Ping/Pong 与连接保活
运维·服务器·websocket
My is 李豆1 天前
CentOS 7 安装 Docker 完整教程(含 docker-compose 插件)
docker·eureka·centos
极客先躯1 天前
高级java每日一道面试题-2026年02月01日-实战篇[Docker]-Docker Volume 的生命周期管理是怎样的?
java·运维·docker·容器·持久化·架构图·容器卷