如何使用 docker compose events 命令监控容器事件

DockerDockerBeginner
立即练习

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

简介

在本实验中,你将学习如何使用 docker compose events 命令来监控容器事件。我们将从准备一个简单的 Docker Compose 项目开始,包括安装 Docker Compose 和创建一个基础的 docker-compose.yml 文件。

完成环境搭建后,你将启动项目中定义的服务并观察生成的基础事件。接着我们将探索如何使用 --json 参数以结构化的 JSON 格式输出这些事件。最后,你将学习如何过滤事件,仅监控 Docker Compose 应用中特定服务的相关事件。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/start("Start Container") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/ps -.-> lab-555078{{"如何使用 docker compose events 命令监控容器事件"}} docker/start -.-> lab-555078{{"如何使用 docker compose events 命令监控容器事件"}} docker/stop -.-> lab-555078{{"如何使用 docker compose events 命令监控容器事件"}} docker/pull -.-> lab-555078{{"如何使用 docker compose events 命令监控容器事件"}} end

准备一个简单的 Docker Compose 项目

在这一步中,我们将准备一个简单的 Docker Compose 项目。由于 LabEx 环境中没有预装 Docker Compose,我们需要先安装它。Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。通过 Compose,你可以使用 YAML 文件来配置应用服务,然后只需一条命令就能根据配置创建并启动所有服务。

首先,让我们安装 Docker Compose。我们将下载 Docker Compose 二进制文件并赋予可执行权限。

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

安装完成后,你可以通过检查 Docker Compose 版本来验证安装是否成功。

docker-compose --version

你应该会看到类似 Docker Compose version v2.20.2 的输出。

现在,让我们为项目创建一个目录并进入该目录。我们将创建一个包含单个服务的简单项目。

mkdir ~/project/my-compose-app
cd ~/project/my-compose-app

接下来,我们将在该目录中创建 docker-compose.yml 文件。这个文件将定义我们的服务。我们将使用 nano 编辑器来创建和编辑这个文件。

nano docker-compose.yml

nano 编辑器中,粘贴以下内容。这个配置定义了一个名为 web 的服务,它使用 nginx:latest 镜像。

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"

让我们分解这个 docker-compose.yml 文件:

  • version: '3.8' 指定了 Docker Compose 文件格式版本
  • services: 定义了组成你应用的服务
  • web: 是我们的服务名称
  • image: nginx:latest 指定了该服务使用的 Docker 镜像,这里我们使用官方 Nginx 镜像的最新版本
  • ports: 映射主机和容器之间的端口,"80:80" 将主机的 80 端口映射到容器的 80 端口

Ctrl + X,然后按 YEnter 保存文件。

在启动服务之前,让我们先拉取 nginx:latest 镜像。虽然 Docker Compose 会在镜像不存在时自动拉取,但提前显式拉取有时会很有帮助。

docker pull nginx:latest

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

现在我们已经准备好了 docker-compose.yml 文件并拉取了所需的镜像。在下一步中,我们将启动这个文件中定义的服务。

启动服务并观察基础事件

在本步骤中,我们将启动 docker-compose.yml 文件中定义的服务,并观察 Docker 生成的基础事件。Docker 事件是关于 Docker 守护进程和容器运行状态的实时信息,包括容器创建、启动、停止和销毁等操作。

首先,请确保你位于上一步创建 docker-compose.yml 文件的目录 ~/project/my-compose-app 中。

cd ~/project/my-compose-app

现在,我们将使用 docker-compose up 命令启动服务。-d 参数表示以分离模式运行容器,容器将在后台运行且不会占用终端。

docker-compose up -d

你将看到输出信息,表明网络和 web 服务容器正在被创建并启动。

[+] Running 2/2
 ⠿ Network my-compose-app_default  Created
 ⠿ Container my-compose-app-web-1  Started

要观察基础的 Docker 事件,我们将使用 docker events 命令。该命令会实时输出 Docker 守护进程的事件流。

docker events

你将看到与 Docker 环境相关的持续事件流。由于我们刚启动了一个容器,你应该能看到与 my-compose-app-web-1 容器相关的创建、启动等事件。输出内容大致如下(时间戳和具体细节会有所不同):

2023-10-27T10:00:00.123456789Z container create 1234567890abcdef... (image=nginx:latest, name=my-compose-app-web-1, ...)
2023-10-27T10:00:01.987654321Z container start 1234567890abcdef... (image=nginx:latest, name=my-compose-app-web-1, ...)
...

docker events 命令将持续运行并显示新发生的事件。按 Ctrl + C 可停止命令并返回终端提示符。

你也可以使用 docker ps 命令查看正在运行的容器状态。

docker ps

你应该能看到状态为 Upmy-compose-app-web-1 容器。

CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                               NAMES
...            nginx:latest   "nginx -g 'daemon off"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp, :::80->80/tcp   my-compose-app-web-1

在本步骤中,我们成功启动了 Docker Compose 服务并观察了 Docker 生成的基础事件。下一步我们将探索如何以 JSON 格式输出这些事件。

使用 --json 参数以 JSON 格式输出事件

在本步骤中,我们将学习如何通过 docker events 命令配合 --json 参数以 JSON 格式输出 Docker 事件。JSON 格式的输出对于程序化处理以及与其他工具的集成非常有用。

首先,请确保你位于 ~/project/my-compose-app 目录中。

cd ~/project/my-compose-app

现在,让我们运行带有 --json 参数的 docker events 命令。这将以 JSON 格式流式输出事件。

docker events --json

你将看到连续的 JSON 对象流,每个对象代表一个 Docker 事件。输出内容大致如下(具体细节会有所不同):

