如何使用 docker compose restart 命令管理服务

DockerDockerBeginner
立即练习

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

简介

在本实验中,你将学习如何使用 docker compose restart 命令有效管理 Docker 服务的生命周期。我们将首先使用 Docker Compose 搭建一个简单的多服务应用,包含一个 web 服务和一个数据库服务。

完成搭建后,你将探索 docker compose restart 命令的多种使用方式。这包括重启应用内的所有服务、针对性地重启特定服务、在不影响依赖项的情况下重启服务,以及最后为服务设置超时时间进行重启。通过这些实践练习,你将获得控制和维护 Docker 化应用的实际操作经验。


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/restart("Restart Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/run -.-> lab-555089{{"如何使用 docker compose restart 命令管理服务"}} docker/ps -.-> lab-555089{{"如何使用 docker compose restart 命令管理服务"}} docker/restart -.-> lab-555089{{"如何使用 docker compose restart 命令管理服务"}} docker/pull -.-> lab-555089{{"如何使用 docker compose restart 命令管理服务"}} end

准备一个简单的多服务应用

在这一步中,我们将准备一个简单的多服务应用,用于在本实验中练习 Docker 服务的重启操作。该应用包含两个服务:web 服务和数据库服务。我们将使用 Docker Compose 文件来定义这些服务。

首先需要安装 Docker Compose。由于 LabEx VM 环境中未预装该工具,我们需要下载并安装它。

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

第一条命令从 GitHub 官方仓库下载 Docker Compose 二进制文件并保存到 /usr/local/bin/docker-compose。其中 $(uname -s)$(uname -m) 会自动检测你的操作系统和架构以下载正确的二进制文件。第二条命令使下载的文件可执行。

现在通过检查 Docker Compose 版本来验证安装:

docker-compose --version

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

接下来进入 ~/project 目录,这是本实验的工作目录:

cd ~/project

现在我们将创建 docker-compose.yml 文件来定义多服务应用。该文件将指定服务、它们的镜像以及必要的配置。

nano docker-compose.yml

将以下内容粘贴到 docker-compose.yml 文件中:

version: "3.8"

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    depends_on:
      - db

  db:
    image: postgres:latest
    environment:
      POSTGRES_PASSWORD: mysecretpassword

在这个 docker-compose.yml 文件中:

  • version: '3.8' 指定了 Docker Compose 文件格式版本
  • services: 定义了我们应用中的不同服务
  • web 服务使用 nginx:latest 镜像,将主机的 80 端口映射到容器的 80 端口,并依赖于 db 服务。这意味着 db 服务会先于 web 服务启动
  • db 服务使用 postgres:latest 镜像,并设置了 PostgreSQL 镜像必需的 POSTGRES_PASSWORD 环境变量

保存文件并退出 nano 编辑器(按 Ctrl + X,然后 Y,最后 Enter)。

在启动服务前,我们需要拉取必要的 Docker 镜像:

docker pull nginx:latest
docker pull postgres:latest

这些命令会从 Docker Hub 下载 nginx:latestpostgres:latest 镜像。

最后,启动 docker-compose.yml 文件中定义的服务:

docker-compose up -d

docker-compose up -d 命令会在后台(分离模式)构建、创建并启动服务。

你可以使用以下命令检查运行中服务的状态:

docker-compose ps

你应该能看到显示 webdb 服务都在运行的输出。

重启所有服务

在这一步中,我们将学习如何重启 docker-compose.yml 文件中定义的所有服务。当你修改了应用代码、配置或 Docker Compose 文件本身时,重启服务是一个常见操作。

要重启所有服务,我们使用 docker-compose restart 命令。该命令会停止 docker-compose.yml 文件中定义的所有正在运行的容器,然后重新启动它们。

确保你位于包含 docker-compose.yml 文件的 ~/project 目录中:

cd ~/project

现在执行以下命令来重启所有服务:

docker-compose restart

你将看到显示服务正在停止然后启动的输出。

命令执行完成后,可以使用 docker-compose ps 命令验证服务是否已重启并重新运行:

docker-compose ps

输出应显示 webdb 服务都处于 Up 状态,表明它们已成功重启。

当需要应用影响应用多个部分的更改时,或者想要确保整个应用栈干净重启时,重启所有服务非常有用。

重启特定服务

在这一步中,我们将学习如何仅重启多服务应用中的特定服务。当你只修改了单个服务且不需要重启整个应用栈时,这个操作非常有用。

要重启特定服务,你可以使用 docker-compose restart 命令后接要重启的服务名称。服务名称定义在你的 docker-compose.yml 文件中(在我们的例子中是 webdb)。

确保你位于 ~/project 目录下:

cd ~/project

让我们重启 web 服务:

docker-compose restart web

你将看到显示 web 服务正在停止然后启动的输出。db 服务会保持运行状态。

命令执行完成后,使用 docker-compose ps 验证服务状态:

docker-compose ps

输出应显示 webdb 服务都仍处于 Up 状态。不过 web 服务实际上已经经历了停止和重新启动的过程。

现在让我们重启 db 服务:

docker-compose restart db

你将看到显示 db 服务正在停止然后启动的输出。注意由于 web 服务依赖于 db 服务,Docker Compose 可能也会短暂停止并重启 web 服务以确保在 db 重启期间满足依赖关系。

再次验证服务状态:

docker-compose ps

两个服务都应处于 Up 状态。重启单个服务可以让你对应用的生命周期进行更精细的控制。

独立重启服务(不重启其依赖项)

在上一步中,我们看到由于 docker-compose.yml 中定义的 depends_on 关系,重启 db 服务会导致 web 服务也被短暂重启。在某些情况下,你可能希望在不影响其依赖项的情况下重启某个服务。

要独立重启服务(不重启其依赖项),可以使用带 --no-deps 标志的 docker-compose restart 命令。

确保你位于 ~/project 目录下:

cd ~/project

让我们再次尝试重启 db 服务,这次使用 --no-deps 标志:

docker-compose restart --no-deps db

观察输出结果。你应该会看到只有 db 服务被停止并重新启动,而依赖它的 web 服务不受影响。

使用 docker-compose ps 验证服务状态:

docker-compose ps

两个服务应该都仍处于 Up 状态。这演示了如何独立重启服务,这在调试或需要对单个服务应用更改而不影响其依赖项时非常有用。

设置超时时间重启服务

在这最后一步中,我们将学习如何为重启操作指定超时时间。当你重启服务时,Docker Compose 会向容器发送停止信号并等待其优雅关闭。如果容器未能在指定时间内停止,Docker 会强制关闭。你可以使用 --timeout 标志来控制这个等待时间。

容器停止的默认超时时间为 10 秒。让我们尝试用更短的 3 秒超时时间来重启 web 服务。

确保你位于 ~/project 目录下:

cd ~/project

现在执行以下命令,以 3 秒超时重启 web 服务:

docker-compose restart --timeout 3 web

你将看到显示 web 服务正在停止然后启动的输出。Docker Compose 会最多等待 3 秒让容器优雅停止,之后将强制关闭。

命令执行完成后,使用 docker-compose ps 验证服务状态:

docker-compose ps

两个服务应该都仍处于 Up 状态。

使用 --timeout 标志可以让你控制 Docker Compose 在重启期间等待服务停止的时间。这对于需要不同时间来完成优雅关闭的服务非常有用。

最后,让我们通过停止并移除服务来清理运行环境:

docker-compose down

docker-compose down 命令会停止并移除由 docker-compose up 创建的容器、网络和卷。

总结

在本实验中,我们学习了如何使用 Docker Compose 准备一个简单的多服务应用。内容包括安装 Docker Compose、验证安装情况,以及创建 docker-compose.yml 文件来定义两个服务:web 服务(nginx)和数据库服务(postgres),其中 web 服务依赖于数据库服务。

随后我们探索了使用 docker compose restart 命令管理这些服务的多种方式。我们学习了如何重启 docker-compose.yml 文件中定义的所有服务、重启特定服务、独立重启服务(不重启其依赖项),以及设置超时时间重启服务。这些步骤展示了 Docker Compose 在管理多容器应用生命周期方面提供的灵活性和控制力。