技术原理

Docker Swarm实现高可用性

任何基于web的应用程序最重要的功能是什么?有很多,但对我来说高可用性是最重要的。这就是Docker Swarm帮助我们实现的目标!它有助于应用程序的高可用性。

在我以前的博客中,我解释了Docker Compose是如何工作的。这篇关于Docker Swarm的博客是对前者的延续,这里已经解释了使用Docker Swarm对任何多容器应用程序进行容器化的好处。

在这个博客中,它只是一个角度应用程序,将由Docker Swarm处理。注意:对平均堆栈应用程序进行容器化的方法是相同的。

那么,什么是Docker Swarm?”“Docker Swarm”是一种创建和维护Docker引擎集群的技术,Docker引擎可以托管在不同的节点上,而这些位于远程位置的节点在Swarm模式下连接时形成一个集群。

为什么使用Docker Swarm“因为已经提到的原因!在不停机的情况下实现高可用性是每个服务提供商的首要任务。高可用性会给你的客户留下深刻印象吗?好吧,如果他们面临停工,他们不会被打动的。这不费吹灰之力。

Docker Swarm的其他好处

和许多其他服务一样,Docker Swarm为我们做自动负载平衡。因此,当一个节点失败时,DevOps工程师不需要将处理请求路由到其他节点。集群的管理器将自动为我们执行负载平衡。

分散访问是另一个好处。那是什么意思?这意味着所有节点都可以从管理器中轻松访问,管理器还会定期提示节点,并跟踪其运行状况/状态以应对停机时间。但是,节点无法访问或跟踪在其他节点/管理器中运行的服务。

您可以检查在节点中运行的容器的数量,根据我们的要求放大或缩小容器的数量,只需执行一个命令

即使在部署了应用程序之后,我们可以发布滚动更新并确保实现CI(持续集成)。一个接一个地向一个节点发出滚动更新,从而确保没有停机,并且负载在集群中的其他节点之间分布。

那么,接下来呢?做显而易见的事。开始使用Docker Swarm,如果您已经在Docker上工作过,或者您的组织希望包含一个可靠的web服务。

注意:Docker引擎安装在独立的主机/服务器上或主机中的多个虚拟机上。

开始使用Swarm模式

Docker Swarm由管理器,或者让我这样说,启动Swarm集群的实例成为管理器。启动集群的命令是:

$docker swarm init——公布地址ip地址

在这里,'-advertide addr'标志用于向其他要加入集群的节点播发自身。管理器的IP地址需要与标志一起指定。下面是示例屏幕截图。

docker init command - docker swarm - edureka

当群集启动时,管理器端会生成一个令牌。此令牌需要其他节点使用才能加入群集。

具体是什么?复制在管理器的docker引擎生成的整个令牌,将其粘贴到节点的docker引擎并执行它。上面屏幕截图的突出显示部分是一个标记。当令牌在工作节点上执行时,它将如下面的屏幕截图所示。

docker swarm join worker - docker swarm - edureka

任何加入集群的节点都可以稍后升级为管理器。如果您希望docker引擎作为管理器加入,请在管理器的末尾执行以下命令:

$docker swarm join token manager

docker swarm join manager command - docker swarm - edureka

,在稍后的时间点,如果您希望节点加入群集的令牌,请运行以下命令:

$docker swarm join token节点

继续,并在每个节点上执行令牌以加入集群。完成所有操作后,您可以运行docker node list命令来检查有多少节点已加入集群及其状态。命令是:

$docker node ls

截图如下:

docker node ls command - docker swarm - edureka为角度应用程序

创建一个docker镜像如果一切正常,那么只要构建了docker镜像,我们就可以启动Swarm服务。Docker映像可以从Dockerfile生成。用于构建应用程序的Dockerfile如下:

来自节点:6WORKDIR/usr/src/app公司运行npm cache clean收到。/usr/src/应用程序暴露4200CMD[“npm”,“start”]

Dockerfile用于一起执行一组命令,以便从基本映像构建自定义Docker映像。如你所见,我使用的基本图像是节点:6’. NodeJS是Docker Hub中的映像I,它被标记为版本6。

然后我在容器中创建一个新的Docker目录并使其成为容器中的工作目录。

我是包.json'从本地计算机到容器工作目录的文件。然后指定“RUN npm cache clean”和“RUN npm install”命令。npm install命令下载包.json文件。

然后我将所有项目代码从本地计算机复制到容器中,公开端口号4200,以便在浏览器上访问角度应用程序,最后,我正在指定包含应用程序的npm start命令。

现在,要基于此Dockerfile创建Docker映像,请运行以下命令:

$Docker build-t angular imagecommand to build dockerfile - docker swarm - edureka

注意:需要在集群中的所有节点中构建Docker映像。没有它,容器就不能在其他Docker引擎中旋转。

启动Docker Swarm服务

如果我们的Docker映像已经构建,我们可以从该映像中旋转容器。但是,我们会做得更好:用它创建一个Docker Swarm服务。创建swarm服务的命令是:

$docker service create--name“Angular a p p Container”-p 4200:4200 Angular image

docker service create command - docker swarm - edureka

这里,“name”标志用于为我的服务命名,“p”标志用于将容器端口公开到主机端口。在包.json文件,我已经指定了承载角应用程序的容器端口。此命令中的4200有助于将容器的端口4200映射到主机的端口4200。“angular image”是我先前构建的图像的名称。

记住:当我们创建服务时,它可以托管在集群中的任何docker引擎上。swarm的管理者将决定它将被托管在哪里。但是,不管它位于哪个节点,都可以在本地主机:4200来自群集中连接的任何节点。

这怎么可能?因为Swarm在内部公开端口号,以便群集中的每个其他节点都可以访问。这意味着,集群中任何节点/管理器上的4200端口都将呈现角度应用程序。

现在是什么?容器是否处于活动状态?”

您可以通过运行docker service list命令来验证服务是否已被容器化。但是,部署容器可能需要一分钟的时间。下面是命令:

$docker service ls

这个命令将列出Swarm集群管理的所有服务。在我们的例子中,它应该显示一个活动容器。请查看下面的屏幕截图以供参考。

docker service ls command - docker swarm - edureka

此处的“REPLICAS=1/1”表示该容器在群集中有一个“服务”。并且“MODE=replicated”表示服务在集群中的所有节点上都被复制。

现在,要确定哪个节点/管理器、应用程序托管在哪个节点上,我们可以运行命令docker service ps命令,后跟容器名。命令是:

$docker service ps Angular App Container

屏幕截图如下。

docker service ps command - docker swarm - edureka

这提到了应用程序所在节点的详细信息,以及用于启动服务的命令。

docker ps命令显示了有关活动容器。命令是:

$docker ps

查看下面的屏幕截图以供参考。

docker ps command - docker swarm - edureka

但是,此命令将仅在群集管理器和服务实际托管的节点上工作。

若要检查有多少节点正在运行,请运行“节点列表”命令。命令是:

$docker node ls

以检查容器是否运行在特定主机中,运行node ps命令。命令是:

$docker node ps

docker node ps command - docker swarm - edureka

如果你还记得的话,我之前提到过服务当前正在复制模式下运行。这意味着服务将在集群中的所有节点上复制。你认为还有别的办法吗?”

当然!有一种叫做全局模式的东西。在这种模式下,这个容器的服务在集群中的每个/manager上运行。记住在旋转另一组容器之前停止当前服务/容器。

的命令是:

$docker service rm Angular App container

在全局模式下旋转容器的命令是:

$docker service create--name“Angular App container”-p 4200:4200--mode全局角度图像

docker init command - docker swarm - edureka1”

这将在群集中的3个节点上创建3个服务。您可以通过运行docker service list命令来验证它。下面是截图。

docker init command - docker swarm - edureka2”

执行docker服务ps命令时,您会看到类似这样的内容:

docker init command - docker swarm - edureka3”

如您所见,它表示模式已复制,此容器的副本为3。现在是这个博客最好的部分。

要在三个容器之间运行两个服务副本,我们可以使用replicas标志。看看下面的命令:

$docker service create--name“Angular App Container”-p 4200:4200--replicas=2 Angular image

docker swarm replicas command - docker swarm - edureka

,您会注意到这两个服务在集群中的三个节点之间是负载平衡的。运行docker service process命令来验证容器在哪个节点处于活动状态。请看下面的截图以供参考。容器在一个管理器节点和一个工作节点中处于活动状态。

docker service ps command - docker swarm - edureka

从工作节点,您可以通过执行“docker ps”命令来验证容器是否正在运行。

docker ps command - docker swarm - edurekadocker Swarm For High Availability

现在要实际验证群集中是否存在高可用性,我们需要体验一个场景,其中一个节点宕机,集群中的其他节点弥补了这个问题。我们可以通过使用以下命令从其中一个节点手动停止容器来实现这种情况:

$docker stop Angular App container

在运行容器的节点:Worker-1上运行上述命令。从管理器,运行命令:

$docker service ps Angular App Container

现在您将注意到该容器正在node:Worker-2和Manager中运行。但是,它已经从node:Worker-1关闭。从下面的截图中可以看到同样的内容。

docker swarm ps command - docker swarm - edureka

这就是Docker高可用性的实现方式。尽管Worker-1中的容器处于非活动状态,但应用程序可以在该Worker节点上的端口4200处呈现。这是因为它内部连接到群集中的其他节点,并且它能够在浏览器中呈现应用程序。

在扩展服务

后的高可用性无论是在复制模式还是在全局模式下,我们都可以扩展在群集中运行的服务的数量。即使扩大规模,我们也将能够保持高可用性。这真是太棒了,不是吗?”

但是回到我们的观点,让我们看看扩大集群中的服务数量是多么容易。假设集群中有2个或3个副本,那么让我们只运行一个命令,将服务扩展到5个副本。命令是:

$docker service scale Angular App Container=5

下面是这个的屏幕截图。

docker init command - docker swarm - edureka8”

通过运行docker service list命令,您可以注意到副本的数量现在是5。通过运行docker service ps命令和服务名,您可以看到5个服务如何在3个节点上进行负载平衡和分布。命令是:

$docker service ls$docker service ps Angular App Container

docker init command - docker swarm - edureka9”

,最后,在docker Swarm设置中,如果您不希望您的管理者参与进程并使其仅用于管理进程,则我们可以将管理者从托管任何应用程序中排出。因为这就是它在世界上的运作方式,不是吗?经理只负责管理其他工人。无论如何,要执行的命令是:

$docker node update--availability drain Manager-1

docker node update drain command - docker swarm - edureka

您可以通过运行docker node list命令和docker service ps命令:

$docker node ls来验证管理器是否正在加入集群

你也可能喜欢

发表评论

您的电子邮件地址不会被公开。 必填项已用 * 标注

提示:点击验证后方可评论!

插入图片
人工智能应用领域 投稿者
我还没有学会写个人说明!
最近文章
  • * 没有更多文章了
  • 热门搜索

    分类目录