如何在 Rocky Linux 上安装 Docker Swarm
在此页
- 先决条件
- 安装 Docker
- 设置防火墙
- 初始化 Swarm Manager
- 将工作节点添加到 Swarm
- 在 Docker Swarm 上管理服务
- 在 Docker Swarm 上扩展服务
- 删除 Docker Swarm 上的服务
- 结论
Docker Swarm 是构建在 Docker Engine 之上的容器编排。它允许您创建和部署具有多个服务器的 Docker 节点集群。 Docker Swarm 将您的容器化应用程序部署简化为一项服务。提供一种简单易用的方法来管理和编排容器。
Docker Swarm 为应用程序提供高级别的可用性。在 Docker Swarm 中,可以在多个节点上运行单个应用程序或服务,这些节点称为“Worker Nodes”。还有一个名为“Swarm Manager”的节点,它是 Docker Swarm 的集中管理和编排。
本教程将向您展示如何使用 Rocky Linux 服务器设置 Docker Swarm。您将在每台服务器上安装 Docker,设置 firewalld,初始化 Swarm Manager,并添加节点,最后,您还将学习 Docker Swarm 部署容器化应用程序的基本用法。
先决条件
要完成本指南,您至少需要三台 Rocky Linux 服务器和一个具有 sudo/管理员权限的非根用户。
对于本次演示,我们将使用三台 Rocky Linux 服务器,其详细信息如下:
Hostname IP Address Used as
---------------------------------------------------
swarm-manager1 192.168.5.100 Swarm Manager
worker1 192.168.5.120 Node
worker2 192.168.5.121 Node
满足所有这些要求后,您就可以开始 Docker Swarm 部署了。
安装 Docker
要设置 Docker Swarm,您必须在每台机器/服务器上安装 Docker Engine。对于 Rocky Linux 发行版,您可以通过官方 Docker 存储库安装 Docker。
现在,您将在每台 Rocky Linux 服务器上安装 Docker Engine。
通过下面的 dnf 命令为 Rocky Linux 系统添加 Docker 存储库。
sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
添加存储库后,运行下面的 dnf 命令来验证存储库列表并更新所有包。
sudo dnf repo list
sudo dnf update
如果添加了 Docker 存储库,您将看到以下输出:

接下来,通过下面的 dnf 命令安装 Docker。当提示确认安装时,输入 y 并按 ENTER 继续。
sudo dnf install docker-ce docker-ce-cli containerd.io

安装 Docker 后,通过下面的 systemctl 命令启动并启用 docker 服务。 docker 服务应该正在运行,并且会在系统启动时自动运行。
sudo systemctl enable docker
sudo systemctl start docker
最后,使用以下命令验证 docker 服务以确保该服务正在运行。
sudo systemctl status docker
如果 docker 服务正在运行,您应该会得到如下所示的输出。

此外,如果您想使用非根用户运行 Docker,则必须通过以下命令将用户添加到 docker 组。
sudo usermod -aG docker user
设置防火墙
对于生产环境,您应该在每台服务器上启用防火墙。在默认的 Rocky Linux 系统上,firewalld 是默认启用的。所以你只需要为 Docker Swarm 部署添加一些 TCP 和 UDP 端口。
以下是您必须在每台服务器上打开的一些 TCP 和 UDP 端口,以部署 Docker Swarm 并使其正常运行:
- 用于集群管理通信的 TCP 端口 2377 - 这是在您有多个 Swarm 管理器的情况下。
- 用于节点间通信的 TCP 和 UDP 端口 7946 - 适用于 Swarm 环境中的所有节点。
- 覆盖网络流量的 UDP 端口 4789
通过下面的 firewall-cmd 命令将 Docker Swarm 端口添加到 firewalld。
sudo firewall-cmd --add-port=2377/tcp --permanent
sudo firewall-cmd --add-port=7946/tcp --permanent
sudo firewall-cmd --add-port=7946/udp --permanent
sudo firewall-cmd --add-port=4789/udp --permanent
接下来,重新加载 firewalld 规则并使用以下命令验证 firewalld 上的端口列表。
sudo firewall-cmd --reload
sudo firewall-cmd --list-port
您应该会看到用于 Docker Swarm 部署的一些 TCP 和 UDP 端口已添加到 firewalld。

在每台服务器上都安装了 Docker 引擎并配置了 Firewalld 后,您现在可以通过将第一个节点初始化为“Swarm 管理器”来设置 Docker Swarm 部署。
初始化 Swarm Manager
Swarm Manager 是 Docker Swarm 环境的大脑。对于大型部署,您可以添加多个服务器作为 Swarm 管理器,从而实现 Swarm 管理器的高可用性和容错性。
Swarm Manager 是 Docker Swarm 的集群管理器,它管理应用程序部署的状态,并且还与 Docker Engine 集成。 Swarm Manager 提供声明式服务模型和服务缩放、所需的服务状态,还提供滚动更新。
在本例中,我们将 IP 地址为“192.168.5.100”的服务器“swarm-manager1”初始化为 Swarm Manager。
在“swarm-manager1”服务器上运行以下命令“docker swarm init”,开始在您的部署中初始化 Swarm Manager。
对于这个例子,Swarm Manager 在 IP 地址“192.168.5.100”上运行,Docker Swarm 上服务的默认网络是“10.10.0.0/16”。
docker swarm init --advertise-addr 192.168.5.100 --default-addr-pool 10.10.0.0/16
现在,当 Swarm Manager 初始化时,您应该会看到类似于以下屏幕截图的输出。此外,您还可以看到将工作节点添加到 Docker Swarm 部署所需的说明,包括必须使用的生成令牌。

接下来,运行以下 docker 命令以验证 Swarm 模式是否已激活并启用。
docker info
你会看到Swarm模式为“active”,服务的网络IP地址为“10.10.0.0/16”,与初始化过程中的配置相同。此外,您可以看到 Docker Swarm 上的当前可用节点仅为“1”。

通过下面的 \docker node\ 命令验证 Docker Swarm 上的可用节点列表。您会看到您的 Docker Swarm 部署中只有一个节点。
docker node ls

将工作节点添加到 Swarm
在 Docker Swarm 中,工作节点与其他容器编排具有相同的概念,即容器执行和运行的地方。必须在每个工作节点上安装 Docker 引擎,并且可以将工作节点提升为“Swarm 管理器”。
同时Swarm Manager也可以作为worker节点,也就是说你的应用也可以运行在Swarm Manager上。
运行以下 \docker swarm join\ 命令将 \worker1\ 和 \worker2\ 服务器添加到 Docker Swarm。此外,请务必将令牌替换为您环境中生成的令牌。
docker swarm join \
--token SWMTKN-1-4qxedy87gygenejrw06hlqpuwfm6erulccfj1jhnmsn0kehbnb-2ld4g3zo36bzu8d8ss4115rhq 192.168.5.100:2377
当您收到诸如“This node joined a swarm as a worker”之类的输出消息时,这意味着添加了工作节点。
当“worker1”和“worker2”加入 Docker Swarm 时,您可以看到类似的输出。

接下来,再次转到 Swarm Manager 并运行下面的 docker 命令以验证 Docker Swarm 上的节点列表。
docker node ls
您应该在 Docker Swarm 环境中看到三个节点。在本示例中,swarm-manager1\ 用作 Swarm Manager,\worker1\ 和 \worker2\ 服务器均用作工作节点。

此外,您还可以使用下面的 docker 命令验证节点列表。
docker info
在 Swarm Manager 服务器上,您可以在以下屏幕截图中看到输出。有 1 个管理器和 3 个节点(swarm-manager 也用作 worker)。

但是,在 \worker1\ 和 \worker2\ 服务器上,您将看到如下输出。您可以看到默认 TCP 端口 2377 的 Swarm Manager IP 地址。

