为了防止 Docker 容器日志把磁盘写爆,记几种常用、够用的做法,方便以后复用。

日志在哪儿?

Docker 默认使用 json-file 日志驱动时,每个容器的日志都会落在下面这个路径:

/var/lib/docker/containers/<container-id>/<container-id>-json.log

几点小记:

  • <container-id> 可以用 docker ps / docker ps -a 查。
  • 某个容器日志太大时,可以直接 ls -lh 看一下对应目录。

在 docker-compose 里限制日志大小(推荐)

场景: 单机/小集群,用 docker-compose 管理服务,最常用的做法就是在 compose 里直接加 logging 配置。

示例(在你自己的 docker-compose.yml 里改成对应的服务名即可):

services:
  my_container:
    image: your-image
    # ... 其他配置 ...
    logging:
      driver: json-file
      options:
        max-size: "10m" # 单个日志文件最大 10 MB
        max-file: "3" # 最多保留 3 个轮转后的文件

关键点备注:

  • max-size:每个日志文件的上限,超过就「滚动」到新文件。
  • max-file:最多保留多少个滚动文件,超出会删最旧的。
  • 两个配合起来,相当于:这个容器最多占用 10m × 3 = 30m 日志空间(粗略估算)。

这比只记一个 max-size: 10m 更稳妥,别忘了顺手把 max-file 也写上。

直接用 docker run 的写法(针对一次性小服务)

如果不是用 compose,而是 docker run 起容器,可以这样:

docker run -d \
  --name my_container \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  your-image

参数含义同上,只是换成命令行写法。

全局默认限制(daemon.json)

场景: 一台机器上所有容器都想统一限制日志大小,不想每个 compose / run 都写一遍。

编辑 Docker 守护进程配置,路径通常是:

/etc/docker/daemon.json

加入(或合并)如下配置:

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

改完后重启 Docker:

sudo systemctl restart docker

注意:

  • 这个只会影响之后创建的容器;已有容器保持原来的日志策略。
  • 如果某些容器有特殊需求,可以在它自己的配置里覆盖全局设置。

已经变大的日志怎么办?

如果已经有一个巨大的 *-json.log

  1. 临时瘦身(不改配置,只减体重)

    # 直接截断为 0
    sudo truncate -s 0 \
      /var/lib/docker/containers/<container-id>/<container-id>-json.log
    

    适合应急腾空间,但不解决“继续长胖”的问题。

  2. 从根上解决

    • 给对应容器加上上面的 logging 配置(compose / run)。
    • 重建容器(docker-compose up -d --force-recreate 或自己删掉重建)。
    • 之后就靠 max-size + max-file 自动滚动了。

TL;DR

使用 docker-compose 够应付 80% 情况:

logging:
  driver: json-file
  options:
    max-size: "10m"
    max-file: "3"

配合路径:

/var/lib/docker/containers/<container-id>/<container-id>-json.log