🧾 问题排查与解决总结:Docker 容器导致磁盘占满
一、📌 问题现象
某天打开自己的网站发现500,查看容器日志,发现磁盘满了
2025/06/01 21:09:04 ...unner/interceptor.go:68:1() [E] can't update runner status: database or disk is full
运行过程中,发现服务器磁盘空间已被完全占满:
df -h
输出显示根分区 / 使用率为 100%,无可用空间:
/dev/vda2 50G 48G 0 100% /
二、🔍 问题定位步骤与关键命令
1. 查看磁盘空间使用情况
df -h
查看哪些挂载点占用最大。
2. 查看根目录下各一级子目录的大小
sudo du -h --max-depth=1 / | sort -hr | head -n 10
定位 /var 目录占用异常大。
3. 深入查看 /var,发现 /var/lib/docker 占用严重
sudo du -h --max-depth=1 /var | sort -hr
确认 Docker 是主要磁盘使用者。
4. 查看 Docker 存储使用情况
docker system df
发现某个容器 Containers 使用了近 38GB 空间。
5. 定位哪个 overlay2 目录最大
sudo du -sh /var/lib/docker/overlay2/* | sort -hr | head -n 10
输出结果
root@VM-16-16-ubuntu:~# sudo du -sh /var/lib/docker/overlay2/* | sort -hr | head -n 10
71G /var/lib/docker/overlay2/7fac2e3c0595a3d89e0f4003caf92c9d0646e67ea7dd617f23316190d2766d24
1.3G /var/lib/docker/overlay2/7418b4e62d8a1f6e7710e62ee9703d11a95f2536fa78159e629399111aabe20e
266M /var/lib/docker/overlay2/e3aa2bc3e885d636a7ae38f4be6372b4d56016ca80c3fcc1731a5e542e4e5129
254M /var/lib/docker/overlay2/d1bd7bbdd8f4eb9a92a8c41ffd955f9c9311cf35c9ad79578fe758e90c5c30de
247M /var/lib/docker/overlay2/b482bcfe3b201285664678a773d2e868a2bb2ae9f0722214c8eb4ab64d9a6af2
145M /var/lib/docker/overlay2/424a15508d9d376423bd4243ec778e3b5a737920ef9b819218a387fb63fa3df8
136M /var/lib/docker/overlay2/9c4c121a9780ac9d0a6f16e1f60f682a0f2be56377941b89fa60bc6ef464bd06
135M /var/lib/docker/overlay2/d908fe0d593156fd424f5268db384d9d3af4db9c1cc9ac96a42d62fceee48b5e
116M /var/lib/docker/overlay2/6acba64223e31e05adf8551c1cc156c9320356ed2edfa64017129b4b60e77555
99M /var/lib/docker/overlay2/da40d924ba84c37cc044026ea7f559874802db58d8413843b68ce7897bf36ba5
找出占用 70+GB 的 overlay2 层。
6. 查找 overlay2 层对应的容器
docker inspect $(docker ps -q) | grep -B 10 <overlay2目录名>
定位为 SVN 容器 elleflorio/svn-server。
7. 进入容器查看内部目录大小
docker exec -it svn sh
du -k / | sort -nr | head -n 20
确认 /var/log/go-dnsmasq 目录日志暴涨,占用达 35GB+。
三、✅ 问题解决思路与操作
🎯 问题根因总结
容器内部程序(如 go-dnsmasq)将日志持续写入 /var/log/go-dnsmasq,而此目录未挂载到宿主机,因此写入到了 Docker 的 overlay2 写层中,占用主机根分区空间。
✅ 解决方案 1:挂载日志目录到宿主机
修改 docker-compose.yml:
volumes:
- /usr/local/moac/svnLogs:/var/log/go-dnsmasq
重建容器:
docker-compose down svn
docker-compose up -d svn
验证挂载是否成功:
ls /usr/local/moac/svnLogs
✅ 解决方案 2:控制日志大小(使用 logrotate)
1. 创建 logrotate 配置
文件:/etc/logrotate.d/svnLogs
/usr/local/moac/svnLogs/*.log {
size 100M
rotate 5
compress
missingok
notifempty
copytruncate
}
2. 手动测试轮转
sudo logrotate -f /etc/logrotate.d/svnLogs
3. 设置定时任务
sudo crontab -e
添加:
0 2 * * * /usr/sbin/logrotate -f /etc/logrotate.d/svnLogs >/dev/null 2>&1
四、🛠 本次使用到的关键工具与命令
工具/命令 | 作用说明 |
---|---|
df -h | 查看磁盘使用率 |
du -sh、du -h –max-depth=1 | 分析目录占用空间 |
docker system df | 查看 Docker 镜像、容器、卷的空间使用 |
docker inspect | 获取容器的底层 overlay2 层信息 |
docker exec + du | 查看容器内部文件系统使用情况 |
docker-compose | 启停并重建容器 |
logrotate | 控制日志大小、轮转、压缩 |
crontab | 定时执行日志轮转 |
✅ 成功结果
- overlay2 空间不再增长
- /usr/local/moac/svnLogs 日志被定期轮转和压缩
- 系统磁盘 / 空间恢复正常使用
- Docker 容器运行状态稳定