Docker进阶实战系列(二):容器日志深度治理|驱动配置、自动切割、磁盘爆满彻底解决
前言
上一篇我们搞定了镜像最小化 + 容器安全加固,解决了容器上线的安全风险。
本篇解决生产 Docker 最高频、最致命的运维事故:日志无限膨胀打满磁盘。
很多服务器莫名宕机、磁盘100%、服务卡死,根源都是:
-
Docker 默认日志驱动不切割日志
-
容器日志越积越大,单个文件几十GB
-
新手不敢删日志,删错直接 Docker 挂掉
-
没有日志策略、没有自动清理,全靠手动维护
本篇给你两套生产级日志治理方案:全局全局驱动配置 + 项目独立日志策略,彻底根治磁盘爆满问题。
一、Docker 默认日志机制坑点
Docker 默认使用 json-file 日志驱动:
-
不会自动分割文件
-
不会自动删除旧日志
-
容器运行越久,日志文件越大
-
手动删除日志文件,Docker 进程不会释放空间
生产环境绝对不能使用默认裸奔配置!
二、Docker 三大日志驱动(生产必知)
-
json-file:默认,本地json存储,适合单机小项目
-
local:Docker 新驱动,性能更高、自带轮转,优先推荐
-
fluentd:对接日志收集系统,适合集群、微服务项目
三、方案一:全局日志轮转(全服务器容器生效)
一次性配置,所有新建容器自动启用日志切割与清理,终身生效。
1. 编辑 Docker 守护进程配置
bash
mkdir -p /etc/docker
vim /etc/docker/daemon.json
2. 写入生产级日志配置
json
{
"log-driver": "local",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
配置参数详解
-
log-driver: local:使用高性能本地日志驱动,替代老旧json驱动
-
max-size: 10m:单个日志文件最大10MB
-
max-file: 3:最多保留3份日志,超出自动淘汰最旧日志
3. 重启 Docker 生效
bash
systemctl daemon-reload
systemctl restart docker
⚠️ 注意:全局配置只对新容器生效,旧容器需要重建。
四、方案二:Compose 项目独立日志策略(推荐)
不改动服务器全局配置,只针对当前 Compose 项目生效,适配多项目差异化运维。
完整可直接复制的 docker-compose.yml 单服务日志配置:
yaml
services:
app:
image: your-app:latest
restart: always
logging:
driver: local
options:
max-size: "10m"
max-file: "3"
适配我们之前全套前后端项目,所有服务统一加上日志配置,生产标准模板。
五、如何查看容器日志占用(排查磁盘爆满)
1. 查看整体 Docker 磁盘占用
bash
docker system df
2. 查看单个容器日志路径与大小
bash
# 查看容器详细信息
docker inspect 容器名 | grep LogPath
3. 实时查看日志
bash
# 实时滚动日志
docker compose logs -f
# 只查看最后200行
docker compose logs --tail=200
六、正确清理 Docker 日志(避坑)
❌ 错误做法:直接 rm 删除日志文件,Docker 进程不释放句柄,磁盘空间不恢复。
✅ 正确做法:清空日志内容不删文件
bash
# 清空指定容器日志
truncate -s 0 日志文件路径
✅ 一键清理无用资源
bash
# 清理停止的容器、无用镜像、网络
docker system prune -f
七、业务日志最佳实践(彻底减少日志量)
容器日志治理不能只靠切割,还要从源头降噪:
-
生产环境 SpringBoot 调整日志级别为
WARN/ERROR -
关闭 SQL 打印、关闭Debug日志
-
Nginx 关闭不必要的 access 日志,只保留 error 日志
-
定时清理老旧备份日志、SQL备份文件
八、本期总结
-
Docker 默认日志驱动存在致命缺陷,生产必须配置轮转
-
local 驱动 性能优于传统 json-file,优先使用
-
两种方案:全局统一配置 + 项目独立配置
-
严格限制单文件大小、文件数量,杜绝磁盘爆满
-
禁止手动删日志文件,使用 truncate 安全清空
下期预告
Docker进阶实战系列(三):容器资源限制|CPU、内存配额、OOM容错生产配置
解决容器抢占服务器资源、内存溢出、服务卡死、整机卡顿问题。