如何使用 docker system events 命令监控 Docker 活动

DockerDockerBeginner
立即练习

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

简介

在这个实验中,你将学习如何使用 docker system events 命令有效地监控 Docker 活动。你将从监听由拉取镜像和运行容器等操作生成的实时 Docker 事件开始。

随后,你将探索如何根据各种条件过滤这些事件。这包括使用 --since--until 标志按时间过滤,使用 --filter 标志按对象类型和操作过滤,以及组合多个过滤器以进行更具体的监控。最后,你将学习如何使用 --format 标志格式化事件输出,以便更好地阅读和分析。


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/ps("List Running Containers") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/run -.-> lab-555248{{"如何使用 docker system events 命令监控 Docker 活动"}} docker/ps -.-> lab-555248{{"如何使用 docker system events 命令监控 Docker 活动"}} docker/pull -.-> lab-555248{{"如何使用 docker system events 命令监控 Docker 活动"}} end

监听实时 Docker 事件

在这一步中,你将学习如何监听实时 Docker 事件。当某些操作发生时,例如启动、停止或删除容器、镜像或卷,Docker 守护进程会生成 Docker 事件。监控这些事件对于自动化、日志记录和调试很有用。

要监听 Docker 事件,你可以使用 docker events 命令。默认情况下,此命令会在事件发生时持续输出事件信息。

首先,让我们打开一个终端并运行 docker events 命令。这个命令会阻塞并等待事件。

docker events

现在,打开一个 新终端(保持第一个终端运行 docker events 命令)。在这个新终端中,我们将运行一个简单的 Docker 容器。这个操作会生成事件,你可以在第一个终端中看到这些事件。

在新终端中,运行以下命令来拉取 hello-world 镜像。这将生成一个 pull 事件。

docker pull hello-world

你应该会在第一个终端中看到输出,表明发生了镜像拉取事件。

接下来,运行 hello-world 容器。这将生成 createstartdie 事件。

docker run hello-world

观察第一个终端中的输出。你应该会看到与容器创建、启动以及随后退出(停止)相关的事件。

你可以通过按 Ctrl+C 来停止第一个终端中的 docker events 命令。

使用 --since--until 按时间过滤事件

在这一步中,你将学习如何使用 --since--until 标志根据时间过滤 Docker 事件。这对于查看特定时间范围内发生的事件很有用。

--since 标志允许你查看自特定时间以来发生的事件。--until 标志允许你查看截至特定时间发生的事件。你可以一起使用这些标志来指定一个时间窗口。

时间可以用多种格式指定,包括 RFC3339 日期格式(例如 2023-10-27T10:00:00Z)、Unix 时间戳(例如 1698393600)或相对时间(例如 10m 表示 10 分钟前,1h 表示 1 小时前)。

首先,让我们生成一些事件。我们将再次运行 hello-world 容器。

docker run hello-world

现在,让我们尝试查看过去 5 分钟内发生的事件。我们可以使用带有相对时间的 --since 标志。

docker events --since 5m

你应该会看到与你刚刚运行的 hello-world 容器相关的事件。

接下来,让我们尝试查看过去 10 分钟内但不是过去 2 分钟内发生的事件。我们可以同时使用带有相对时间的 --since--until 标志。

docker events --since 10m --until 2m

根据你运行 hello-world 容器的时间,你可能会看到这些事件,也可能看不到。如果你没有看到任何事件,请尝试调整时间范围。

你还可以使用绝对时间戳。要获取当前的 Unix 时间戳,你可以使用 date +%s 命令。

让我们获取当前的时间戳。

date +%s

现在,再次运行 hello-world 容器。

docker run hello-world

再次获取当前的时间戳。

date +%s

现在,使用你获取的两个时间戳和 --since--until 标志来查看这两个时间之间发生的事件。将 START_TIMESTAMPEND_TIMESTAMP 替换为你记录的实际时间戳。

docker events --since START_TIMESTAMP --until END_TIMESTAMP

你应该会看到在这两个时间戳之间运行 hello-world 容器所产生的事件。

使用 --filter 按对象类型和操作过滤事件

在这一步中,你将学习如何使用 --filter 标志根据对象类型和操作过滤 Docker 事件。这使你能够专注于特定类型的事件,例如容器事件或镜像事件,以及特定的操作,例如 createstartstopdelete

--filter 标志接受格式为 key=value 的键值对。按对象类型过滤时,键是 type,值可以是 containerimagevolumenetworkdaemonplugin。按操作过滤时,键是 event,值是特定的操作。

让我们从仅过滤容器事件开始。我们将再次运行 hello-world 容器以生成事件。

docker run hello-world

现在,使用带有 --filter type=container 标志的 docker events 命令来仅查看与容器相关的事件。

docker events --filter type=container --since 5m

你应该会看到 hello-world 容器的 createstartdie 等事件,但不会看到与镜像拉取相关的事件。

接下来,让我们过滤特定的操作,例如,仅查看容器的 start 事件。