{"status":"create","id":"1234567890abcdef...","from":"nginx:latest","Type":"container","Action":"create","Actor":{"ID":"1234567890abcdef...","Attributes":{"image":"nginx:latest","name":"my-compose-app-web-1"}},"scope":"local","time":1678886400,"timeNano":1678886400123456789}
{"status":"start","id":"1234567890abcdef...","from":"nginx:latest","Type":"container","Action":"start","Actor":{"ID":"1234567890abcdef...","Attributes":{"image":"nginx:latest","name":"my-compose-app-web-1"}},"scope":"local","time":1678886401,"timeNano":1678886401987654321}
...

每一行都是一个有效的 JSON 对象,包含事件的详细信息,如事件 status、受影响对象的 idTypeAction,以及包含镜像名称和容器名称等 AttributesActor 详情。

为了演示如何捕获这些事件,让我们在 docker events --json 命令运行于另一个终端或后台时,先停止再启动 web 服务。由于本实验只使用单个终端,我们将先按 Ctrl + C 停止 docker events --json 命令。

现在,让我们停止 web 服务。

docker-compose stop web

你应该会看到表明 web 容器正在停止的输出。

[+] Stopping 1/1
 ⠿ Container my-compose-app-web-1  Stopped

现在,让我们在后台运行 docker events --json,然后再次启动服务。我们将使用 & 符号让命令在后台运行。

docker events --json &

你将看到一个进程 ID (PID) 被打印出来,表明命令正在后台运行。

现在,再次启动 web 服务。

docker-compose start web

你应该会看到表明 web 容器正在启动的输出。

[+] Starting 1/1
 ⠿ Container my-compose-app-web-1  Started

运行在后台的 docker events --json 命令将捕获 stopstart 事件。要查看后台进程的输出,你可能需要使用 fg 命令将其切换到前台,或者在后台进程停止后检查终端输出。不过对于本步骤的目的而言,仅运行带有 --json 参数的命令就足以理解输出格式。

要停止后台的 docker events --json 进程,你可以使用 jobs 命令列出后台任务,然后使用 kill %<任务编号>。或者,你也可以通过 ps aux | grep 'docker events --json' 查找进程 ID 并使用 kill 命令配合 PID。在本场景中更简单的方法是直接进入下一步,因为后台进程不会造成显著影响。

在本步骤中,我们成功使用 --json 参数以结构化的 JSON 格式查看 Docker 事件,这对于自动化和分析非常有价值。

过滤特定服务的事件

在本步骤中,我们将学习如何过滤 Docker 事件,仅查看与特定服务或容器相关的事件。这在包含多个容器的环境中非常有用,当你只需要监控某个特定应用或服务的事件时尤为实用。

docker events 命令支持使用 --filter 参数进行过滤。你可以根据多种条件进行过滤,例如 container(容器)、image(镜像)、event(事件)、label(标签)等。

首先,请确保你位于 ~/project/my-compose-app 目录中。

cd ~/project/my-compose-app

我们的服务在 docker-compose.yml 文件中被命名为 web,而 Docker Compose 生成的容器名称通常遵循 <项目名称>_<服务名称>_<实例编号> 的格式。在我们的案例中,项目名称是 my-compose-app(源自目录名称),服务名称是 web,实例编号是 1。因此容器名称为 my-compose-app-web-1

让我们过滤事件,仅显示与 web 容器相关的内容。我们可以使用 container 过滤器配合容器名称。

docker events --filter container=my-compose-app-web-1

现在,该命令将仅显示影响对象为 my-compose-app-web-1 容器的事件。为了观察效果,让我们在命令运行期间再次停止并启动 web 服务。

首先,按 Ctrl + C 停止 docker events 命令。

现在,在后台运行过滤后的 docker events 命令。

docker events --filter container=my-compose-app-web-1 &

你将看到后台进程 ID。

现在,使用 Docker Compose 停止 web 服务。

docker-compose stop web

你应该会看到容器正在停止的输出。后台的 docker events 命令应该会捕获到 my-compose-app-web-1 容器的 stop 事件。

接着,再次启动 web 服务。

docker-compose start web

你应该会看到容器正在启动的输出。后台的 docker events 命令应该会捕获到 my-compose-app-web-1 容器的 start 事件。

你也可以根据其他条件进行过滤。例如,要按镜像过滤事件,可以使用 --filter image=nginx:latest

要停止后台的 docker events 进程,可以使用 jobskill %<任务编号> 或找到 PID 后使用 kill <PID>。对于本实验,你可以直接继续。

最后,让我们清理由 Docker Compose 创建的运行中容器和网络。

docker-compose down

该命令将停止并移除 docker-compose.yml 文件中定义的容器、网络和卷。

[+] Running 2/1
 ⠿ Container my-compose-app-web-1  Removed
 ⠿ Network my-compose-app_default  Removed

在本步骤中,我们学习了如何使用 --filter 参数过滤 Docker 事件,这对于在繁忙的 Docker 环境中监控特定组件至关重要。我们还清理了实验过程中创建的资源。

总结

在本实验中,我们学习了如何使用 docker compose events 命令来监控容器事件。我们首先准备了一个简单的 Docker Compose 项目,包括安装 Docker Compose 和创建一个定义了基础 Nginx 服务的 docker-compose.yml 文件。

完成项目设置后,我们启动了服务并观察了 Docker Compose 生成的基础事件。接着,我们探索了如何使用 --json 参数以 JSON 格式输出这些事件,以便于解析和分析。最后,我们学习了如何过滤事件,仅监控 Docker Compose 项目中特定服务相关的事件。