如何使用 docker service update 命令修改服务

DockerDockerBeginner
立即练习

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

简介

在这个实验中,你将学习如何使用 docker service update 命令有效地管理和修改 Docker 服务。你将从创建一个简单的服务开始,然后探索如何通过更新副本数量来扩展它。

此外,你将学习如何对服务进行滚动重启、添加或删除发布的端口,以及了解如何将服务回滚到上一个版本,这些都是在 Docker Swarm 环境中管理容器化应用程序生命周期的必备技能。


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/restart("Restart Container") 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-555232{{"如何使用 docker service update 命令修改服务"}} docker/ps -.-> lab-555232{{"如何使用 docker service update 命令修改服务"}} docker/restart -.-> lab-555232{{"如何使用 docker service update 命令修改服务"}} docker/inspect -.-> lab-555232{{"如何使用 docker service update 命令修改服务"}} docker/create -.-> lab-555232{{"如何使用 docker service update 命令修改服务"}} docker/pull -.-> lab-555232{{"如何使用 docker service update 命令修改服务"}} end

创建一个简单的服务

在这一步中,你将学习如何创建一个简单的 Docker 服务。服务是一组使用相同镜像的容器。服务对于扩展你的应用程序和确保高可用性非常有用。

首先,让我们从 Docker Hub 拉取 alpine 镜像。这个镜像非常小,适合用于测试。

docker pull alpine

你应该会看到表明镜像正在被拉取和下载的输出。

现在,让我们使用 alpine 镜像创建一个名为 my-service 的服务。我们将在容器内运行一个简单的命令,该命令会打印 "Hello, LabEx!" 然后退出。

docker service create --name my-service alpine echo "Hello, LabEx!"

这个命令会创建一个新的服务。--name my-service 标志为服务指定了一个名称。alpine 是要使用的镜像,echo "Hello, LabEx!" 是要在容器内运行的命令。

你应该会看到类似下面的输出,显示服务 ID:

<service_id>

要验证服务是否成功创建,你可以列出所有服务:

docker service ls

你应该会在输出中看到 my-service

更新服务副本数量

在这一步中,你将学习如何通过更新副本数量来扩展 Docker 服务。副本是服务容器的相同副本。增加副本数量可以让你的服务处理更多负载,并提供更高的可用性。

目前,我们的 my-service 只有一个副本。你可以在 docker service ls 输出的“REPLICAS”列中看到这一点。

让我们将该服务扩展到 3 个副本。我们可以使用 docker service update 命令和 --replicas 标志来实现这一点。

docker service update --replicas 3 my-service

这个命令告诉 Docker Swarm 将 my-service 更新为拥有 3 个副本。Docker Swarm 会自动创建达到所需副本数量所需的额外容器。

你应该会看到表明服务已更新的输出。

要验证服务是否已扩展,请再次列出服务:

docker service ls

查看 my-service 的“REPLICAS”列。现在应该显示 3/3,表示期望有 3 个副本,并且当前有 3 个正在运行。

你还可以检查与该服务关联的任务,以查看各个容器:

docker service ps my-service

这个命令将显示服务的每个副本(任务)的状态。你应该会看到列出了三个任务,状态可能为“Running”。

对服务执行滚动重启

在这一步中,你将学习如何对 Docker 服务执行滚动重启。滚动重启会逐个更新服务的任务,确保服务在更新过程中保持可用。这对于维持应用程序的正常运行时间至关重要。

要触发滚动重启,我们可以使用带有 --force 标志的 docker service update 命令。这个标志会强制进行一次新的更新,即使服务配置没有改变。

docker service update --force my-service

这个命令将启动 my-service 的滚动重启。Docker Swarm 会按顺序停止并启动服务的每个副本。

你应该会看到表明服务已更新的输出。

要观察滚动重启的进行情况,你可以持续监控服务任务:

docker service ps my-service

