Docker容器写满磁盘的问题及解决方法

November 15 2020 156 问题解决

问题发现

本来是想要给博客加个功能的,结果访问博客时发现网站访问不了了,登录到服务器查看,发现是数据库已经挂掉了,因为整个博客都是打包在docker中运行的,三个容器就只挂了服务器,有点匪夷所思。执行docker-compose命令时提示

[18391] INTERNAL ERROR: cannot create temporary directory!

刚开始我还以为是目录权限有问题,给足权限后发现问题还是没有解决,上谷歌搜索后有一条回答是磁盘已被用完,执行df -h后发现根目录确实100%被占用了

根目录完全被占满

继续深挖发现是/var/lib/docker/container中的nginx容器占用了33G

nginx容器大小

这就比较奇怪了,因为自己的docker compose配置文件中,nginx目录映射只有三个:nginx配置文件,网站代码目录和证书目录,看来只有继续到目录里面查看了

日志文件端倪

竟然是一个日志文件!使用tail命令查看该日志文件后发现是nginx的访问日志。

顺带吐槽一下,查看过几次网站的蜘蛛日志,国内的搜索引擎也太流氓了,也不访问网站的robots.txt文件就开始直接肆无忌惮的爬,没上线几天日志就30多G,还好几次把我的小服务器搞挂了。

解决方案

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

rm -rf释放不了空间

预防手段

虽然说这样做可以解决问题,那也只是治标不治本,难道下次再次发生这样的问题我又要来重复这样的工作吗?不,我懒,不愿意再做这样的事情了。所以我想让日志文件的大小受到限制,不让它有膨胀的机会。通过 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-composemax-size选项来实现

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

重启容器之后,其日志文件的大小就被限制在 3GB,再也不用担心了。
建议使用第二种方法来实现日志大小的限制。

文章最后更新于2020年11月14日

说两句

 表情