记一次 docker 引起的服务器磁盘占满的问题

本贴最后更新于 1596 天前,其中的信息可能已经时移俗易

问题

昨天做了内网穿透后,成功通过我的服务器访问到了内网站点,今早准备登上服务器去完善东西的时候,突然发现,服务器磁盘满了。图示如下:

1.png

分析问题

正好前一阵看了 Linux 的磁盘管理命令,这次终于派上用场了(真心不希望呀 😂),好吧,先看看怎么回事吧。输入 df -h,结果如下:

2.png

看见 /dev/vda1 Used 50G , 瞬间惊了,这不就是我的系统盘嘛,这也真的太满了吧!!然后 cd / 进入根目录开始排查是哪个文件占据了大量的空间。进入根目录后 执行 du -sh *(这里也可用 du -sh * | sort -rh,让结果排序)。输出如下:

3.png

从输出中可以看到 var 目录 使用了 47G,看见 var 这么大,这时心中就已经猜到肯定是某个服务在那里作祟。进入 var 目录看一下究竟是谁在那捣乱吧。

4.png

这里可以看到 lib 目录使用 46G,好,接着深入,看看究竟怎么回事

5.png

进入 lib 后,再次执行 du -sh *,这时罪魁祸首已经出来了。docker 引起的,为什么会这样呢。我的 docker 里面只运行了一个 solo 博客,怎么会这么大??于是接着进入 docker

6.png

可以看到 containers 高达 45g,这明显是容器的问题了,然后继续进入 containers

7.png

看见 beee7 这个容器占了 45g 之多,然后进入该目录

8.png

执行 du -sh * 然后罪魁祸首就出现了,名为 beee7 这个文件占了整整 45g,而这正是该容器应用的日志文件。这时候我们只是找到了磁盘占满是由于 docker 中的日志文件引起的。但是并不知道究竟是什么原因导致该应用一直输出日志。这时候由于日志文件太打,不能全部打开访问,我们就可以采用 tail -n 行数 file 命令来提取日志文件的尾部多少行进一步的分析。

解决问题

在分析完毕找到原因过后,我们就可以将日志文件清空了,这时可以用命令 cat /var/null>file.这里需要注意的是不能使用 rm -rf file 删除日志文件,如果你执行这个命令删除文件后,通过 df -h 会发现磁盘空间并没有释放,原因是在 Linux 或者 Unix 系统中,通过 rm -rf 或者文件管理器删除文件,将会从文件系统的目录结构上解除链接(unlink)。如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用。


如何预防

虽然说这样做可以解决问题,那也只是治标不治本,难道下次再次发生这样的问题我又要来重复这样的工作吗?不,我懒,不愿意再做这样的事情了。所以我想让日志文件的大小受到限制,不让它有膨胀的机会。通过 docker 的相关文档,发现我们我们可以修改 docker 的配置来限制日志文件的大小。

全局配置

新建/etc/docker/daemon.json,若有就不用新建了。添加 log-dirver 和 log-opts 参数,样例如下:

{
  "log-driver":"json-file",
  "log-opts": {"max-size":"500m", "max-file":"5"}
}

max-size=500m,意味着一个容器日志大小上限是 500M,
max-file=5,意味着一个容器有五个日志,分别是 id+.json、id+1.json、id+2.json 等。

这样配置过后,重启 docker 的守护线程。以后新建的容器都会有效,但是如果我不想删除现在的容器重新建立一个又该怎么办?

设置一个容器服务的日志大小上限

上述方法,日志文件迟早又会涨回来。要从根本上解决问题,需要限制容器服务的日志大小上限。这个通过配置容器 docker-compose 的 max-size 选项来实现

  logging: 
    driver: “json-file” 
    options: 
      max-size: “3g” 

重启容器之后,其日志文件的大小就被限制在 3GB,再也不用担心了。

  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    915 引用 • 931 回帖 • 1 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    476 引用 • 899 回帖 • 2 关注
  • exception
    2 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...