解决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-driverlog-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
posted @ 2024-08-19 15:41  &UnstopPable  阅读(231)  评论(0编辑  收藏  举报