Docker 容器日志查看与清理技巧

Docker 容器日志若不及时清理,可能占满磁盘。本文介绍查看日志的常用命令、日志驱动与存储位置、配置日志轮转、手动清理方法,并指出常见误区,助您有效管理容器日志。

Docker 容器日志查看与清理技巧
封面图:ZuCDN · ZuCDN 原创

Docker 容器日志是运维排查问题的第一手资料,但若不加以管理,日志文件可能迅速膨胀,最终占满磁盘,导致容器或宿主机异常。本文先给出判断路径:遇到日志相关问题时,先明确日志在哪里、由谁产生,再决定查看或清理方式。下面展开具体技巧。

查看 Docker 容器日志的常用命令

最直接的方式是使用 docker logs 命令。常用参数包括:-f 实时跟踪,--tail N 显示最后 N 行,--since 按时间过滤,--until 截止时间。例如:

docker logs -f --tail 100 my-container

如果容器使用 json-file 日志驱动(默认),日志文件位于宿主机 /var/lib/docker/containers/<container-id>/<container-id>-json.log。但直接查看该文件不如 docker logs 方便,且可能绕过 Docker 的管理。若需在容器外部查看,可配合 grep 等工具。

理解日志驱动与存储位置

Docker 支持多种日志驱动,如 json-filesyslogjournaldlocalgelf 等。默认是 json-file,日志以 JSON 格式存储。使用 docker info --format '{{.LoggingDriver}}' 可查看当前驱动。若使用 journald 驱动,日志由 systemd-journald 管理,可用 journalctl 查看。不同驱动影响日志位置和查看方式,需先确认。

日志驱动可通过 Docker daemon 配置文件(如 /etc/docker/daemon.json)或容器启动时指定(--log-driver)来设置。注意:若使用非 json-file 驱动,docker logs 命令可能不可用(除非驱动支持)。

配置日志轮转,防患于未然

为避免日志无限增长,应配置日志轮转。对于 json-file 驱动,可在 daemon.json 中设置 max-sizemax-file

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

这样每个容器日志文件最大 10MB,保留 3 个文件,超出后自动轮转。此配置对所有新容器生效,已有容器需重建。也可在运行容器时用 --log-opt 指定:

docker run --log-opt max-size=10m --log-opt max-file=3 nginx

建议在部署时就配置,而非等到磁盘告警。若使用 local 驱动,它默认支持轮转,但需显式设置大小和文件数。

手动清理日志文件

若日志已占用大量空间,可手动清理。方法一:使用 truncate 命令清空日志文件,但需先停止容器或使用 docker logs --follow 方式?实际上,直接清空文件可能影响 Docker 的文件句柄,更安全的方法是:

docker logs --tail 0 my-container

该命令不会输出日志,但会触发日志截断?不,它只是显示 0 行。正确做法是使用 truncate -s 0 清空文件,但需注意容器仍在写入,可能产生并发问题。更推荐的是删除容器日志文件并重建容器,但会丢失历史日志。若容器可停止,可执行:

docker stop my-container
truncate -s 0 /var/lib/docker/containers/<id>/<id>-json.log
docker start my-container

注意:docker logs 命令依赖于日志文件,清空后历史日志将丢失。若需保留,先备份。

常见误区与注意事项

误区一:认为 docker logs 显示所有日志。若容器使用非默认日志驱动,可能无法使用该命令。误区二:手动删除日志文件而不是清空。删除文件后,Docker 仍持有旧文件句柄,空间不会释放,且可能报错。误区三:忽视日志轮转配置,导致日志无限增长。误区四:在容器内删除日志文件。容器内的日志通常写入 stdout/stderr,由 Docker 捕获,删除容器内文件无济于事。

此外,日志安全也很重要。OWASP 日志安全速查表指出,日志应记录安全事件,但需避免记录敏感信息(如密码、令牌),并确保日志完整性。OpenTelemetry 日志规范强调日志与其他遥测信号的关联,但容器日志管理仍以实用为主。

总结判断路径

当遇到日志问题时,按以下顺序判断:1. 确认日志驱动和位置;2. 查看日志(docker logs 或 journalctl);3. 评估是否需要配置轮转;4. 需要清理时,优先使用 truncate 清空,而非删除文件;5. 长期方案是配置日志驱动和轮转,并考虑集中式日志系统(如 ELK)。

参考资料:

延伸阅读