Appearance
Docker 日志
1. 基本原理
Docker 的日志机制基于以下核心思想:
stdout和stderr:容器内的应用程序将日志输出到stdout和stderr,Docker 负责捕获这些输出;- 日志驱动:Docker 使用可配置的日志驱动来处理这些输出,支持多种存储和转发方式;
- 统一查看:用户可以通过
docker logs命令查看容器的日志,而无需进入容器内部;
2. 日志驱动
Docker 支持多种日志驱动,决定了日志的存储和处理方式。默认驱动取决于系统配置(通常是 json-file)。以下是常见的日志驱动:
2.1. json-file(默认)
将日志存储为 JSON 格式的文件。默认在宿主机的 /var/lib/docker/containers/<container-id>/<container-id>-json.log 中。
相关配置选项:
max-size:日志文件最大大小,如"max-size=10m";max-file:滚动日志文件数量,如"max-file=3";
示例:
Bash
docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 -d mysql:latest2.2. syslog
将日志转发到宿主机的 syslog 服务。
相关配置选项:
syslog-address:指定 syslog 服务器地址,如udp://localhost:514;
示例:
Bash
docker run --log-driver syslog --log-opt syslog-address=udp://localhost:514 -d mysql:latest2.3. journald
将日志发送到 systemd 的 journald(适用于使用 systemd 的系统)。
示例:
Bash
docker run --log-driver journald -d mysql:latest查看日志:
Bash
journalctl CONTAINER_NAME=mysql-test2.4. none
禁用日志收集,docker logs 将无输出。
示例:
Bash
docker run --log-driver none -d mysql:latest2.5. 检查当前日志驱动
Bash
docker inspect <container-id> | grep LogConfig3. 查看日志
3.1. docker logs 命令
基本用法:
Bash
docker logs <container-id>常用选项:
-f:实时跟踪日志(类似tail -f);--tail N:显示最后 N 行(如--tail 10);--since:从指定时间开始(如--since "2025-02-20T10:00:00");
示例:
Bash
docker logs -f --tail 100 mysql-test3.2. 直接访问日志文件
例如,对于 json-file 驱动,可以直接查看宿主机的 JSON 日志文件:
Bash
cat /var/lib/docker/containers/<container-id>/<container-id>-json.log4. 日志清理
Docker 不自动清理旧日志,需手动管理:
- 删除容器时清理:
docker rm <container-id>; - 配置日志滚动:使用
max-size和max-file;
5. 最佳实践
开发环境:使用默认
json-file驱动,方便调试;生产环境:
- 配置日志滚动(
max-size和max-file); - 使用
fluentd或journald等驱动,将日志转发到集中式日志系统;
- 配置日志滚动(
监控:结合工具(如 Prometheus + Loki)分析容器日志;
清理策略:定期清理旧容器和日志,避免磁盘空间不足;