如何使用 docker service logs 命令查看服务和任务日志

DockerDockerBeginner
立即练习

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

简介

在这个实验中,你将学习如何有效使用 docker service logs 命令来查看和管理 Docker 服务及其各个任务生成的日志。我们将首先使用 alpine 镜像和 ping 命令创建一个简单的 Docker 服务。

创建服务后,你将探索如何查看整个服务的日志,从而获得所有正在运行的任务输出的汇总视图。然后,你将学习如何缩小范围,查看服务中特定任务的日志。最后,本实验将演示如何利用 docker service logs 命令的各种选项,根据你的需求过滤和格式化日志输出。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/logs("View Container Logs") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/run -.-> lab-555226{{"如何使用 docker service logs 命令查看服务和任务日志"}} docker/ls -.-> lab-555226{{"如何使用 docker service logs 命令查看服务和任务日志"}} docker/ps -.-> lab-555226{{"如何使用 docker service logs 命令查看服务和任务日志"}} docker/rm -.-> lab-555226{{"如何使用 docker service logs 命令查看服务和任务日志"}} docker/logs -.-> lab-555226{{"如何使用 docker service logs 命令查看服务和任务日志"}} docker/pull -.-> lab-555226{{"如何使用 docker service logs 命令查看服务和任务日志"}} end

创建一个简单的 Docker 服务

在这一步中,我们将使用 docker service create 命令创建一个简单的 Docker 服务。Docker 服务是一组使用相同镜像的容器。当你创建一个服务时,你需要定义要使用的容器镜像以及在容器内部执行的命令。

首先,让我们拉取 alpine 镜像,它是一种轻量级的 Linux 发行版,常用于 Docker 容器。

docker pull alpine

你应该会看到表明镜像正在被拉取和下载的输出。

Using default tag: latest
latest: Pulling from library/alpine
...
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest

现在,我们将使用 alpine 镜像创建一个名为 my-service 的 Docker 服务。我们还将指定 ping labex.io 命令在服务的每个容器内运行。--name 标志为服务指定一个名称,alpine ping labex.io 部分指定了要使用的镜像和要运行的命令。

docker service create --name my-service alpine ping labex.io

执行该命令后,你会看到类似下面的输出,表明服务已创建。那一串长字符就是服务 ID。

p1234567890abcdefghijklmnopqrstu
overall progress: 1 out of 1 tasks
1/1: running   [==================================================>]
verify: Service converged

要验证服务是否正在运行,你可以使用 docker service ls 命令。该命令会列出在你的 Docker swarm 上运行的所有服务。

docker service ls

你应该会看到类似下面的输出,显示你的 my-service 已列出,并且有 1 个副本正在运行。

ID             NAME         MODE         REPLICAS   IMAGE          PORTS
p1234567890   my-service   replicated   1/1        alpine:latest

这证实了你的 Docker 服务 my-service 已成功创建,并且有一个任务(容器)正在执行 ping labex.io 命令。

查看整个服务的日志

在上一步中,我们创建了一个名为 my-service 的 Docker 服务,该服务运行一个执行 ping labex.io 命令的容器。此命令在运行时会生成输出(日志)。在这一步中,我们将学习如何查看整个服务的日志。

要查看 Docker 服务的日志,你可以使用 docker service logs 命令,后跟服务名称。

docker service logs my-service

执行此命令将显示属于 my-service 服务的所有任务(容器)生成的日志。由于我们的服务目前只有一个任务,你将看到在该容器中运行的 ping labex.io 命令的输出。

my-service.1.abcdefghijkl  PING labex.io (1.2.3.4): 56 data bytes
my-service.1.abcdefghijkl  64 bytes from 1.2.3.4: seq=0 ttl=50 time=123.456 ms
my-service.1.abcdefghijkl  64 bytes from 1.2.3.4: seq=1 ttl=50 time=123.456 ms
...

输出显示了日志条目,前缀为服务名称、任务编号和唯一的任务 ID。这有助于你识别哪个任务生成了哪个日志条目,特别是当一个服务有多个任务在运行时。

你还可以使用 -f--follow 标志来实时流式传输日志。这对于在服务运行时监控其活动很有用。

docker service logs -f my-service

此命令将在服务的任务生成新的日志条目时持续显示它们。要停止跟踪日志,请按 Ctrl+C

查看整个服务的日志有助于全面了解服务的健康状况和活动情况。

查看服务中特定任务的日志

在上一步中,我们查看了整个 my-service 的日志。当一个服务有多个任务(副本)时,查看合并后的日志可能会让人应接不暇。在这一步中,我们将学习如何查看服务中特定任务的日志。

