Docker 守护进程日志占用太多磁盘space
Docker daemon log taking up too much disk space
序言
澄清一下,这个问题是针对 docker 守护程序日志,不是 docker 的容器级日志。 log-driver 和 log-opts docker 守护程序配置似乎可以很好地处理容器级日志。
描述
我们 运行 遇到的问题是 docker 守护程序日志(位于 /var/log/docker.err.log
)日志文件增长太快,而不是在我们的 docker swarm 个生产服务器。从长远来看,我们自然会担心磁盘 space。具体来说,我们已经 运行ning 将近一个月了,在一个节点上,该日志文件已经增长到 5.1GB。由于我们的 VM 预计将 运行 持续数月,这显然是一个令人担忧的趋势。
我们使用的 linuxkit OS 与 example docker configuration 的配置非常相似,/etc/docker/daemon.json
中有一些额外的配置文件,最值得注意的是 我们将 debug 设置为 True。 这显然是一个错误,因为我们的测试表明,如果我们不使用该选项,我们的日志文件会小得多。
然而,即使我们将日志级别保留为默认的信息级别,在我看来,如果服务器 运行ning 时间过长,日志文件仍可能导致问题。我的一位同事做了一些粗略的计算,他的猜测是如果守护程序 运行ning 保留 6 个月左右,该文件仍可能增长到大约 10GB。
我们的尝试
我们一直在尝试获得一个手动 logrotate 解决方案来防止这种情况,但似乎 docker 守护进程从不重新加载它的日志文件,这意味着当 logrotate 执行它时,它会创建一个blank new docker.err.log,docker 守护进程继续在它停止的任何偏移处写入,并用空字节回填文件的其余部分,占用与之前一样多的 space .我们已经尝试了一些解决方案,包括将 HUP 信号发送到 docker 进程,但没有成功;似乎 docker 守护程序不处理该信号,或者至少不以重新加载其日志文件的方式处理。
问题
是否有公认的方法来实现 docker 守护程序日志的轮换?
我们找不到任何关于此的信息似乎很不寻常,因为似乎以前某个地方的某个人可能遇到过这个问题。或者其他 运行ning on swarm 会在某个时候定期重启服务器吗?理想情况下,我们很乐意找到一种基于 linuxkit 的方法来专门轮换该日志文件
此外,有没有办法在不关闭服务器或 docker 守护程序实例的情况下,在 运行ning 服务器上对现有的 docker.err.log 进行分类?我们希望不惜一切代价避免部署更新的 OS 图像只是为了防止 docker 守护进程日志耗尽我们所有的磁盘 space.
重现步骤
- 创建一个 linuxkit OS 带有 docker 守护程序服务的 ISO 调试:在其配置文件中为 True
- 使用那个 ISO,运行 docker swarm 集群几天
- 观察docker.err.log文件的增长情况
Linuxkit 配置
kernel:
image: linuxkit/kernel:4.15.5
cmdline: "console=tty0 quiet console=ttyAMA0"
init:
- linuxkit/init:6061875ba11fd9c563fda6234b103ed9997ff782
- linuxkit/runc:52ecfdef1ae051e7fd5ac5f1d0b7dd859adff015
- linuxkit/containerd:13f62c61f0465fb07766d88b317cabb960261cbb
- linuxkit/ca-certificates:0a188e40108b6ece8c2aefdfaaad94acc84368ce
...
services:
- name: docker
image: docker:17.12.0-ce-dind
capabilities:
- all
net: host
mounts:
- type: cgroup
options: ["rw","nosuid","noexec","nodev","relatime"]
binds:
- /tiles:/tiles
- /etc/resolv.conf:/etc/resolv.conf
- /tmp/hosts:/etc/hosts
- /root/.ssh:/root/.ssh
- /var/lib/docker:/var/lib/docker
- /lib/modules:/lib/modules
- /etc/docker/daemon.json:/etc/docker/daemon.json
- /persistent:/persistent
- /application:/application
command: ["/usr/local/bin/docker-init", "/usr/local/bin/dockerd"]
files:
- path: etc/docker/daemon.json
contents: |
{
"debug": true,
"data-root": "/persistent/docker",
"insecure-registries" : ["foobar-docker-registry.chip:5000"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "4"
}
}
只是为了关闭它,这在 linuxkit 中不再是一个问题。从那以后,他们使用 memlogd
和他们自己的日志编写器添加了日志记录支持,它可以处理自动轮换。这是他们 logging documentation 的 link。
yaml 配置如下:
init:
# A circular buffer that captures logs from onboot and service-level containers
- linuxkit/memlogd:v0.7
...
services:
- name: write-and-rotate-logs
image: foobar/logwrite
command: ["/usr/bin/logwrite",
"-log-dir", "/persistent/log/bespin",
# Keep at most 25 files (Note: file numbers are 0-based)
"-max-log-files", "25",
# Max log file size set to 200MB (200 * 1024 * 1024 = 209,715,200 bytes)
"-max-log-size", "209715200"]
这将捕获所有 linuxkit 服务日志,包括 docker 守护程序日志,并将它们写入磁盘。它在写入时处理旋转。
序言
澄清一下,这个问题是针对 docker 守护程序日志,不是 docker 的容器级日志。 log-driver 和 log-opts docker 守护程序配置似乎可以很好地处理容器级日志。
描述
我们 运行 遇到的问题是 docker 守护程序日志(位于 /var/log/docker.err.log
)日志文件增长太快,而不是在我们的 docker swarm 个生产服务器。从长远来看,我们自然会担心磁盘 space。具体来说,我们已经 运行ning 将近一个月了,在一个节点上,该日志文件已经增长到 5.1GB。由于我们的 VM 预计将 运行 持续数月,这显然是一个令人担忧的趋势。
我们使用的 linuxkit OS 与 example docker configuration 的配置非常相似,/etc/docker/daemon.json
中有一些额外的配置文件,最值得注意的是 我们将 debug 设置为 True。 这显然是一个错误,因为我们的测试表明,如果我们不使用该选项,我们的日志文件会小得多。
然而,即使我们将日志级别保留为默认的信息级别,在我看来,如果服务器 运行ning 时间过长,日志文件仍可能导致问题。我的一位同事做了一些粗略的计算,他的猜测是如果守护程序 运行ning 保留 6 个月左右,该文件仍可能增长到大约 10GB。
我们的尝试
我们一直在尝试获得一个手动 logrotate 解决方案来防止这种情况,但似乎 docker 守护进程从不重新加载它的日志文件,这意味着当 logrotate 执行它时,它会创建一个blank new docker.err.log,docker 守护进程继续在它停止的任何偏移处写入,并用空字节回填文件的其余部分,占用与之前一样多的 space .我们已经尝试了一些解决方案,包括将 HUP 信号发送到 docker 进程,但没有成功;似乎 docker 守护程序不处理该信号,或者至少不以重新加载其日志文件的方式处理。
问题
是否有公认的方法来实现 docker 守护程序日志的轮换?
我们找不到任何关于此的信息似乎很不寻常,因为似乎以前某个地方的某个人可能遇到过这个问题。或者其他 运行ning on swarm 会在某个时候定期重启服务器吗?理想情况下,我们很乐意找到一种基于 linuxkit 的方法来专门轮换该日志文件
此外,有没有办法在不关闭服务器或 docker 守护程序实例的情况下,在 运行ning 服务器上对现有的 docker.err.log 进行分类?我们希望不惜一切代价避免部署更新的 OS 图像只是为了防止 docker 守护进程日志耗尽我们所有的磁盘 space.
重现步骤
- 创建一个 linuxkit OS 带有 docker 守护程序服务的 ISO 调试:在其配置文件中为 True
- 使用那个 ISO,运行 docker swarm 集群几天
- 观察docker.err.log文件的增长情况
Linuxkit 配置
kernel:
image: linuxkit/kernel:4.15.5
cmdline: "console=tty0 quiet console=ttyAMA0"
init:
- linuxkit/init:6061875ba11fd9c563fda6234b103ed9997ff782
- linuxkit/runc:52ecfdef1ae051e7fd5ac5f1d0b7dd859adff015
- linuxkit/containerd:13f62c61f0465fb07766d88b317cabb960261cbb
- linuxkit/ca-certificates:0a188e40108b6ece8c2aefdfaaad94acc84368ce
...
services:
- name: docker
image: docker:17.12.0-ce-dind
capabilities:
- all
net: host
mounts:
- type: cgroup
options: ["rw","nosuid","noexec","nodev","relatime"]
binds:
- /tiles:/tiles
- /etc/resolv.conf:/etc/resolv.conf
- /tmp/hosts:/etc/hosts
- /root/.ssh:/root/.ssh
- /var/lib/docker:/var/lib/docker
- /lib/modules:/lib/modules
- /etc/docker/daemon.json:/etc/docker/daemon.json
- /persistent:/persistent
- /application:/application
command: ["/usr/local/bin/docker-init", "/usr/local/bin/dockerd"]
files:
- path: etc/docker/daemon.json
contents: |
{
"debug": true,
"data-root": "/persistent/docker",
"insecure-registries" : ["foobar-docker-registry.chip:5000"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "4"
}
}
只是为了关闭它,这在 linuxkit 中不再是一个问题。从那以后,他们使用 memlogd
和他们自己的日志编写器添加了日志记录支持,它可以处理自动轮换。这是他们 logging documentation 的 link。
yaml 配置如下:
init:
# A circular buffer that captures logs from onboot and service-level containers
- linuxkit/memlogd:v0.7
...
services:
- name: write-and-rotate-logs
image: foobar/logwrite
command: ["/usr/bin/logwrite",
"-log-dir", "/persistent/log/bespin",
# Keep at most 25 files (Note: file numbers are 0-based)
"-max-log-files", "25",
# Max log file size set to 200MB (200 * 1024 * 1024 = 209,715,200 bytes)
"-max-log-size", "209715200"]
这将捕获所有 linuxkit 服务日志,包括 docker 守护程序日志,并将它们写入磁盘。它在写入时处理旋转。