Docker 默认使用 json-file 日志驱动时,容器标准输出和标准错误会写入宿主机 JSON 日志文件。如果应用日志量很大,而没有配置日志轮转,单个容器日志文件可能增长到几十 GB,最终占满磁盘。

本文介绍如何定位 Docker 容器日志文件、临时清理日志、配置日志大小限制,以及在生产环境中需要注意的点。

查看 Docker 日志占用

先查看 Docker 整体磁盘使用:

1
docker system df

这个命令会显示镜像、容器、volume 和构建缓存的占用,但不会细分每个容器日志文件。

Docker 容器日志通常位于:

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

查找大日志文件:

1
find /var/lib/docker/containers -name '*-json.log' -size +500M -exec ls -lh {} \;

如果输出很多大文件,就说明容器日志需要治理。

找到日志对应的容器

文件路径中的目录名就是容器 ID。可以使用:

1
docker ps -a --no-trunc | grep <container-id>

也可以查看容器日志路径:

1
docker inspect --format='{{.LogPath}}' <container-name-or-id>

如果需要查看当前容器日志大小:

1
ls -lh $(docker inspect --format='{{.LogPath}}' <container-name-or-id>)

临时清理日志

不要直接删除正在使用的日志文件。可以使用 truncate 截断:

1
truncate -s 0 $(docker inspect --format='{{.LogPath}}' <container-name-or-id>)

批量截断所有容器 JSON 日志:

1
find /var/lib/docker/containers -name '*-json.log' -exec truncate -s 0 {} \;

这能立即释放日志文件占用的空间。执行前要确认这些日志不需要保留,或者已经被日志系统采集。

临时清理只是止血,根本方案是配置日志轮转。

为单个容器设置日志限制

启动容器时可以指定:

1
2
3
4
5
docker run \
--log-driver json-file \
--log-opt max-size=100m \
--log-opt max-file=5 \
nginx:latest

含义:

  • 单个日志文件最大 100MB。
  • 最多保留 5 个文件。
  • 单个容器最多保留约 500MB 日志。

如果使用 docker compose,可以写:

1
2
3
4
5
6
7
8
services:
app:
image: myapp:latest
logging:
driver: json-file
options:
max-size: "100m"
max-file: "5"

修改 compose 配置后,需要重新创建容器:

1
docker compose up -d

仅重启容器不一定会应用新的日志配置。

设置 Docker 默认日志策略

可以修改 Docker daemon 配置:

1
2
3
4
5
6
7
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "5"
}
}

文件路径通常是:

1
/etc/docker/daemon.json

修改后重启 Docker:

1
systemctl restart docker

注意:重启 Docker 会影响正在运行的容器。生产环境应安排维护窗口,或确认服务有高可用冗余。

默认日志策略只影响之后新创建的容器,已经存在的容器通常需要重新创建才会使用新配置。

应用日志输出建议

容器化应用推荐把日志输出到标准输出,由 Docker 或容器平台采集。但这并不意味着应用可以无限制打印日志。

建议:

  • 生产环境默认 INFO 或 WARNING。
  • DEBUG 日志只在短时间排查时开启。
  • 避免在循环中打印大量重复日志。
  • 请求日志采样或聚合。
  • 不在日志中输出密码、token、身份证号等敏感信息。

如果应用本身也写文件日志,要同时配置应用日志轮转,否则即使 Docker 日志受控,容器内或 volume 中的日志仍可能占满磁盘。

查看实时日志时的注意点

使用:

1
docker logs -f <container>

如果历史日志很大,直接执行 docker logs 可能很慢。可以限制行数:

1
docker logs --tail 200 -f <container>

按时间查看:

1
docker logs --since 30m <container>

排查线上问题时,不要在高日志量容器上长时间开多个 docker logs -f,这也会增加宿主机压力。

和日志采集系统配合

如果使用 ELK、Loki、云日志服务等集中采集系统,需要明确:

  • Docker 本地日志保留多久。
  • 采集成功后是否允许清理本地日志。
  • 采集失败时本地日志会不会无限堆积。
  • 采集器自身日志是否也配置了轮转。

很多磁盘满问题不是业务容器造成的,而是日志采集器、监控 agent 或代理服务自身日志过大。

小结

Docker 容器日志过大通常来自默认 json-file 没有限制。排查时先找到 *-json.log 大文件,再通过 docker inspect 确认对应容器。临时处理使用 truncate,长期治理要在 docker run、Compose 或 Docker daemon 中配置 max-sizemax-file。同时,应用本身也要控制日志级别和日志内容。