容器日志驱动与大小限制是什么
Docker 默认使用 json-file 日志驱动,且默认不做体积限制:每个容器的日志写在 /var/lib/docker/containers/<容器ID>/ 目录下并持续增长,长期运行的服务最终会把宿主磁盘写满,表现是所有容器一起异常。控制方式有两种:单容器用 --log-opt max-size 与 max-file 限制单文件大小与保留个数;全局在 daemon.json 的 log-opts 里配置默认值,只对之后新建的容器生效。
基本信息
| 默认驱动 | json-file,docker logs 可读,文件位于 /var/lib/docker/containers/<id>/ |
|---|---|
| 单容器限制 | --log-opt max-size=10m --log-opt max-file=3 |
| 全局默认 | daemon.json 的 log-driver 与 log-opts,仅新建容器生效 |
| 驱动差异 | syslog、journald 等驱动下 docker logs 不可用,日志被转发到外部系统 |
| 排查命令 | du 按大小排序查看各容器日志占用,快速定位日志大户 |
典型使用场景
- 生产宿主机统一配置日志上限,避免单个刷日志的服务写满磁盘拖垮全部容器
- 磁盘告警排查时定位日志大户,先止血再定位应用侧刷日志的原因
- 日志已接入集中式系统(ELK、Loki 等)后,本地只保留少量缓冲用于现场排查
- 合规要求日志外发留存、本地不长期保存的场景,靠轮转实现自动清理
- Kubernetes 场景下交由容器运行时或日志采集器管理,避免同时两套轮转冲突
配置与排查示例
配置与排查示例
docker run -d --log-opt max-size=10m --log-opt max-file=3 --name web nginx:1.27
docker inspect web -f '{{.HostConfig.LogConfig}}' # 确认当前生效的日志配置
du -sh /var/lib/docker/containers/*/*-json.log | sort -h | tail # 找出日志占用最大的容器
# 运行中容器的日志过大时可截断:truncate -s 0 <日志文件路径>
# 不要直接 rm 运行中容器的日志文件:文件句柄仍被占用,磁盘空间不会释放常用 log-opt 参数
| 参数 | 含义 | 取值建议 |
|---|---|---|
| max-size | 单个日志文件大小上限 | 10m 起步,按应用日志量调整 |
| max-file | 保留的日志文件个数 | 3-5,兼顾现场排查与磁盘占用 |
| labels | 在日志中附加容器标签 | 集中采集时便于按业务区分 |
| tag | syslog 类驱动使用的标识 | 配合集中式日志系统的分类规则 |
修改 daemon.json 的全局日志配置需要重载 Docker 守护进程,会影响宿主机上所有容器;变更前确认业务窗口,并注意该配置只对新建容器生效。
max-size 触发的轮转是删除最旧的日志文件,历史不再保留;依赖本地日志做审计或追责的场景必须同时开启日志外发,否则轮转发生后证据就丢了。