🧾 问题排查与解决总结: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 容器运行状态稳定