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 清空日志文件
  • ✅ 启动时限制日志大小和数量
  • ✅ 配置全局日志策略
  • ✅ 将日志重定向到指定文件

合理使用这些方法,可以有效提升容器日志的可观测性和问题排查效率。


原始标题:A Guide to Docker Logs