简介
在这个实验中,你将学习如何使用 docker system events
命令有效地监控 Docker 活动。你将从监听由拉取镜像和运行容器等操作生成的实时 Docker 事件开始。
随后,你将探索如何根据各种条件过滤这些事件。这包括使用 --since
和 --until
标志按时间过滤,使用 --filter
标志按对象类型和操作过滤,以及组合多个过滤器以进行更具体的监控。最后,你将学习如何使用 --format
标志格式化事件输出,以便更好地阅读和分析。
在这个实验中,你将学习如何使用 docker system events
命令有效地监控 Docker 活动。你将从监听由拉取镜像和运行容器等操作生成的实时 Docker 事件开始。
随后,你将探索如何根据各种条件过滤这些事件。这包括使用 --since
和 --until
标志按时间过滤,使用 --filter
标志按对象类型和操作过滤,以及组合多个过滤器以进行更具体的监控。最后,你将学习如何使用 --format
标志格式化事件输出,以便更好地阅读和分析。
在这一步中,你将学习如何监听实时 Docker 事件。当某些操作发生时,例如启动、停止或删除容器、镜像或卷,Docker 守护进程会生成 Docker 事件。监控这些事件对于自动化、日志记录和调试很有用。
要监听 Docker 事件,你可以使用 docker events
命令。默认情况下,此命令会在事件发生时持续输出事件信息。
首先,让我们打开一个终端并运行 docker events
命令。这个命令会阻塞并等待事件。
docker events
现在,打开一个 新终端(保持第一个终端运行 docker events
命令)。在这个新终端中,我们将运行一个简单的 Docker 容器。这个操作会生成事件,你可以在第一个终端中看到这些事件。
在新终端中,运行以下命令来拉取 hello-world
镜像。这将生成一个 pull
事件。
docker pull hello-world
你应该会在第一个终端中看到输出,表明发生了镜像拉取事件。
接下来,运行 hello-world
容器。这将生成 create
、start
和 die
事件。
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_TIMESTAMP
和 END_TIMESTAMP
替换为你记录的实际时间戳。
docker events --since START_TIMESTAMP --until END_TIMESTAMP
你应该会看到在这两个时间戳之间运行 hello-world
容器所产生的事件。
--filter
按对象类型和操作过滤事件在这一步中,你将学习如何使用 --filter
标志根据对象类型和操作过滤 Docker 事件。这使你能够专注于特定类型的事件,例如容器事件或镜像事件,以及特定的操作,例如 create
、start
、stop
或 delete
。
--filter
标志接受格式为 key=value
的键值对。按对象类型过滤时,键是 type
,值可以是 container
、image
、volume
、network
、daemon
或 plugin
。按操作过滤时,键是 event
,值是特定的操作。
让我们从仅过滤容器事件开始。我们将再次运行 hello-world
容器以生成事件。
docker run hello-world
现在,使用带有 --filter type=container
标志的 docker events
命令来仅查看与容器相关的事件。
docker events --filter type=container --since 5m
你应该会看到 hello-world
容器的 create
、start
和 die
等事件,但不会看到与镜像拉取相关的事件。
接下来,让我们过滤特定的操作,例如,仅查看容器的 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 分钟内,你应该只会看到该事件。像 create
或 die
这样的事件将被排除,因为它们不匹配 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-container
的 start
事件发生在过去 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
命令的输出,以提高可读性和可解析性。