解决docker-overlay2占用的原因及解决方法
背景
今天收到磁盘使用量接近 100% 的告警时,首先立即登录服务器,使用 df -h
命令检查磁盘使用情况。这个命令会显示各个挂载点的磁盘使用率
[root@docker ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 937M 0 937M 0% /dev
tmpfs 949M 0 949M 0% /dev/shm
tmpfs 949M 520K 948M 1% /run
tmpfs 949M 0 949M 0% /sys/fs/cgroup
/dev/vda1 50G 48G 2G 98% /
/dev/vdb1 985G 565G 420G 57% /
overlay 50G 48G 2G 98% / /var/lib/docker/overlay2/6367333fd1b61530c8931ecf7d423ca3231b4109ff58093ffba6a55a81eb74bc/merged
overlay 50G 48G 2G 98% / /var/lib/docker/overlay2/8956f6fd1b61530c8931ecf7d42gffef231b4109ff2560dwqdqwd2555dwd22qd/merged
tmpfs 190M 0 190M 0% /run/user/0
上面中看到的 overlay 分区是 Docker 的虚拟文件系统,其真实的文件系统是 /dev/vda1。所以我们要找到是什么原因大量占据了 /dev/vda1。
一般常见的有两种情况
- 无用的镜像和容器太多
- 容器日志文件过大
无用的镜像和容器太多
检查哪些镜像和容器占用大量空间
docker system df -v
清理所有未使用的资源(镜像、容器、卷和网络)
docker system prune -a
容器日志文件过大
这种情况往往是容器长时间运行,容器打印了大量的日志未清理,占据了大量磁盘空间。
容器的日志文件在/var/lib/docker/containers/{containerId}下
[root@docker containers]# cd /var/lib/docker/containers/
使用 du -h --max-depth=1
命令可以查看当前目录下各个子目录和文件的大小。在分析输出时,可以看到某个目录占用了大量磁盘空间(20G)。进入该目录后,通常可以找到 .json.log
文件,它往往是占用空间最多的日志文件。
[root@oracle containers]# du -h --max-depth=1
356K ./88de22b30af9b4191cc885333cd11d636850f8fad179392887af5fbf6f314a31
542M ./4cc36b6ce3d4273c87e8b5d1ea3dd9e0493672f5b7335782c6bcd9ceb8880859
342M ./120133b67afff386d04aa35e57fbe68382df1e56010e02fdb4d2ca70777434ff
256M ./ff2052adb13b9a03eec809595bbef598b315c5f14008b7a93c03ddf66b27e973
312M ./f5b6c74d72897b36ca14511966e07b81a4fb3f1b0936038bd4d442c1bed6a9d6
20G ./fb0622bd201b0b6c57d328df3be232a0edd776c9f5a6ca40dfc114692cfc9174
639M ./0ff055c82106f590ab6add2fb7dad63e0ffce8190e133e4c8d34daa8b4ea50df
[root@oracle containers]# cd fb0622bd201b0b6c57d328df3be232a0edd776c9f5a6ca40dfc114692cfc9174
[root@oracle containers]# du -sh fb0622bd201b0b6c57d328df3be232a0edd776c9f5a6ca40dfc114692cfc9174-json.log
20G
解决办法
配置日志轮转
以通过 Docker 的 log-driver
和 log-opts
选项配置日志轮转,限制日志文件的大小和数量。在 /etc/docker/daemon.json
文件中添加如下配置:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
这会将每个容器的日志文件限制为 100MB,并且最多保留 3 个日志文件。修改完成后,重启 Docker 服务:
systemctl restart docker
手动清理日志文件
如果你不需要当前的日志文件内容,或者需要立即释放空间,可以手动清理日志文件。你可以使用以下命令将日志文件清空:
cat /dev/null > fb0622bd201b0b6c57d328df3be232a0edd776c9f5a6ca40dfc114692cfc9174-json.log
本文来自博客园,作者:&UnstopPable,转载请注明原文链接:https://www.cnblogs.com/Unstoppable9527/p/18367445