1. 概述
Docker 是一个操作系统级虚拟化平台,允许我们以容器的形式托管应用程序。它将应用与基础设施解耦,从而加快软件交付速度。
Docker 容器生成的日志文件中包含大量有用信息。每当发生事件时,Docker 容器都会生成日志。这些日志默认输出到 STDOUT 或 STDERR,包含日志来源、输出流数据和时间戳。通过日志文件,可以进行调试并定位问题的根本原因。
本文将介绍几种访问 Docker 日志的方法,帮助你更好地进行容器日志的监控和管理。
2. 理解 Docker 日志
Docker 中主要有两种日志文件:
- Docker 守护进程日志:反映 Docker 服务整体状态。
- Docker 容器日志:记录特定容器的运行日志。
我们将重点介绍如何通过命令访问容器日志,以及如何直接访问系统中的日志文件。
日志文件对调试非常有用,它们记录了系统运行期间发生的具体事件。通过分析 Docker 日志,可以快速诊断和解决运行时问题。
3. 使用 docker logs
命令
在继续之前,我们先运行一个 PostgreSQL 容器作为示例:
$ docker run -itd \
-e POSTGRES_USER=baeldung \
-e POSTGRES_PASSWORD=baeldung \
-p 5432:5432 \
-v /data:/var/lib/postgresql/data \
--name postgresql-baeldung \
postgres
运行后查看容器 ID:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bce34bb3c617 postgres "docker-entrypoint.s…" 12 seconds ago Up 10 seconds 0.0.0.0:5432->5432/tcp postgresql-baeldung
现在使用 docker logs
查看日志:
$ docker logs bce34bb3c617
2022-05-16 18:13:58.868 UTC [1] LOG: starting PostgreSQL 14.2 (Debian 14.2-1.pgdg110+1)
on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
2022-05-16 18:13:58.869 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
2022-05-16 18:13:58.869 UTC [1] LOG: listening on IPv6 address "::", port 5432
如需查看实时日志,使用 --follow
参数:
$ docker logs --follow bce34bb3c617
如需仅查看最近的 N 条日志:
$ docker logs --follow --tail 1 bce34bb3c617
如需查看指定时间之后的日志:
$ docker logs --since 2022-05-16 bce34bb3c617
也可以使用 docker container logs
命令,但该命令在新版本中已被标记为 deprecated:
$ docker container logs --since 2022-05-16 bce34bb3c617
4. 使用默认日志文件
Docker 默认使用 json-file
日志驱动将所有 STDOUT 和 STDERR 输出以 JSON 格式存储在宿主机上。路径为:
/var/lib/docker/containers/<container_id>/<container_id>-json.log
查看 PostgreSQL 容器的日志文件内容:
$ cat /var/lib/docker/containers/bce34bb3c6175fe92c50d6e5c8d2045062c2b502b9593a258ceb6cafc9a2356a/
bce34bb3c6175fe92c50d6e5c8d2045062c2b502b9593a258ceb6cafc9a2356a-json.log
{"log":"\r\n","stream":"stdout","time":"2022-05-16T18:13:58.833312658Z"}
{"log":"PostgreSQL Database directory appears to contain a database; Skipping initialization\r\n","stream":"stdout","time":"2022-05-16T18:13:58.833360038Z"}
{"log":"\r\n","stream":"stdout","time":"2022-05-16T18:13:58.833368499Z"}
5. 清理日志文件
日志文件过大时,可以使用 truncate
命令清空内容(注意:不能直接删除文件):
# 清空所有容器日志
$ truncate -s 0 /var/lib/docker/containers/*/*-json.log
# 清空指定容器日志
$ truncate -s 0 /var/lib/docker/containers/dd207f11ebf083f97355be1ae18420427dd2e80b061a7bf6fb0afc326ad04b10/*-json.log
还可以在启动容器时限制日志大小和数量:
$ docker run \
--log-opt max-size=1k \
--log-opt max-file=5 \
-itd \
-e POSTGRES_USER=baeldung \
-e POSTGRES_PASSWORD=baeldung \
-p 5432:5432 \
-v /data:/var/lib/postgresql/data \
--name postgresql-baeldung \
postgres
也可以通过 /etc/docker/daemon.json
配置全局日志策略:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "1k",
"max-file": "5"
}
}
修改后重启 Docker 服务生效。
6. 将日志重定向到指定文件
除了查看日志,还可以将日志输出到指定文件,便于后续分析:
$ docker logs -f postgresql-baeldung &> baeldung-postgres.log &
✅ 说明:
-f
:持续输出日志&>
:同时重定向 STDOUT 和 STDERR&
:后台运行
⚠️ 注意:这种方式不会自动轮转日志,需手动管理文件大小。
7. 总结
本文介绍了多种查看和管理 Docker 日志的方式:
- ✅ 使用
docker logs
查看实时日志 - ✅ 使用
--follow
、--tail
、--since
等参数过滤日志 - ✅ 直接查看
/var/lib/docker/containers/
下的 JSON 日志文件 - ✅ 使用
truncate
清空日志文件 - ✅ 启动时限制日志大小和数量
- ✅ 配置全局日志策略
- ✅ 将日志重定向到指定文件
合理使用这些方法,可以有效提升容器日志的可观测性和问题排查效率。