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

DockerBeginner
立即练习

介绍

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

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

准备一个简单的 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 项目中特定服务相关的事件。