简介
在这个实验中,你将学习如何使用 docker service update
命令有效地管理和修改 Docker 服务。你将从创建一个简单的服务开始,然后探索如何通过更新副本数量来扩展它。
此外,你将学习如何对服务进行滚动重启、添加或删除发布的端口,以及了解如何将服务回滚到上一个版本,这些都是在 Docker Swarm 环境中管理容器化应用程序生命周期的必备技能。
在这个实验中,你将学习如何使用 docker service update
命令有效地管理和修改 Docker 服务。你将从创建一个简单的服务开始,然后探索如何通过更新副本数量来扩展它。
此外,你将学习如何对服务进行滚动重启、添加或删除发布的端口,以及了解如何将服务回滚到上一个版本,这些都是在 Docker Swarm 环境中管理容器化应用程序生命周期的必备技能。
在这一步中,你将学习如何创建一个简单的 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: 8080
,TargetPort: 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 服务生命周期和配置的实践经验。