小透明
发布于 2025-10-17 / 2 阅读
0
0

解决 Docker 日志无限增长的几种方法

无论是初次接触 Docker 的新手,还是日常频繁使用 Docker 的老手,往往都会忽视日志存储的问题。因为在轻度使用场景下,很难意识到 Docker 会无限制地累积日志,往往直到磁盘空间耗尽,才会发现这个问题。

根据官网的文档得知,Docker默认使用 json-file 作为容器的 logging driver。

JSON File logging driver | Docker Docs

json-file 的问题在于,它的 max-size 配置默认为 -1,也就是没有大小限制,不执行日志轮换。通过阅读官方文档,显然官方也意识到了这个问题,所以它更加推荐用户使用 local 作为容器的 logging driver。

至于为何不直接将其设为默认?官方给出的理由是“为了向后兼容旧版本 Docker”。(好你个官方😅

那么 local 是如何管理日志的呢,它是否能满足我们的需求呢。

Local file logging driver | Docker Docs

Option

Description

Example value

max-size

The maximum size of the log before it's rolled. A positive integer plus a modifier representing the unit of measure (k, m, or g). Defaults to 20m.

--log-opt max-size=10m

max-file

The maximum number of log files that can be present. If rolling the logs creates excess files, the oldest file is removed. A positive integer. Defaults to 5.

--log-opt max-file=3

compress

Toggle compression of rotated log files. Enabled by default.

--log-opt compress=false

根据文档我们可以知道,它的 max-size 参数默认为20m,max-file 默认为5并且默认开启日志压缩。这一默认配置已足以满足大多数轻度使用场景;若仍有更高需求,也可根据实际情况适当调大相应参数。

如何更改默认Logging Driver

在启动容器时指定Logging Driver

docker run -d --name your_container_name \
--log-driver local --log-opt max-size=50m --log-opt max-file=10 \
[其他参数] your_image

在docker-compose.yml中指定

services:
  ......
  nginx:
    image: nginx:stable
    logging:
      driver: local
      options:
        max-size: 50m
        max-file: 10
  ......

该方法会导致容器被重建,如有重要文件,请先备份。

修改daemon.json

在Debian中,这个文件默认在/etc/docker/daemon.json

在Windows中,可以通过Docker Desktop直接修改。

修改完需要重启Docker后,才能生效。

但是这个方式有个问题,它只对修改后创建的容器生效。

无法重建时的补救办法

如果没有办法重建容器的话,只能写个定时任务,定时去备份、清空容器的日志,避免它撑满硬盘。

稳定运行了几年的容器,谁敢去重建它啊,反正我不敢😂。

在Debian中,默认的日志位置为/var/lib/docker/containers/{容器id}

cp /var/lib/docker/containers/{容器id}/{容器id}-json.log
# 因Linux的机制,无法通过直接删除来解决
echo "" > /var/lib/docker/containers/{容器id}/{容器id}-json.log

经验教训

在引入任何新工具时,都应提前评估它的日志等管理策略,避免因其无限增长导致后期无法通过常规方式修复。

参考

Configure logging drivers | Docker Docs


评论