Docker容器日志过大问题的排查与限制
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 | docker run \ |
含义:
- 单个日志文件最大 100MB。
- 最多保留 5 个文件。
- 单个容器最多保留约 500MB 日志。
如果使用 docker compose,可以写:
1 | services: |
修改 compose 配置后,需要重新创建容器:
1 | docker compose up -d |
仅重启容器不一定会应用新的日志配置。
设置 Docker 默认日志策略
可以修改 Docker daemon 配置:
1 | { |
文件路径通常是:
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-size 和 max-file。同时,应用本身也要控制日志级别和日志内容。






