介绍
在本实验中,你将学习如何使用 docker compose pause 命令来临时暂停 docker-compose.yml 文件中定义的运行中服务。我们将从创建一个简单的 docker-compose.yml 文件开始,该文件使用 Nginx 镜像定义了一个 web 服务。
在创建完 docker-compose.yml 文件后,你将学习如何使用 docker compose up 启动服务,使用 docker compose pause 暂停特定的运行中服务,验证服务是否确实已暂停,最后使用 docker compose unpause 恢复服务。这个动手练习将为你提供管理 Docker Compose 服务生命周期的实践经验。
创建简单的 docker-compose.yml 文件
在本步骤中,我们将创建一个简单的 docker-compose.yml 文件。开始之前,我们需要先安装 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 my-docker-app
cd my-docker-app
在 my-docker-app 目录中,我们将创建一个名为 docker-compose.yml 的文件。该文件将定义我们应用程序的服务。我们将使用 nano 编辑器来创建和编辑这个文件。
nano docker-compose.yml
在 nano 编辑器中,粘贴以下内容。这个 docker-compose.yml 文件定义了一个名为 web 的服务,它使用 nginx:latest 镜像。
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
让我们分解这个文件的内容:
version: '3.8'指定了 Docker Compose 文件格式的版本services:定义了组成你应用程序的服务web:是我们的服务名称image: nginx:latest指定了该服务使用的 Docker 镜像,这里我们使用最新版的 Nginx 镜像ports:映射主机和容器之间的端口,"80:80"将主机的 80 端口映射到容器的 80 端口
粘贴内容后,按 Ctrl + X,然后按 Y,最后按 Enter 保存文件。
在启动服务之前,我们需要确保本地已有 nginx:latest 镜像。如果没有,Docker Compose 会在启动服务时自动拉取该镜像。不过你也可以使用 docker pull 命令手动拉取镜像。
docker pull nginx:latest
这条命令会从 Docker Hub 下载 nginx:latest 镜像。
启动 docker-compose.yml 中定义的服务
在本步骤中,我们将启动 docker-compose.yml 文件中定义的服务。我们将使用 docker-compose up 命令来构建、创建并启动这些服务。
请确保你位于 ~/project/my-docker-app 目录下,这是上一步创建 docker-compose.yml 文件的位置。
cd ~/project/my-docker-app
现在运行以下命令来启动服务。-d 参数表示以分离模式运行容器,即容器将在后台运行。
docker-compose up -d
该命令会读取 docker-compose.yml 文件,根据服务定义创建必要的容器并启动它们。如果你的系统中还没有 nginx:latest 镜像,Docker Compose 会在启动容器前自动拉取它。
你将看到输出信息,显示网络、卷(如果有)和服务容器正在被创建和启动。例如:
[+] Running 1/1
⠿ Container my-docker-app-web-1 Started
要验证服务是否正在运行,可以使用 docker-compose ps 命令。该命令会列出当前目录下由 Docker Compose 管理的容器。
docker-compose ps
你应该会看到类似以下的输出,显示 web 服务容器的状态为 running:
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
my-docker-app-web-1 nginx:latest "/docker-entrypoint.…" web 2 minutes ago running 0.0.0.0:80->80/tcp, :::80->80/tcp
你也可以使用 curl 命令访问 80 端口的 localhost 来验证 Nginx 网络服务器是否可访问。
curl localhost:80
你应该会看到默认的 Nginx 欢迎页面 HTML 输出,这表明网络服务器正在运行且可访问。
暂停运行中的服务
在本步骤中,我们将暂停正在运行的 web 服务容器。暂停容器会挂起容器内的所有进程,这与停止容器不同(后者会终止容器进程)。当容器被暂停时,其状态会被冻结,仅消耗极少的 CPU 资源。
请确保你位于 ~/project/my-docker-app 目录下。
cd ~/project/my-docker-app
要暂停 web 服务,请使用 docker-compose pause 命令后接服务名称。
docker-compose pause web
你将看到服务正在被暂停的输出提示:
[+] Paused 1/1
⠿ Container my-docker-app-web-1 Paused
现在,让我们使用 docker-compose ps 验证服务状态。
docker-compose ps
输出应显示 web 服务容器的状态为 paused(已暂停):
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
my-docker-app-web-1 nginx:latest "/docker-entrypoint.…" web 5 minutes ago paused 0.0.0.0:80->80/tcp, :::80->80/tcp
当容器被暂停时,它应该无法响应请求。让我们再次使用 curl 尝试访问 Nginx 网络服务器。
curl localhost:80
该命令可能会挂起或返回错误,表明由于服务被暂停而无法响应。这证实了容器进程已被挂起。
验证服务已暂停
在本步骤中,我们将明确验证 web 服务容器是否处于暂停状态。虽然上一步已使用 docker-compose ps 检查过状态,但直接使用 Docker 命令再次确认也是良好的实践。
首先,请确保你位于 ~/project/my-docker-app 目录下。
cd ~/project/my-docker-app
我们可以使用 docker ps 命令列出所有运行中(包括暂停状态)的容器。我们将过滤输出结果来查找 web 服务容器并检查其状态。
docker ps --filter "name=my-docker-app-web-1"
该命令的输出应在 STATUS 列显示 Paused(已暂停)。
或者,你可以使用 docker inspect 命令获取容器的详细信息,包括其状态。我们将使用 grep 专门查找输出中的 "Paused" 状态。
docker inspect my-docker-app-web-1 | grep Paused
该命令应输出类似 "Paused": true, 的行,确认容器确实处于暂停状态。
如前一步骤所示,尝试通过 curl 访问服务应该会失败或挂起,这进一步表明容器没有在处理请求。
curl localhost:80
该命令不应返回 Nginx 欢迎页面。
恢复暂停的服务
在本步骤中,我们将恢复之前暂停的 web 服务容器。恢复容器会重新启动容器暂停时被挂起的所有进程。
请确保你位于 ~/project/my-docker-app 目录下。
cd ~/project/my-docker-app
要恢复 web 服务,请使用 docker-compose unpause 命令后接服务名称。
docker-compose unpause web
你将看到服务正在被恢复的输出提示:
[+] Unpaused 1/1
⠿ Container my-docker-app-web-1 Unpaused
现在,让我们再次使用 docker-compose ps 验证服务状态。
docker-compose ps
输出现在应显示 web 服务容器的状态为 running(运行中):
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
my-docker-app-web-1 nginx:latest "/docker-entrypoint.…" web 8 minutes ago running 0.0.0.0:80->80/tcp, :::80->80/tcp
由于容器现已恢复运行,它应该能够再次响应请求。让我们使用 curl 尝试访问 Nginx 网络服务器。
curl localhost:80
你现在应该能看到默认的 Nginx 欢迎页面 HTML 输出,确认服务已恢复运行并可访问。
最后,要清理本实验过程中创建的资源,你可以使用 docker-compose down 命令停止并移除 docker-compose.yml 文件中定义的容器、网络和卷。
docker-compose down
该命令将停止运行中的容器,并移除容器、网络和卷。
总结
在本实验中,我们学习了如何使用 docker compose pause 命令来管理 docker-compose.yml 文件中定义的服务状态。我们首先安装了 Docker Compose,并创建了一个简单的 docker-compose.yml 文件,其中定义了使用 Nginx 镜像的 web 服务。
完成设置后,我们使用 docker compose up -d 启动了服务,用 docker compose pause web 暂停了运行中的服务,验证了其暂停状态,最后使用 docker compose unpause web 恢复了服务。这个实践过程展示了 pause 和 unpause 命令在临时挂起和恢复 Docker Compose 服务时的实际应用。



