如何使用 docker stack deploy 命令管理 Swarm 服务

DockerDockerBeginner
立即练习

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

简介

在这个实验中,你将学习如何使用 docker stack deploy 命令有效地管理 Docker Swarm 服务。我们将从准备一个简单的 docker-compose.yml 文件开始,该文件将作为我们应用程序栈的蓝图。

准备工作完成后,你将把这个栈部署到你的 Docker Swarm 中,验证所定义的服务是否成功部署,然后探索如何通过修改 Compose 文件来更新栈。最后,你将学习如何清理在更新后的配置中不再引用的服务,以确保你的 Swarm 保持整洁和高效。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/SystemManagementGroup -.-> docker/system("Manage Docker") subgraph Lab Skills docker/ls -.-> lab-555234{{"如何使用 docker stack deploy 命令管理 Swarm 服务"}} docker/ps -.-> lab-555234{{"如何使用 docker stack deploy 命令管理 Swarm 服务"}} docker/rm -.-> lab-555234{{"如何使用 docker stack deploy 命令管理 Swarm 服务"}} docker/inspect -.-> lab-555234{{"如何使用 docker stack deploy 命令管理 Swarm 服务"}} docker/pull -.-> lab-555234{{"如何使用 docker stack deploy 命令管理 Swarm 服务"}} docker/system -.-> lab-555234{{"如何使用 docker stack deploy 命令管理 Swarm 服务"}} end

为 Swarm 部署准备一个简单的 Docker Compose 文件

在这一步中,我们将准备一个简单的 docker-compose.yml 文件,用于将一个栈部署到 Docker Swarm 中。在使用 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

这个命令从官方 GitHub 发布页面下载 docker-compose 二进制文件,并将其保存到 /usr/local/bin/docker-compose$(uname -s)$(uname -m) 部分会自动检测你的操作系统和架构。chmod +x 命令使下载的文件可执行。

现在,让我们通过检查版本来验证安装情况。

docker-compose --version

你应该会在控制台看到已安装的 docker-compose 版本。

接下来,我们将在 ~/project 目录下创建一个简单的 docker-compose.yml 文件。这个文件将使用 nginx 镜像定义一个服务。

nano ~/project/docker-compose.yml

将以下内容粘贴到 nano 编辑器中:

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"

让我们来详细分析一下这个 docker-compose.yml 文件:

  • version: '3.8' 指定了 Compose 文件的格式版本。版本 3.8 适用于 Swarm 部署。
  • services: 定义了构成你应用程序的服务。
  • web: 是我们服务的名称。你可以选择任何你喜欢的名称。
  • image: nginx:latest 指定了用于此服务的 Docker 镜像。我们使用的是官方 nginx 镜像的最新版本。
  • ports: 映射主机和容器之间的端口。"80:80" 将主机上的 80 端口映射到容器内的 80 端口。

Ctrl + X,然后按 Y,再按 Enter 保存文件。

在部署这个服务之前,我们需要确保本地有 nginx:latest 镜像。我们可以使用 docker pull 命令拉取该镜像。

docker pull nginx:latest

这个命令会从 Docker Hub 将 nginx:latest 镜像下载到你的本地机器。

现在,你已经有了一个简单的 docker-compose.yml 文件,并且所需的镜像也已拉取完毕,可以进行部署了。

使用 Compose 文件将栈部署到 Swarm

在这一步中,我们将把 docker-compose.yml 文件中定义的栈部署到 Docker Swarm。在部署栈之前,我们需要先初始化一个 Docker Swarm。

首先,让我们初始化 Swarm。由于我们使用的是单台虚拟机,我们将把它初始化为单节点 Swarm。

docker swarm init

这个命令会初始化一个新的 Swarm,并将当前节点设为管理节点。你应该会看到表明 Swarm 已初始化的输出信息。

现在 Swarm 已经初始化完成,我们可以使用 docker stack deploy 命令来部署我们的栈。我们将为栈命名,例如 mywebstack

docker stack deploy -c ~/project/docker-compose.yml mywebstack

让我们来详细分析一下这个命令:

  • docker stack deploy 是用于将栈部署到 Swarm 的命令。
  • -c ~/project/docker-compose.yml 指定了用于部署的 Compose 文件。我们使用的是上一步中创建的文件。
  • mywebstack 是我们为栈取的名称。这个名称将用于在 Swarm 中识别属于该栈的服务和容器。

运行此命令后,Docker Swarm 将创建 docker-compose.yml 文件中定义的服务。你应该会看到表明服务正在创建或更新的输出信息。

为了验证栈是否已成功部署,我们可以列出正在运行的栈。

docker stack ls

这个命令会显示你的 Swarm 中所有已部署的栈的列表。你应该会看到 mywebstack 被列在其中。

我们还可以列出栈中正在运行的服务。

docker stack services mywebstack

这个命令会显示与 mywebstack 栈关联的服务。你应该会看到 mywebstack_web 服务被列出,以及有关其副本和镜像的信息。

最后,让我们检查服务任务的状态。

docker service ps mywebstack_web

这个命令会显示 mywebstack_web 服务的任务(正在运行的容器)。你应该会看到至少有一个任务的状态为 Running

现在你已经成功初始化了 Docker Swarm,并使用 docker-compose.yml 文件部署了一个栈。

验证已部署的服务

在这一步中,我们将验证上一步部署的服务是否正常运行且可访问。我们部署了一个 Nginx Web 服务器,它应该监听 80 端口。

首先,让我们使用 docker service ls 命令查看 Swarm 中正在运行的服务列表。

docker service ls

你应该会看到 mywebstack_web 服务被列出,其副本数为 1/1,这表明该服务的一个实例正在运行。

