docker守护进程级日志压缩通过daemon.json配置json-file或local驱动实现,启用compress后自动gzip压缩轮转日志,local驱动更高效且支持zstd。

直接在 Docker 守护进程层面配置日志自动压缩与转储,是最稳妥、全局生效的方式。它不需要逐个容器调整,所有新启动的容器都会继承该策略,且支持 原生压缩(无需额外工具)。
修改 daemon.json 启用 json-file + 压缩
编辑 Docker 全局配置文件:
sudo nano /etc/docker/daemon.json
填入以下内容(注意 JSON 格式严格,末尾不能有多余逗号):
{
"log-driver": "json-file",
"log-opts": {
"max-size": "50m",
"max-file": "5",
"compress": "true"
}
}
-
max-size:单个日志文件达到此大小即触发轮转(如
"50m"表示 50MB) - max-file:最多保留多少个历史日志文件(轮转后旧文件会被重命名并压缩)
-
compress:设为
"true"后,轮转出的旧日志(如xxx-json.log.1)会自动用 gzip 压缩为.1.gz
重启 Docker 生效配置
保存后执行:
sudo systemctl restart docker
⚠️ 注意:已运行的容器不会立即应用新配置,需重启它们才能使用压缩策略。新创建的容器则自动生效。
验证是否启用成功
启动一个测试容器:
docker run -d --name test-logger alpine:latest sh -c "while true; do echo 'log line $(date)'; sleep 1; done"
稍等片刻后检查日志目录:
ls -lh /var/lib/docker/containers/*/*-json.log*
你会看到类似:test-container-json.log(当前活跃日志,未压缩)test-container-json.log.1.gz(已轮转并压缩)
替代方案:改用 local 驱动(生产推荐)
如果追求更高效率和更低磁盘开销,可直接切换为 local 驱动,它内置压缩、更省空间,且默认支持轮转:
{
"log-driver": "local",
"log-opts": {
"max-size": "50m",
"max-file": "5",
"compress": "gzip"
}
}
-
local驱动比json-file更轻量,写入性能更好 -
compress可选值为"gzip"或"zstd"(zstd 压缩更快、解压更省 CPU) - 该驱动不生成纯文本 JSON,而是二进制格式,但
docker logs命令仍完全兼容











