设定 Docker 容器日志的大小和轮询规则
1.前言
用 Docker 管理 MySQL 实例的时候我遇到了 Docker 容器内日志文件增长过快的问题。
我的 VPC 云主机根目录(/)有 40GB 的空间,但是当我启动几个 MySQL 容器用于同步数据后,我的根目录空间被急速的占用。
究其原因是 Docker 容器的日志(/var/lib/docker/containers//.log)占用了大量的空间,抛开日志内记录的内容不说。希望在咱们的生产环境统一设定 Docker 容器的日志大小和轮训规则。
2.解决方法
在 StackOverflow 上找到与上述问题相关的讨论( https://stackoverflow.com/questions/42510002/how-to-clear-properly-the-logs-of-docker-container )
可以通过如下三种方法满足我的要求:
2.1. 配置 dockerd 的启动参数限定日志大小和数量
2.2. 配置 logrotate 对日志进行轮训和压缩
Example file in /etc/logrotate.d/docker-logs
2.3. 设定定时任务定时 truncate 日志文件
个人偏向于第一种方案。
当前阶段 Docker 的 log driver 还是以 json-file 为主,所以会每个容器会在 Docker 宿主机本地文件系统上保存大量的日志文件,默认配置下日志大小无限制,导致了这个问题。
我也倾向使用第一种方式,对 json-file 的 log driver 进行相应的配置,具体配置项目参考官方文档
https://docs.docker.com/engine/admin/logging/json-file/
目前我们假设一台 Docker 宿主机上最多运行 5 个容器,每个容器日志文件大小限制为 100MB,日志文件个数 3 个。那最多会占用 Docker 宿主机本地文件系统 1.5GB 磁盘空间。Docker 宿主机本地文件系统为 40GB,这个磁盘占用可以接受。
准备在 Docker 的 daemon.json 中增加配置
更新 /etc/docker/daemon.json 文件配置后,重启 Docker daemon,由于开启了 Live Restore ,已经运行的容器不会受影响(不会被重启)。但在配置修改前已经创建了的容器无法获得这个日志的配置,可以通过命令 docker inspect -f {{.HostConfig.LogConfig}} <CONTAINER> 查看当前容器日志配置,默认输出为 {json-file map[]}
需要对容器进行销毁后重建,重启容器无效。重建容器后再执行 docker inspect -f {{.HostConfig.LogConfig}} <CONTAINER>,可以看到输出为 {json-file map[max-file:3 max-size:100m]} 表示日志配置生效
版权声明: 本文为 InfoQ 作者【耳东】的原创文章。
原文链接:【http://xie.infoq.cn/article/255cc5efdf50f5cb7e2ee89a6】。未经作者许可,禁止转载。
评论