介绍
在本实验中,你将学习如何使用 docker compose top 命令来查看 Docker 容器内运行的进程。我们将从准备一个简单的 docker-compose.yml 文件开始,用于定义一个服务,然后使用 Docker Compose 启动该服务。最后,你将使用 docker compose top 命令(包括通用方式和指定服务名称的方式)来检查容器内运行的进程。
在本实验中,你将学习如何使用 docker compose top 命令来查看 Docker 容器内运行的进程。我们将从准备一个简单的 docker-compose.yml 文件开始,用于定义一个服务,然后使用 Docker Compose 启动该服务。最后,你将使用 docker compose top 命令(包括通用方式和指定服务名称的方式)来检查容器内运行的进程。
在本步骤中,我们将准备一个简单的 docker-compose.yml 文件。开始之前,让我们先了解什么是 Docker Compose。Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。通过 Compose,你可以使用 YAML 文件来配置应用服务,然后只需一条命令就能根据配置创建并启动所有服务。
由于 LabEx 环境中没有预装 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 已安装完成,让我们在 ~/project 目录下创建一个简单的 docker-compose.yml 文件。该文件将定义一个使用 ubuntu 镜像的服务,并运行 sleep infinity 命令来保持容器运行。
我们将使用 nano 编辑器来创建和编辑这个文件。
nano ~/project/docker-compose.yml
在 nano 编辑器中,粘贴以下内容:
version: "3.8"
services:
ubuntu_service:
image: ubuntu
command: sleep infinity
让我们解析这个 docker-compose.yml 文件:
version: '3.8' 指定了 Compose 文件格式版本services: 定义了应用的各个服务ubuntu_service: 是我们的服务名称,你可以任意命名image: ubuntu 指定了该服务使用的 Docker 镜像,这里我们使用官方的 ubuntu 镜像。如果本地没有该镜像,Docker Compose 会自动拉取command: sleep infinity 指定了容器启动时运行的命令,sleep infinity 是一个让容器无限期保持运行的简单命令粘贴内容后,按 Ctrl + X 保存文件,然后按 Y 确认,最后按 Enter 以默认文件名 docker-compose.yml 保存。
为了确保 ubuntu 镜像可用,我们先用 docker pull 命令手动拉取它。这是一个好习惯,可以确保在使用 Docker Compose 启动服务前镜像已准备就绪。
docker pull ubuntu
你应该能看到表明正在拉取 ubuntu 镜像的输出信息。
在本步骤中,我们将启动上一步创建的 docker-compose.yml 文件中定义的服务。我们将使用 docker compose up 命令来完成这个操作。
首先导航到保存 docker-compose.yml 文件的目录,即 ~/project。
cd ~/project
现在运行 docker compose up 命令。-d 参数表示以分离模式运行容器,即容器将在后台运行,不会阻塞你的终端。
docker compose up -d
你将看到输出信息,表明服务正在被创建和启动。Docker Compose 会创建一个网络、一个卷(如果定义了的话,虽然我们这个简单示例中没有)以及 ubuntu_service 的容器。
要验证容器是否正在运行,可以使用 docker ps 命令。
docker ps
你应该能看到一个容器列表,其中包含 ubuntu 镜像和 sleep infinity 命令。状态应显示为 Up。容器名称会以目录名(本例中是 project)和服务名(ubuntu_service)作为前缀。
在本步骤中,我们将使用 docker compose top 命令来显示由 Docker Compose 管理的容器内运行的所有进程。这个命令类似于 Linux 中的 top 命令,但它显示的是容器内部运行的进程。
请确保你仍在存放 docker-compose.yml 文件的 ~/project 目录下。
cd ~/project
现在运行 docker compose top 命令。
docker compose top
你将看到类似以下的输出:
ID NAME PID COMMAND ELAPSED
<container_id> project-ubuntu_service-1 <pid> sleep infinity <time>
该输出显示了由你的 docker-compose.yml 文件管理的每个容器内运行的进程。在我们的例子中,只有一个服务(ubuntu_service),且唯一运行的进程就是我们在 docker-compose.yml 文件中指定的 sleep infinity 命令。
输出包含以下信息:
ID:容器 IDNAME:容器名称,通常格式为 <目录名>-<服务名>-<实例编号>PID:容器内运行命令的进程 IDCOMMAND:容器内正在执行的命令ELAPSED:命令启动后经过的时间这个命令对于检查容器内运行的内容以及排查问题非常有用。
在本步骤中,我们将学习如何使用 docker compose top 命令来查看 docker-compose.yml 文件中特定服务的进程。当你运行了多个服务但只想检查其中一个服务的进程时,这个功能特别有用。
请确保你仍在 ~/project 目录下。
cd ~/project
要查看特定服务的进程,你需要在 docker compose top 命令后追加服务名称。在我们的 docker-compose.yml 文件中,服务名称为 ubuntu_service。
docker compose top ubuntu_service
你将看到与上一步类似的输出,但这次只会显示 ubuntu_service 容器的进程:
ID NAME PID COMMAND ELAPSED
<container_id> project-ubuntu_service-1 <pid> sleep infinity <time>
如果你的 docker-compose.yml 文件中定义了其他服务并且它们正在运行,直接运行不带服务名的 docker compose top 会显示所有服务的进程。通过指定 ubuntu_service,我们筛选了输出结果,使其仅显示该特定服务容器内的进程。
这种针对性查看的方式对于调试和监控多容器应用中的单个组件非常有帮助。
在本实验中,我们学习了如何使用 docker compose top 命令来查看由 Docker Compose 管理的容器内运行的进程。我们首先准备了一个简单的 docker-compose.yml 文件,包括安装 Docker Compose 并使用 ubuntu 镜像定义了一个服务,通过 sleep infinity 命令保持容器持续运行。
准备工作完成后,我们启动了 docker-compose.yml 文件中定义的服务。最后,我们探索了 docker compose top 命令的使用方法:先查看所有服务的运行进程,再通过指定服务名称来查看单个服务的进程。这个动手实践展示了如何检查由 Docker Compose 管理的容器内运行的进程。