如何使用 docker compose logs 命令查看容器输出

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何高效使用 docker logs 命令查看 Docker 容器的输出内容。我们将从理解如何查看运行中容器的基础日志开始。

在掌握基础操作后,你将进一步探索如何实时追踪容器日志,这对于监控和调试活跃进程至关重要。最后,你将学习如何通过包含时间戳、指定显示日志末尾的行数以及基于时间范围筛选日志等方式,来提升日志查看体验。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/logs("View Container Logs") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/images("List Images") subgraph Lab Skills docker/run -.-> lab-555082{{"如何使用 docker compose logs 命令查看容器输出"}} docker/logs -.-> lab-555082{{"如何使用 docker compose logs 命令查看容器输出"}} docker/pull -.-> lab-555082{{"如何使用 docker compose logs 命令查看容器输出"}} docker/images -.-> lab-555082{{"如何使用 docker compose logs 命令查看容器输出"}} end

启动服务并查看基础日志

在本步骤中,我们将学习如何启动 Docker 容器并查看其基础日志。日志对于理解容器内部运行状态、调试问题以及监控其行为至关重要。

首先,让我们从 Docker Hub 拉取一个简单的 Nginx 镜像。该镜像将用于运行一个 Web 服务器容器。

docker pull nginx:latest

你将看到显示镜像正在下载的输出。下载完成后,可以通过列出镜像来验证该镜像已本地可用:

docker images

现在,让我们基于 Nginx 镜像运行一个容器。我们将使用 detached 模式(-d)使其在后台运行,并将其命名为 my-nginx

docker run -d --name my-nginx nginx

该命令的输出将是容器 ID,这表示容器已在后台成功启动。

要查看 my-nginx 容器生成的基础日志,我们使用 docker logs 命令后接容器名称或 ID。

docker logs my-nginx

你将看到容器内运行的 Nginx 进程的标准输出和标准错误流。这些日志通常包含 Nginx 服务器启动和处理请求的相关信息。

实时追踪日志

在上一步中,我们查看了容器启动后的日志。但有时你需要实时查看日志生成过程,这对于调试或监控活跃进程特别有用。

要实时追踪容器日志,我们使用带有 -f(或 --follow)选项的 docker logs 命令。这将保持终端开启,并在新日志条目出现时立即显示。

让我们实时追踪 my-nginx 容器的日志:

docker logs -f my-nginx

该命令会先显示当前日志,然后等待新日志条目。由于我们的 Nginx 容器正在运行但没有活跃的请求处理,你可能不会立即看到新日志。

为了生成一些新日志条目,我们可以向容器内运行的 Nginx 服务器发送请求。默认情况下,Nginx 监听 80 端口。虽然我们在 docker run 命令中没有将端口映射到主机,但仍可以通过 curl 从主机内部访问容器的网络。

在 LabEx 环境中打开一个新的终端标签页。在这个新标签页中执行以下命令向 Nginx 容器发送请求:

curl http://localhost:80

你应该会在新终端标签页中看到默认的 Nginx 欢迎页面 HTML 输出。

现在切换回正在追踪日志的终端标签页(docker logs -f my-nginx)。你应该能看到新的日志条目出现,表明 Nginx 处理了来自 curl 的请求。这些条目通常包含客户端 IP、请求方法、请求路径和 HTTP 状态码等信息。

要停止追踪日志,在运行 docker logs -f 的终端中按下 Ctrl+C

查看带时间戳和特定尾部日志

在前面的步骤中,我们查看了基础日志并实时追踪了日志。然而,基础的 docker logs 输出不包含时间戳,这使得关联事件或理解日志条目的时间顺序变得困难。此外,有时你只需要查看最近的日志条目。

要在日志输出中包含时间戳,我们使用带有 -t(或 --timestamps)选项的 docker logs 命令。

让我们查看带时间戳的 my-nginx 容器日志:

docker logs -t my-nginx

现在你将看到每个日志条目前都带有时间戳,表明该日志条目是由容器生成的时间。这对调试和分析非常有帮助。

有时,你只对最近的日志条目感兴趣,类似于在 Linux 中使用 tail 命令。docker logs 命令为此提供了 --tail 选项。你可以指定要从日志末尾查看的行数。

例如,要仅查看 my-nginx 容器的最后 5 条日志:

docker logs --tail 5 my-nginx

这将仅输出容器日志的最后 5 行。你可以将 --tail-t 结合使用,查看带时间戳的最后几条日志。

docker logs -t --tail 5 my-nginx

该命令将显示最后 5 条日志条目,每条都带有对应的时间戳。

按时间范围筛选日志

除了查看全部日志或最近日志外,你还可以按特定时间范围筛选容器日志。这在调查特定时间段内发生的事件时特别有用。

docker logs 命令提供了 --since--until 选项来基于时间筛选日志。这些选项支持多种时间格式,包括 RFC3339 时间戳、Unix 时间戳或相对时间(例如 10m 表示 10 分钟,1h 表示 1 小时)。

让我们尝试筛选日志。首先需要在不同时间生成一些日志。我们可以再次向 Nginx 容器发送 curl 请求来实现。

打开一个新的终端标签页,间隔几秒多次运行 curl 命令:

curl http://localhost:80
sleep 5
curl http://localhost:80
sleep 5
curl http://localhost:80

现在查看带时间戳的 my-nginx 容器日志,观察这些请求的时间:

docker logs -t my-nginx

注意 curl 命令生成的日志条目的时间戳。

要筛选特定时间之后的日志,可以使用 --since 选项。例如查看最近 1 分钟生成的日志:

docker logs --since 1m my-nginx

该命令将显示 my-nginx 容器在过去 1 分钟内生成的所有日志条目。

你也可以使用 --until 选项筛选特定时间之前的日志。例如查看 1 分钟前生成的日志:

docker logs --until 1m my-nginx

该命令将显示 my-nginx 容器在 1 分钟前生成的所有日志条目。

你可以组合使用 --since--until 来查看特定时间窗口内的日志。例如查看 5 分钟前到 1 分钟前的日志:

docker logs --since 5m --until 1m my-nginx

请注意,具体输出结果取决于你执行 curl 命令和运行 docker logs 命令的时间。

总结

在本实验中,我们学习了使用 docker logs 命令查看容器输出的基本步骤。首先我们拉取了 Docker 镜像并以分离模式运行容器。随后,我们探索了如何查看运行容器生成的基础日志,这些日志可以帮助我们了解容器的启动和运行情况。

此外,我们还深入学习了如何使用 -f 选项实时追踪容器日志,从而能够持续监控日志流的生成过程。这种实时日志功能对于调试和观察容器的动态行为至关重要。