如何限制 Docker 日志大小
为了防止 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:
-
临时瘦身(不改配置,只减体重)
# 直接截断为 0 sudo truncate -s 0 \ /var/lib/docker/containers/<container-id>/<container-id>-json.log适合应急腾空间,但不解决“继续长胖”的问题。
-
从根上解决
- 给对应容器加上上面的
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