接下来,我们可以使用 curl 来访问容器内运行的 Nginx Web 服务器。由于我们将主机上的 80 端口映射到了容器内的 80 端口,因此可以通过 localhost 的 80 端口来访问它。

curl localhost:80

这个命令会向 localhost 的 80 端口发送一个 HTTP 请求。如果 Nginx 服务器正常运行,你应该会收到默认的 Nginx 欢迎页面的 HTML 作为输出。这就确认了该服务正在运行,并且可以从主机访问。

为了进一步检查 web 服务的运行容器,我们可以使用 docker ps 命令。

docker ps

这个命令会列出所有正在运行的容器。你应该会看到一个运行 nginx 镜像的容器,其名称类似于 mywebstack_web.1.<task_id>PORTS 列应该显示 0.0.0.0:80->80/tcp,这确认了端口映射。

我们还可以使用 docker service inspect 命令来检查服务的详细信息。

docker service inspect mywebstack_web

这个命令会提供关于 mywebstack_web 服务的详细信息,包括其配置、任务和网络设置。你可以滚动查看输出,了解该服务的各种详细信息。

通过执行这些检查,我们验证了已部署的 Nginx 服务按预期运行且可访问。

使用修改后的 Compose 文件更新栈

在这一步中,我们将修改 docker-compose.yml 文件以更新已部署的栈。我们会更改 Nginx 镜像版本并添加第二个服务。

首先,让我们编辑 docker-compose.yml 文件。

nano ~/project/docker-compose.yml

修改文件以包含第二个服务,例如 alpine 服务,并将 Nginx 镜像版本更改为 1.21.6。更新后的文件应如下所示:

version: "3.8"
services:
  web:
    image: nginx:1.21.6
    ports:
      - "80:80"
  alpine:
    image: alpine:latest
    command: ["sleep", "infinity"]

让我们看看这些更改:

  • 我们将 web 服务的 imagenginx:latest 更改为 nginx:1.21.6
  • 我们添加了一个名为 alpine 的新服务。
  • alpine 服务使用 alpine:latest 镜像。
  • command: ["sleep", "infinity"] 使 alpine 容器无限期运行。

Ctrl + X,然后按 Y,再按 Enter 保存修改后的文件。

在部署更新后的栈之前,我们需要拉取新的 nginx:1.21.6alpine:latest 镜像。

docker pull nginx:1.21.6
docker pull alpine:latest

现在,我们可以使用相同的 docker stack deploy 命令和相同的栈名称来部署更新后的栈。Docker Swarm 会检测 docker-compose.yml 文件中的更改并更新现有的栈。

docker stack deploy -c ~/project/docker-compose.yml mywebstack

Docker Swarm 将对 web 服务执行滚动更新,用使用 nginx:1.21.6 的新容器替换旧的 nginx:latest 容器。它还将创建新的 alpine 服务及其对应的容器。你应该会看到表明服务正在更新或创建的输出信息。

为了验证更新情况,让我们再次列出栈中的服务。

docker stack services mywebstack

现在你应该会看到 mywebstack_webmywebstack_alpine 服务都被列出。mywebstack_web 服务应显示更新后的镜像 nginx:1.21.6

你已通过修改 docker-compose.yml 文件并重新部署,成功更新了已部署的栈。

清理 Compose 文件中不再引用的服务

在这一步中,我们将再次修改 docker-compose.yml 文件,这次是移除一个服务。当我们重新部署栈时,Docker Swarm 会检测到 Compose 文件中不再定义某个服务,并将其移除。这个过程有时被称为“清理”服务。

首先,让我们编辑 docker-compose.yml 文件以移除 alpine 服务。

nano ~/project/docker-compose.yml

从文件中移除整个 alpine: 部分。文件应恢复到其原始状态,仅定义 web 服务:

version: "3.8"
services:
  web:
    image: nginx:1.21.6
    ports:
      - "80:80"

Ctrl + X,然后按 Y,再按 Enter 保存修改后的文件。

现在,使用修改后的 docker-compose.yml 文件再次部署栈。

docker stack deploy -c ~/project/docker-compose.yml mywebstack

Docker Swarm 会将 mywebstack 栈的当前状态与更新后的 docker-compose.yml 文件中的定义进行比较。它会注意到文件中不再存在 alpine 服务,并将从 Swarm 中移除相应的服务及其任务。你应该会看到表明 alpine 服务正在被移除的输出信息。

为了验证 alpine 服务已被移除,再次列出栈中的服务。

docker stack services mywebstack

现在你应该只会看到 mywebstack_web 服务被列出。mywebstack_alpine 服务应该已不存在。

最后,为了清理 Swarm 环境,我们可以移除整个栈。

docker stack rm mywebstack

这个命令会移除 mywebstack 栈,包括其所有服务和任务。你应该会看到确认移除的输出信息。

为了验证栈已被移除,再次列出栈。

docker stack ls

mywebstack 应该不再被列出。

你已通过从 docker-compose.yml 文件中移除一个服务并重新部署,成功清理了栈中的一个服务,然后通过移除整个栈清理了环境。

总结

在本次实验中,我们学习了如何使用 docker stack deploy 命令来管理 Docker Swarm 服务。首先,我们准备了一个简单的 docker-compose.yml 文件,这是为 Docker 定义多服务应用程序的标准方式。这包括安装 docker-compose 并创建一个基本的 YAML 文件,该文件定义了一个带有端口映射的单个 Nginx 服务。

准备工作完成后,我们使用 docker stack deploy 将这个栈部署到 Docker Swarm 中,验证了服务的成功部署,然后通过修改 docker-compose.yml 文件并重新部署来练习更新栈。最后,我们学习了如何清理更新后的 Compose 文件中不再定义的服务,以确保我们的 Swarm 环境保持整洁,并反映当前的应用程序定义。