多次运行这个命令。你会看到随着每个副本的重启,任务的“CURRENT STATE”会从“Running”变为“Shutdown”,然后再变回“Running”。这个过程一次只对一个副本进行,体现了重启的滚动特性。

一旦所有任务都重启完毕,docker service ps my-service 的输出将显示所有任务都处于“Running”状态,并且“UPDATED”列中的时间戳会更新。

添加或移除发布端口

在这一步中,你将学习如何为 Docker 服务添加或移除发布端口。发布端口可使容器内的端口能从 Docker Swarm 集群外部访问。这对于将你的应用程序暴露给用户或其他服务至关重要。

我们当前的 my-service 没有任何发布端口,因为它只是运行一个简单的 echo 命令然后退出。为了演示发布端口,让我们创建一个运行简单 Web 服务器的新服务。我们将使用 nginx 镜像来实现。

首先,拉取 nginx 镜像:

docker pull nginx

现在,让我们创建一个名为 web-service 的新服务,并将容器的 80 端口发布到主机的 8080 端口。

docker service create --name web-service --publish 8080:80 nginx

这个命令使用 nginx 镜像创建了一个名为 web-service 的服务。--publish 8080:80 标志将容器内的 80 端口映射到主机的 8080 端口。

你应该会看到显示服务 ID 的输出。

要验证端口是否已发布,你可以检查该服务:

docker service inspect web-service

在输出中查找 EndpointSpec 部分。你应该会在 Ports 下看到一个条目,显示发布的端口映射(例如,PublishedPort: 8080TargetPort: 80)。

现在,让我们从 web-service 中移除发布端口。我们可以使用带有 --publish-rm 标志的 docker service update 命令来完成,指定容器内的目标端口。

docker service update --publish-rm 80 web-service

这个命令移除了容器内 80 端口的端口映射。

你应该会看到表明服务已更新的输出。

要验证端口是否已被移除,请再次检查该服务:

docker service inspect web-service

EndpointSpec 部分应该不再显示你刚刚移除的端口映射。

将服务回滚到上一个版本

在这一步中,你将学习如何将 Docker 服务回滚到上一个版本。当新的服务更新引入问题时,回滚操作至关重要。Docker Swarm 会记录先前的服务配置,使你能够快速恢复到稳定状态。

首先,让我们模拟一个可能需要回滚的更新。我们将更新 web-service 以使用一个不同的、假设的镜像版本(尽管我们实际上不会拉取该镜像,但命令结构对于回滚操作很重要)。

docker service update --image nginx:1.20.0 web-service

此命令尝试将 web-service 更新为使用 nginx:1.20.0 镜像。在实际场景中,这可能是一个存在 bug 的新版本。

现在,假设我们发现此更新存在问题,并希望回滚到上一个版本(即使用默认 nginx 镜像的版本)。我们可以使用 docker service rollback 命令。

docker service rollback web-service

此命令指示 Docker Swarm 将 web-service 恢复到其先前的配置。Docker Swarm 将停止运行新镜像的任务,并启动使用上一个镜像版本的任务。

你应该会看到表明服务正在回滚的输出。

要验证回滚是否成功,你可以再次检查该服务:

docker service inspect web-service

查看输出中的 Image 字段。现在它应该显示原始的 nginx 镜像(没有 :1.20.0 标签,假设你最初拉取的是最新的默认镜像)。

你还可以检查服务任务,以查看运行旧镜像的容器:

docker service ps web-service

这些任务现在应该正在运行原始镜像。

总结

在这个实验中,你学习了如何使用 docker service update 命令管理 Docker 服务。你首先使用 alpine 镜像和基本的 echo 命令创建了一个简单的服务。

随后,你探索了关键的服务更新操作。你通过修改副本数量来扩展服务,执行滚动重启以在不中断服务的情况下更新服务任务,还学习了如何添加或移除发布端口以将服务暴露给外部。最后,你练习了将服务回滚到上一个版本,展示了在更新导致问题时如何撤销更改。这些步骤为你提供了管理 Docker 服务生命周期和配置的实践经验。