如何使用 docker compose pause 命令暂停服务

DockerDockerBeginner
立即练习

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

简介

在本实验中,你将学习如何使用 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 服务生命周期的实践经验。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/run -.-> lab-555084{{"如何使用 docker compose pause 命令暂停服务"}} docker/ps -.-> lab-555084{{"如何使用 docker compose pause 命令暂停服务"}} docker/inspect -.-> lab-555084{{"如何使用 docker compose pause 命令暂停服务"}} docker/pull -.-> lab-555084{{"如何使用 docker compose pause 命令暂停服务"}} end

创建一个简单的 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 恢复了服务。这个实践过程展示了 pauseunpause 命令在临时挂起和恢复 Docker Compose 服务时的实际应用。