资讯详情

资讯详情

服务器磁盘被 Docker 容器打满?五步精准定位元凶

适用场景/var/lib/docker 所在分区 100%、kubelet 驱逐 Pod、容器无法启动核心手段df 全局定位 → du 目录排查 → docker system df -v 容器级分析 → overlay2 深挖 → 幽灵文件排查核心诉求快速找到是哪个容器、哪个目录占用了磁盘一、背景与问题Docker 容器运行时如果缺乏治理磁盘会在不知不觉中就被占满。常见原因容器日志无限制增长json-file 驱动没配 max-size单容器日志轻松破百 GB。容器可写层暴增应用往容器内部写数据比如 AI 训练中间文件、pip cache、数据集直接下载到容器层。镜像堆积长期不清理无用镜像占用几十 GB。overlay2 层缓存已删除容器但文件句柄未释放空间不回收。磁盘满了之后kubelet 会开始驱逐 PodDocker 无法创建新容器节点直接 NotReady。所以定位要快、要准。二、第一步全局确认磁盘占用查看所有挂载点使用情况。df-Th重点关注/var/lib/docker所在的分区。如果Use%显示 100% 或 99%说明就是这里的问题。参数含义-T显示文件系统类型-h人类可读格式G/M/K三、第二步定位到 Docker 子目录确认是/var/lib/docker分区占满后逐层排查哪个子目录是占用大户查看 /var/lib/docker 下各子目录占用du-h-x--max-depth1/var/lib/docker典型输出示例3.1T /var/lib/docker/overlay2 50G /var/lib/docker/containers 2G /var/lib/docker/images子目录说明常见占满磁盘原因overlay2/容器可写层 镜像层应用数据写入容器内部、pylance 缓存、condacontainers/容器日志json-file日志没限制大小单文件几百 GBimages/镜像存储镜像堆积未清理volumes/匿名/命名卷卷内数据未清理四、第三步容器级精准定位4.1 Docker system df -v最推荐dockersystemdf-v这个命令会输出三类信息Images 部分每个镜像的大小和占用空间Containers 部分每个容器的可写层大小Size列就是该容器占用的空间Local Volumes 部分卷占用重点关注Containers部分的Size列直接告诉你哪个容器占用了多少磁盘。4.2 按容器大小排序补充手段查看所有运行容器的磁盘占用包括可写层。dockerps-s输出中size是容器可写层大小virtual size是可写层 共享镜像层。4.3 进入容器定位具体文件找到占用大户容器后进一步定位是哪个目录方法 1通过 Docker inspect 找到容器 merged 目录dockerinspectcontainer-id|grepMergedDir方法 2直接进容器看dockerexec-itcontainer-iddu-h-x--max-depth2/2/dev/nullsort-hrhead-10五、第四步overlay2 层深度排查进阶如果docker system df -v看不出明细直接进 overlay2 目录逐层排查cd/var/lib/docker/overlay2du-h-x--max-depth1sort-hrhead-10找到最大的那个 long ID 目录反查属于哪个容器用 overlay2 的目录名前缀反查dockerps-a--no-trunc|grepoverlay2-id-prefix然后进 diff 目录看具体文件du-h-x--max-depth2/var/lib/docker/overlay2/id/diffsort-hrhead-10六、第五步排查“已删除但仍占空间”的幽灵文件有时候du和df显示不一致——du看总量没那么大但df说分区满了。这是有进程持有了已删除文件的句柄空间不会真正释放查找被删除但仍被占用的文件lsof|grepdeleted找到对应 PID 后 kill 或重启对应容器释放空间七、应急清理方案定位完之后场景清理命令风险容器日志太大truncate -s 0 /var/lib/docker/containers/*/*-json.log无日志清零已停止的容器docker container prune低容器已停无用镜像docker image prune -a中下次需重新拉取全部清理慎用docker system prune -a --volumes高会删卷和所有未用镜像八、避坑清单现象排查点df 100% 但 du 总量对不上lsof | grep deleted查幽灵文件Docker system df 卡住Docker daemon 异常重启 Docker 或等 API 响应overlay2 单个目录 3T查.vscode-server/Pylance、Conda、数据集容器日志几百 GBjson-file 没配 max-size需改 daemon.json清理完空间没释放有进程持文件句柄kill 对应进程kubelet 驱逐 Pod磁盘压力触发 eviction优先清理容器日志九、小结定位 Docker 占满磁盘的黄金路径df -Th确认哪个分区满了du -h -x --max-depth1 /var/lib/docker定位到子目录docker system df -v直接看到哪个容器吃了多少docker exec du进容器定位具体文件lsof | grep deleted排查幽灵文件有问题的在评论区贴报错我看到会回。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →