简介
在这个实验中,你将学习如何使用 docker stack deploy
命令有效地管理 Docker Swarm 服务。我们将从准备一个简单的 docker-compose.yml
文件开始,该文件将作为我们应用程序栈的蓝图。
准备工作完成后,你将把这个栈部署到你的 Docker Swarm 中,验证所定义的服务是否成功部署,然后探索如何通过修改 Compose 文件来更新栈。最后,你将学习如何清理在更新后的配置中不再引用的服务,以确保你的 Swarm 保持整洁和高效。
在这个实验中,你将学习如何使用 docker stack deploy
命令有效地管理 Docker Swarm 服务。我们将从准备一个简单的 docker-compose.yml
文件开始,该文件将作为我们应用程序栈的蓝图。
准备工作完成后,你将把这个栈部署到你的 Docker Swarm 中,验证所定义的服务是否成功部署,然后探索如何通过修改 Compose 文件来更新栈。最后,你将学习如何清理在更新后的配置中不再引用的服务,以确保你的 Swarm 保持整洁和高效。
在这一步中,我们将准备一个简单的 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
文件,并且所需的镜像也已拉取完毕,可以进行部署了。
在这一步中,我们将把 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 服务按预期运行且可访问。
在这一步中,我们将修改 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
服务的 image
从 nginx:latest
更改为 nginx:1.21.6
。alpine
的新服务。alpine
服务使用 alpine:latest
镜像。command: ["sleep", "infinity"]
使 alpine
容器无限期运行。按 Ctrl + X
,然后按 Y
,再按 Enter
保存修改后的文件。
在部署更新后的栈之前,我们需要拉取新的 nginx:1.21.6
和 alpine: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_web
和 mywebstack_alpine
服务都被列出。mywebstack_web
服务应显示更新后的镜像 nginx:1.21.6
。
你已通过修改 docker-compose.yml
文件并重新部署,成功更新了已部署的栈。
在这一步中,我们将再次修改 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 环境保持整洁,并反映当前的应用程序定义。