如何使用 docker service rollback 命令回滚服务更新

DockerDockerBeginner
立即练习

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

简介

在这个实验中,你将学习如何在 Docker Swarm 环境中有效管理服务更新。我们将从创建一个 Docker Swarm 服务开始,该服务是部署和扩展容器化应用程序的基础。

创建服务后,你将对服务配置进行更新,模拟典型的部署场景。本实验的核心重点是演示如何使用 docker service rollback 命令将服务恢复到之前的稳定版本。最后,你将在回滚后验证服务的配置,以确认恢复成功。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ContainerOperationsGroup -.-> docker/create("Create Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/ls -.-> lab-555230{{"如何使用 docker service rollback 命令回滚服务更新"}} docker/ps -.-> lab-555230{{"如何使用 docker service rollback 命令回滚服务更新"}} docker/inspect -.-> lab-555230{{"如何使用 docker service rollback 命令回滚服务更新"}} docker/create -.-> lab-555230{{"如何使用 docker service rollback 命令回滚服务更新"}} docker/pull -.-> lab-555230{{"如何使用 docker service rollback 命令回滚服务更新"}} end

创建 Docker Swarm 服务

在这一步中,我们将学习如何创建一个 Docker Swarm 服务。Docker Swarm 服务是一组运行在 Swarm 集群上的任务。每个任务都是一个容器实例。服务是 Docker Swarm 的核心概念,它允许你定义应该运行多少个容器镜像副本以及如何更新它们。

在创建服务之前,我们需要初始化一个 Docker Swarm。由于我们在单个虚拟机上运行,因此将初始化一个单节点 Swarm。

首先,让我们初始化 Swarm:

docker swarm init --advertise-addr 127.0.0.1

你应该会看到输出信息,表明 Swarm 已初始化,并且当前节点现在是一个管理器。

现在,让我们使用 nginx 镜像创建一个服务。我们将该服务命名为 my-nginx,并指定要运行 3 个 nginx 容器副本。

首先,拉取 nginx 镜像以确保它在本地可用:

docker pull nginx:latest

现在,创建服务:

docker service create --name my-nginx --replicas 3 nginx:latest

此命令使用 nginx:latest 镜像创建一个名为 my-nginx 的新服务,包含 3 个副本。Docker Swarm 将自动在 Swarm 中的节点间分布这些副本(在这种情况下,只有我们的单个节点)。

要验证服务是否已创建且副本正在运行,你可以列出服务:

docker service ls

你应该会看到 my-nginx 被列出,且有 3/3 个副本正在运行。

你还可以检查与该服务关联的任务:

docker service ps my-nginx

此命令将显示组成 my-nginx 服务的各个任务(容器)、它们的当前状态以及运行它们的节点。你应该会看到 3 个任务处于 Running 状态。

将服务更新到新配置

在这一步中,我们将更新 my-nginx 服务,使其使用 nginx 镜像的不同版本。这展示了如何在 Docker Swarm 中对服务进行滚动更新。

首先,让我们拉取 nginx:1.21 镜像。这是我们要将服务更新到的特定版本的 Nginx。

docker pull nginx:1.21

现在,我们将更新 my-nginx 服务,使其使用 nginx:1.21 镜像。我们还将把副本数量更改为 5。

docker service update --image nginx:1.21 --replicas 5 my-nginx

此命令告知 Docker Swarm 更新 my-nginx 服务。--image nginx:1.21 标志指定要使用的新镜像,--replicas 5 标志将所需的副本数量更改为 5。Docker Swarm 将执行滚动更新,用运行指定镜像的新容器替换旧容器,并调整副本数量。

你可以通过列出服务任务来监控更新进度:

docker service ps my-nginx

你将看到使用 nginx:1.21 镜像的新任务正在创建,而旧任务正在关闭。最终,你应该会看到 5 个任务处于 Running 状态,所有任务都使用 nginx:1.21 镜像。

你还可以检查服务详细信息以确认更新:

docker service inspect my-nginx --pretty

查看输出中的 ImageReplicas 字段,以确认它们分别已更新为 nginx:1.21 和 5。

将服务回滚到上一个版本

在这一步中,我们将把 my-nginx 服务回滚到它之前的配置。Docker Swarm 会记录之前的服务配置,这样如果更新引入了问题,你可以轻松恢复到已知的正常状态。

要回滚服务,我们使用带有 --rollback 标志的 docker service update 命令。

docker service update --rollback my-nginx

这个命令指示 Docker Swarm 将 my-nginx 服务回滚到上一次更新之前的配置。在我们的例子中,这意味着恢复到 nginx:latest 镜像和原来的副本数量(即 3 个)。

你可以通过列出服务任务来监控回滚过程:

docker service ps my-nginx

你会看到运行 nginx:1.21 镜像的任务被关闭,而运行 nginx:latest 镜像的新任务被创建。任务数量也会调整回之前的副本数量。

回滚完成后,你应该会看到运行 nginx:latest 镜像的任务,并且副本数量应该回到 3 个。

你还可以检查服务详细信息来确认回滚操作:

docker service inspect my-nginx --pretty

查看输出中的 ImageReplicas 字段。它们现在应该反映出上一次更新之前的配置。

回滚后验证服务配置

在这一步中,我们将明确验证 my-nginx 服务是否已成功回滚到其之前的配置。这包括检查服务所使用的镜像以及副本数量。

首先,让我们列出服务以查看当前状态:

docker service ls

你应该会看到 my-nginx 被列出,并且 REPLICAS 列应显示 3/3。这表明期望的副本数为 3,且当前有 3 个副本正在运行。

接下来,让我们检查服务详细信息以确认镜像和副本数量。

docker service inspect my-nginx --pretty

在输出中,查找 Image 字段。它现在应该是 nginx:latest。此外,查找 Replicas 字段,它应该是 3

最后,让我们查看与该服务关联的任务,以确认正在运行的容器使用的是正确的镜像。

docker service ps my-nginx

你应该会看到列出了 3 个任务,并且每个任务的 IMAGE 列应该是 nginx:latest。所有任务的 CURRENT STATE 应该是 Running

通过执行这些检查,我们可以确信回滚操作已成功,并且服务正在以期望的先前状态运行。

总结

在本次实验中,我们学习了如何管理 Docker Swarm 服务,特别关注了服务的创建和更新。我们首先初始化了一个单节点的 Docker Swarm,然后使用 nginx:latest 镜像创建了一个名为 my-nginx 的服务,该服务有三个副本。我们使用 docker service lsdocker service ps 验证了服务的创建和正在运行的任务。

在创建服务之后,我们探索了如何更新服务配置。这包括更改服务所使用的镜像,展示了在 Swarm 环境中进行服务更新的常见场景。