Bootstrap

设定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 的启动参数限定日志大小和数量

dockerd ... --log-opt max-size=10m --log-opt max-file=3

2.2. 配置logrotate对日志进行轮训和压缩

Example file in /etc/logrotate.d/docker-logs

/var/lib/docker/containers/*/*.log {
 rotate 7
 daily
 compress
 size=50M
 missingok
 delaycompress
 copytruncate
}

2.3. 设定定时任务定时truncate日志文件

truncate -s 0 /var/lib/docker/containers/*/*-json.log

个人偏向于第一种方案。

当前阶段 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 中增加配置

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  }
}

更新 /etc/docker/daemon.json 文件配置后,重启 Docker daemon,由于开启了 Live Restore ,已经运行的容器不会受影响(不会被重启)。但在配置修改前已经创建了的容器无法获得这个日志的配置,可以通过命令 docker inspect -f {{.HostConfig.LogConfig}} 查看当前容器日志配置,默认输出为 {json-file map[]}

需要对容器进行销毁后重建,重启容器无效。重建容器后再执行 docker inspect -f {{.HostConfig.LogConfig}} ,可以看到输出为 {json-file map[max-file:3 max-size:100m]} 表示日志配置生效