一次 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% 的情况只是:

磁盘满了。

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


相关推荐
火车叼位8 小时前
Docker Compose 网络原理与实战:同一 Compose 服务间如何稳定通信
运维·docker·容器
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ10 小时前
ubuntu 安装部署docker教程
linux·ubuntu·docker
D愿你归来仍是少年12 小时前
Docker 深入学习指南
docker·容器
liliangcsdn13 小时前
centos7 docker镜像库国内加速
云原生·eureka
专家大圣14 小时前
告别智能家居品牌壁垒✨ Home Assistant+cpolar 让远程控家更省心
网络·docker·智能家居·内网穿透·cpolar
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ15 小时前
Docker的介绍及使用
docker
ai产品老杨15 小时前
终结协议孤岛:基于GB28181/RTSP融合网关的多品牌设备统一接入与边缘推流方案
人工智能·docker·架构·kubernetes·音视频
浊酒入清梦17 小时前
Gradle多模块项目构建docker镜像脚本
运维·docker·容器
西柚小萌新17 小时前
【docker】--4.Docker Compose
docker·容器·eureka
Scabbards_17 小时前
基于docker的LLM服务部署
运维·docker·容器