介绍
在这个实验中,你将学习如何有效使用 docker service logs 命令来查看和管理 Docker 服务及其各个任务生成的日志。我们将首先使用 alpine 镜像和 ping 命令创建一个简单的 Docker 服务。
创建服务后,你将探索如何查看整个服务的日志,从而获得所有正在运行的任务输出的汇总视图。然后,你将学习如何缩小范围,查看服务中特定任务的日志。最后,本实验将演示如何利用 docker service logs 命令的各种选项,根据你的需求过滤和格式化日志输出。
创建一个简单的 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 行。



