记录Docker占用空间(/var/lib/docker/containers/)过大的问题

2,574 阅读3分钟

前因:最近同事需要打包在测试环境中打包nextjs,老是跟我说内存空间满了,编译不了,按道理说,上面也没装有几个容器,40GB的Linux系统空间怎么会被占满了呢,趁着有时间,来排查一下。

  1. 使用指令df -h查看系统空间使用情况

image.png

可以看到,40GB的空间已经被使用了36G了,就剩下2.2G,根本没法使用。
  1. 使用docker system df 指令查看docker占用空间

image.png

可以看到,docker占用的空间也不大,合起来都没有2G

再次使用指令docker system df -v 查看具体的占用情况

image.png

看起来也没有太多无效的镜像
  1. 例行使用指令docker system prune -a清除了部分无效的空间,不使用的镜像,但是发现只释放了一小部分的空间。好吧,聊胜于无了。

  2. 接下来,通过du -s /* | sort -nr命令查看哪一个目录占用的空间最多

image.png

发现/var目录占用的空间是最多的,刚好在35G左右,和上面的已使用的空间对上来了,看来问题就在这里面

  1. 那么现在使用指令cd var进入到var目录下,使用指令du -h --max-depth=1查看当前目录下文件夹大小情况

image.png

  1. lib目录占用了33G的空间,继续使用指令cd lib进入到lib目录下,使用指令du -h --max-depth=1查看当前目录下文件夹大小情况

image.png

  1. 没想到还是docker占用的空间,继续使用指令cd docker进入到docker目录下,使用指令du -h --max-depth=1查看当前目录下文件夹大小情况

image.png

  1. 可以看到是containers目录占用了空间,但是我们在第二步看到containers只占用了三百多兆的空间,怎么会这么大呢。这个先不管了,我们继续使用指令cd containers进入到containers目录下,使用指令du -h --max-depth=1查看当前目录下文件夹大小情况

image.png

  1. 看来是某一个容器占用了这么大的空间,继续使用指令cd 7c097b74df75268d55ad5f0c458da5b8f0cc45fe0df3932ec54c4b3462ecc4c9进入到7c097b74df75268d55ad5f0c458da5b8f0cc45fe0df3932ec54c4b3462ecc4c9目录下,使用指令du -h --max-depth=1查看当前目录下文件夹大小情况

image.png

  1. 真相了,是一个-json.log文件占用了28G的空间,看来是docker生成的日志文件,那么就是需要清除此文件,释放空间了。

处理方案:

  1. 直接删除该文件,但因为该文件在docker运行时有程序占用,因此可能无法清除。所以需要重启docker,把容器停止后删除。
  2. 使用cat /dev/null > *-json.log命令进行清除,这样不需要重启docker,只是把该文件的内容清空。

需要注意的是:上面的解决方案只是暂时的,清除之后,docker依旧会继续产生日志,所以下次还需继续清除。

  1. 使用第二种方案,使用指令cat /dev/null > *-json.log清空内容后,再次执行指令df -h查看系统空间使用情况

image.png

可以看到,空间都释放出来啦。