docker events --filter type=container --filter event=start --since 5m

如果 hello-world 容器的 start 事件发生在过去 5 分钟内,此命令将仅显示该事件。

你还可以按对象的名称或 ID 进行过滤。例如,要过滤名为 my-container 的特定容器的事件,你可以使用 --filter container=my-container

让我们以特定名称运行 hello-world 容器。

docker run --name my-hello-container hello-world

现在,专门过滤名为 my-hello-container 的容器的事件。

docker events --filter container=my-hello-container --since 5m

你应该会看到过去 5 分钟内与 my-hello-container 相关的所有事件。

使用多个 --filter 标志按多个条件过滤事件

在这一步中,你将学习如何组合多个 --filter 标志,以同时根据多个条件过滤 Docker 事件。这使你能够创建更具体的过滤器,从而精确找到你感兴趣的事件。

当你使用多个 --filter 标志时,Docker 会应用“AND”逻辑。这意味着一个事件必须匹配 所有 指定的过滤器,才会被包含在输出中。

让我们结合按对象类型和操作进行过滤。我们将过滤容器的 start 事件。

首先,运行一个容器以生成一个 start 事件。

docker run hello-world

现在,使用两个 --filter 标志:一个用于对象类型 (type=container),另一个用于操作 (event=start)。我们还将使用 --since 5m 来限制时间范围。

docker events --filter type=container --filter event=start --since 5m

如果 hello-world 容器的 start 事件发生在过去 5 分钟内,你应该只会看到该事件。像 createdie 这样的事件将被排除,因为它们不匹配 event=start 过滤器。

你还可以结合按时间、类型和操作进行过滤。例如,让我们过滤过去 10 分钟内但不是过去 2 分钟内发生的容器 die 事件。

docker events --filter type=container --filter event=die --since 10m --until 2m

此命令将显示符合指定时间窗口的容器 die 事件。

你甚至可以添加更多的过滤器,例如按容器名称或镜像名称进行过滤。让我们过滤使用 ubuntu 镜像、名为 my-specific-container 的容器的 start 事件。

首先,拉取 ubuntu 镜像。

docker pull ubuntu

现在,以特定名称运行一个 ubuntu 容器。

docker run --name my-specific-container ubuntu echo "Hello from Ubuntu"

现在,过滤名为 my-specific-container 的容器的 start 事件。

docker events --filter type=container --filter event=start --filter container=my-specific-container --since 5m

如果 my-specific-containerstart 事件发生在过去 5 分钟内,你应该会看到该事件。

使用 --format 格式化事件输出

在这一步中,你将学习如何使用 --format 标志来格式化 Docker 事件的输出。这使你能够自定义每个事件显示的信息,从而更易于解析或阅读。

--format 标志使用 Go 的 text/template 包语法。你可以访问事件对象的各种字段,例如 .Time.Type.Action.Actor.ID.Actor.Attributes

让我们从显示每个事件的时间、类型和操作开始。

首先,通过运行 hello-world 容器生成一些事件。

docker run hello-world

现在,使用带有 --format 标志的 docker events 命令来指定所需的输出格式。我们将显示时间、类型和操作,并用制表符 (\t) 分隔。

docker events --since 5m --format '{{.Time}}\t{{.Type}}\t{{.Action}}'

你应该会看到类似于以下的输出,但时间戳和 ID 会不同:

2023-10-27 10:30:00.123456789 +0000 UTC	container	create
2023-10-27 10:30:00.987654321 +0000 UTC	container	start
2023-10-27 10:30:01.567890123 +0000 UTC	container	die

你还可以访问触发事件的参与者的属性。例如,要显示容器名称,你可以使用 .Actor.Attributes.name

让我们再次以指定名称运行 hello-world 容器。

docker run --name my-formatted-container hello-world

现在,格式化输出以包含容器名称。

docker events --since 5m --format '{{.Time}}\t{{.Type}}\t{{.Action}}\t{{.Actor.Attributes.name}}'

现在输出应该包含容器名称:

2023-10-27 10:35:00.123456789 +0000 UTC	container	create	my-formatted-container
2023-10-27 10:35:00.987654321 +0000 UTC	container	start	my-formatted-container
2023-10-27 10:35:01.567890123 +0000 UTC	container	die	my-formatted-container

你可以在格式字符串中使用各种模板函数和控制结构进行更复杂的格式化。更多详细信息请参考 Go 的 text/template 文档。

总结

在本次实验中,你学习了如何使用 docker events 命令实时监控 Docker 活动。你从监听所有 Docker 事件开始,观察了拉取和运行一个简单容器所产生的事件。

随后,你探索了如何根据各种条件过滤这些事件。你学会了使用 --since--until 标志按时间过滤事件,以查看特定时间范围内的事件。你还了解了如何使用 --filter 标志按对象类型和操作过滤事件,以及如何同时应用多个过滤器来缩小事件流范围。最后,你学习了如何使用 --format 标志格式化 docker events 命令的输出,以提高可读性和可解析性。