首先,我们需要确定想要查看日志的任务 ID。我们可以使用 docker service ps 命令获取此信息,该命令会列出与服务关联的任务。

docker service ps my-service

此命令将显示 my-service 正在运行的任务。输出将类似于以下内容:

ID             NAME           IMAGE          NODE         DESIRED STATE   CURRENT STATE           ERROR   PORTS
abcdefghijkl   my-service.1   alpine:latest   labex-vm   Running         Running 2 minutes ago

在这个输出中,abcdefghijkl 是任务 ID,my-service.1 是任务名称。任务名称由服务名称和任务编号组成。

要查看特定任务的日志,你可以使用 docker service logs 命令,后跟任务 ID。

docker service logs abcdefghijkl

注意: 请将 abcdefghijkl 替换为你从 docker service ps 命令输出中获得的实际任务 ID。

执行此命令将仅显示该特定任务运行的容器所生成的日志。这对于调试单个任务的问题很有用。

my-service.1.abcdefghijkl  PING labex.io (1.2.3.4): 56 data bytes
my-service.1.abcdefghijkl  64 bytes from 1.2.3.4: seq=0 ttl=50 time=123.456 ms
my-service.1.abcdefghijkl  64 bytes from 1.2.3.4: seq=1 ttl=50 time=123.456 ms
...

你也可以在此处使用 -f 标志来实时跟踪特定任务的日志。

docker service logs -f abcdefghijkl

查看单个任务的日志可以让你隔离问题并了解服务特定实例的行为。

使用选项过滤和格式化服务日志

在这一步中,我们将探索一些有用的选项,用于过滤和格式化 docker service logs 命令的输出。这些选项可以帮助你在日志中查找特定信息,并使输出更易于阅读。

一个常见的需求是仅查看最新的日志条目。你可以使用 --tail 选项指定从日志末尾开始显示的行数。例如,要查看 my-service 的最后 5 行日志:

docker service logs --tail 5 my-service

这将输出该服务的最后 5 条日志条目。

my-service.1.abcdefghijkl  64 bytes from 1.2.3.4: seq=10 ttl=50 time=123.456 ms
my-service.1.abcdefghijkl  64 bytes from 1.2.3.4: seq=11 ttl=50 time=123.456 ms
my-service.1.abcdefghijkl  64 bytes from 1.2.3.4: seq=12 ttl=50 time=123.456 ms
my-service.1.abcdefghijkl  64 bytes from 1.2.3.4: seq=13 ttl=50 time=123.456 ms
my-service.1.abcdefghijkl  64 bytes from 1.2.3.4: seq=14 ttl=50 time=123.456 ms

另一个有用的选项是 --since,它允许你查看特定时间戳或时间段之后生成的日志。例如,要查看最近 5 分钟内生成的日志:

docker service logs --since 5m my-service

你还可以指定 RFC3339Nano 格式的特定时间戳、日期(YYYY-MM-DD)或日期和时间(YYYY-MM-DDTHH:MM:SS)。

要在输出中包含时间戳,请使用 --timestamps-t 标志:

docker service logs -t my-service

这将在每个日志条目的开头添加一个时间戳。

2023-10-27T10:30:00.123456789Z my-service.1.abcdefghijkl  PING labex.io (1.2.3.4): 56 data bytes
2023-10-27T10:30:01.123456789Z my-service.1.abcdefghijkl  64 bytes from 1.2.3.4: seq=0 ttl=50 time=123.456 ms
...

最后,你可以组合这些选项来优化日志查看。例如,要查看带有时间戳的最后 10 条日志条目:

docker service logs --tail 10 -t my-service

这些选项为你查看和分析 Docker 服务日志提供了灵活性,使你更轻松地监控和排查应用程序问题。

在结束实验之前,让我们清理我们创建的服务。我们可以使用 docker service rm 命令移除该服务。

docker service rm my-service

你将看到确认服务已移除的输出。

my-service

此命令将停止并移除与该服务关联的所有任务。

总结

在本次实验中,我们学习了如何使用 docker service create 命令创建一个简单的 Docker 服务,同时指定镜像以及服务任务中要运行的命令。我们使用 docker service ls 验证了服务的创建和状态。

接着,我们探索了如何使用 docker service logs <service_name> 查看整个服务的日志,以及如何查看服务中特定任务的日志。具体做法是,先使用 docker service ps <service_name> 确定任务 ID,然后使用 docker service logs <task_id> 查看日志。最后,我们学习了如何在 docker service logs 中使用各种选项来过滤和格式化日志输出,例如使用 --follow 实时流式查看日志、使用 --since 查看特定时间之后的日志,以及使用 --tail 查看日志的最后 N 行。