至此,您已经完成了使用 Rocky Linux 的 Docker Swarm 部署。接下来,您将把应用程序/服务部署到您的 Swarm 环境中。
在 Docker Swarm 上管理服务
当您将应用程序部署到 Docker Swarm 环境时,该应用程序将被称为“服务”。它是您的微服务应用程序的图像,它可以是 HTTP 服务器、数据库服务器或其他应用程序。
要在 Docker Swarm 上部署服务,您应该指定要使用的基础映像、端口、服务的特定名称以及服务的副本数。
您现在将学习将服务部署到 Docker Swarm 的基本方法。
在此示例中,您将使用 1 个副本创建一个新服务“test-httpd”,并在 Swarm 节点上公开端口“8000”。您将使用的图像是 \httpd:alpine\。
运行以下 \docker service\ 命令来创建新服务。
docker service create --replicas 1 --name test-httpd -p 8000:80 httpd:alpine

现在通过下面的 docker 命令验证 Docker Swarm 上的服务。您应该看到服务“test-httpd”正在运行,并且还公开了 TCP 端口 8000,只有 1 个副本。
docker service ls

接下来,通过以下命令检查“test-httpd”服务的详细信息。
docker service inspect test-httpd
docker service inspect --pretty test-httpd
下面你可以看到“test-httpd”的详细服务。

此外,您还可以通过“docker service”命令检查在“test-httpd”服务上运行的容器,如下所示。
docker service ps test-httpd
您可以看到“test-httpd.1”容器正在“swarm-manager1”服务器上运行。

现在使用以下 firewall-cmd 命令在所有服务器上打开端口 \8000\。
sudo firewall-cmd --add-port=8000/tcp
之后,使用 curl 命令验证 \test-httpd\ 服务,如下所示。在此示例中,“swarm-manager1”IP 地址为“192.168.5.100”。
curl 192.168.5.30:8000
curl -I 192.168.5.30:8000
您将看到“test-httpd”服务的默认 index.html 页面。

在 Docker Swarm 上扩展服务
在 Docker Swarm 上部署服务后,现在您将学习如何扩展服务和应用程序。
运行以下命令将“test-httpd”服务扩展到 3 个副本。此命令将在工作节点上创建另外两个 \test-httpd\ 服务。
docker service scale test-httpd=3

现在,使用以下命令验证正在运行的服务列表。您应该看到另一个 \test-httpd\ 服务正在 \worker1\ 和 \worker2\ 服务器上运行。
docker service ps test-httpd

最后,在 \worker1\ 和 \worker2\ 服务器上通过 curl 命令验证服务,如下所示。如果该服务正在运行,您应该会在屏幕上看到默认的 index.html 页面。
检查 worker1 上的服务。
docker ps
curl worker1:8000

检查 worker2 上的服务。
docker ps
curl worker2:8000

删除 Docker Swarm 上的服务
您已经了解了 Docker Swarm 上的基本部署和扩展服务。接下来,您将通过删除“test-httpd”服务来清理您的 Docker Swarm 环境。
运行以下命令从 Docker Swarm 中删除服务“test-httpd”。
docker service rm test-httpd
之后,通过下面的 \docker service inspect\ 命令验证 \test-httpd\ 服务。您应该会看到该服务已被删除。
docker service inspect test-httpd
此外,您还可以通过下面的 docker 命令进行验证,以检查您的 Swarm 上正在运行的容器和图像的列表。
您应该看到容器已被删除,并且 httpd:alpine 图像在所有服务器上都可用。
docker ps
docker images
结论
在本指南中,您已经部署了带有三个 Rocky Linux 服务器的 Docker Swarm。您还学习了在 Linux 服务器上安装 Docker Engine 以及在 Rocky Linux 系统上配置 Firewalld。最后,您还学习了通过“docker service”命令将基本应用程序部署到 Docker Swarm。
从这里,您现在可以将具有所有依赖项的容器化应用程序部署到 Docker Swarm。您还可以添加更多 Swarm Manager 来设置 Docker Swarm 环境的高可用性。