一次 GitLab 无法启动的排查:Docker 日志把 500G 磁盘打满


一次 GitLab 无法启动的排查:Docker 日志把 500G 磁盘打满

一、问题现象

重启 GitLab 容器时报错:

bash 复制代码
Error response from daemon: Cannot restart container gitlab: 
open /data/docker/containers/.../.tmp-resolv.conf.hash: no space left on device

第一眼看起来像:

  • GitLab 容器损坏
  • Docker 崩溃
  • 网络异常

但真正的核心报错只有一句话:

no space left on device


二、第一步:确认磁盘状态

执行:

bash 复制代码
df -h

结果:

bash 复制代码
/dev/vdb   500G  500G  260K  100%  /data

结论:

/data 磁盘 500G 已经 100% 打满。

而 Docker 数据目录就在:

bash 复制代码
/data/docker

三、第二步:定位大目录

bash 复制代码
du -sh /data/* | sort -rh

结果:

bash 复制代码
354G   /data/docker
97G    /data/ai_iot
7.3G   /data/gitlab

可以看到:

Docker 占用了 354G。


四、第三步:继续细分 Docker 目录

bash 复制代码
du -sh /data/docker/* | sort -rh

结果:

bash 复制代码
204G   /data/docker/containers
149G   /data/docker/overlay2

关键问题找到了:

/data/docker/containers 占用了 204G。


五、containers 目录是什么?

这个目录主要存储:

bash 复制代码
/data/docker/containers/<container_id>/*-json.log

也就是:

Docker 容器运行日志文件

Docker 默认使用 json-file 作为日志驱动:

  • 不限制日志大小
  • 不自动轮转
  • 持续追加写入

如果是 CI 服务,比如:

  • GitLab
  • GitLab Runner

构建日志会非常巨大。


六、确认具体日志文件

可以查看最大日志:

bash 复制代码
ls -lh /data/docker/containers/*/*-json.log | sort -k5 -rh | head

通常会发现某个容器日志达到几十甚至上百 GB。


七、紧急处理方案(安全)

清空日志:

bash 复制代码
truncate -s 0 /data/docker/containers/*/*-json.log

特点:

  • ✅ 不删除容器
  • ✅ 不删除数据
  • ✅ 不影响运行
  • ✅ 立即释放空间

执行后:

bash 复制代码
df -h

会看到磁盘空间立即恢复。

然后重启容器:

bash 复制代码
docker restart gitlab

八、根本原因

Docker 默认日志策略:

text 复制代码
log-driver: json-file
无大小限制
无轮转
无限增长

时间一长必然爆盘。


九、长期解决方案(必须做)

编辑:

bash 复制代码
/etc/docker/daemon.json

加入:

json 复制代码
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  }
}

然后重启 Docker:

bash 复制代码
systemctl restart docker

效果:

  • 单个日志文件最大 100MB
  • 最多保留 3 个
  • 自动轮转
  • 不会再爆盘

十、经验总结

这次问题本质不是:

  • ❌ GitLab 损坏
  • ❌ 容器崩溃
  • ❌ Docker Bug

而是:

Docker 日志无限增长导致磁盘打满。

排查思路总结:

  1. 先看 df -h
  2. 找最大目录 du -sh
  3. 定位 Docker 子目录
  4. 判断是 overlay / image / containers
  5. 针对性处理

十一、推荐运维建议

如果服务器长期运行:

  • 必须设置 Docker 日志限制
  • 定期执行 docker system prune
  • 监控磁盘使用率
  • 对 CI 构建日志进行控制

否则爆盘只是时间问题。


结语

这类问题非常常见,但容易被误判为:

  • GitLab 故障
  • Docker 崩溃
  • 容器异常

其实 90% 的情况只是:

磁盘满了。

希望这次排查过程能帮到遇到类似问题的人。


相关推荐
营养充电站1 天前
KMP全栈开发:从Android到AI Agent的技术演进与实践
人工智能·算法·docker·jupyter
小义_1 天前
K8s 全网高频常用命令大全
docker·容器·kubernetes
技术小结-李爽1 天前
【工具】git与gitee和gitlab和github等等有什么区别?
git·gitee·gitlab
兵bing1 天前
Docker Compose 配置文件归纳总结-千问
运维·docker·容器
蓝田~1 天前
Java镜像1.2GB→200MB的瘦身之路:Docker多阶段构建+K8s Pod OOMKilled(137)排查,后端部署避坑指南
java·docker·kubernetes
TechWJ1 天前
Excel报表越做越乱?用Metabase搭建可更新的数据仪表盘
docker·数据分析·excel·metabase·报表工具
java_logo2 天前
Docker 部署 NetBox:轻松搭建 IPAM / DCIM 网络资产管理平台
docker·容器·轩辕镜像·netbox部署·netbox部署方案·netbox部署文档·docker部署netbox
码农阿豪2 天前
【金仓数据库征文】Mac开发环境|SpringBoot3 + MyBatisPlus对接KES V9 Docker实战全指南
数据库·macos·docker
PC2005-cloud2 天前
从零上手 openGauss:Docker 部署 + 全场景连接教程
运维·docker·容器
AlfredZhao2 天前
Docker 查看容器日志:别只记 `docker logs -f`
docker