Docker学习—Swarm

前言:

  前一篇《Docker学习—Machine》中对Machine 进行了学习,本篇继续学习Swarm,那么Swarm是什么呢,有什么用呢?接下来一步步了解。

一、什么是Docker-Swarm?

 Swarm是使用swarmkit项目构建的嵌入在Docker 引擎中的集群管理和编排功能的工具包,可以直接在docker中使用

 一个集群由多个Docker主机组成,这些Docker主机以集群模式运行,并充当管理器(用于管理成员资格和委派)和工作器(运行 集群服务)。给定的Docker主机可以是管理员,工作人员或同时担任这两个角色。创建服务时,请定义其最佳状态(可用副本数,网络和存储资源,将服务公开给外界的端口等)。Docker致力于维持所需状态。例如,如果工作节点不可用,则Docker会在其他节点上调度该节点的任务。一个任务 是运行的容器是一个群服务的一部分,并通过群经理管理,而不是一个独立的容器。

 与独立容器相比,群集服务的主要优势之一是,您可以修改服务的配置,包括它所连接的网络和卷,而无需手动重新启动服务。Docker将更新配置,使用过期的配置停止服务任务,并创建与所需配置匹配的新任务。

 当Docker以群体模式运行时,您仍然可以在参与群体的任何Docker主机以及群体服务上运行独立容器。独立容器和群集服务之间的主要区别在于,只有群集管理节点可以管理群集,而独立容器可以在任何守护程序上启动。Docker守护程序可以以管理人员,工作人员或两者兼有的形式参与。

 正如您可以使用Docker Compose来定义和运行容器一样,您可以定义和运行Swarm服务堆栈。

 Swarm相关概念:

  • 节点:

 节点是Docker引擎参与swarm的一个实例。也可以将其视为Docker节点。您可以在单个物理计算机或云服务器上运行一个或多个节点,但生产集群部署通常包括分布在多个物理和云计算机上的Docker节点。

 通常分为管理节点和工作节点

 管理节点:要将应用程序部署到swarm,需要向管理节点提交一个服务定义。管理节点将称为任务的工作单元分派给工作节点。执行所需的编排和群集管理功能,以保持群的所需状态。管理节点选择一个领导者来执行编排任务。

 工作节点:接收并执行从管理节点调度的任务。默认情况下,管理节点也将服务作为工作节点运行,但您可以将它们配置为以独占方式运行管理任务并仅作为管理节点。代理在每个工作节点上运行,并报告分配给它的任务。worker节点将其分配任务的当前状态通知给manager节点,以便manager可以保持每个worker的所需状态。

  • 服务和任务

   服务:是要在管理或工作节点上执行的任务的定义。它是swarm系统的中心结构,是用户与swarm交互的主要根源。创建时,指定要在运行的容器中使用的容器映像和要执行的命令;在复制服务模型中,swarm manager根据您在所需状态下设置的规模在节点之间分配特定数量的任务,对于全局服务,swarm在集群中的每个可用节点上为服务运行一个任务。

   任务:是携带一个Docker容器和在容器内运行的命令。它是swarm的原子调度单元。管理节点根据服务规模中设置的副本数将任务分配给工作节点。任务一旦分配给节点,就不能移动到另一个节点。它只能在指定的节点上运行或失败。

  • 负载均衡:

   swarm manager使用入口负载平衡来公开你希望向swarm提供的外部服务。swarm manager可以自动为服务分配发布端口,也可以为服务配置发布端口。您可以指定任何未使用的端口。如果不指定端口,swarm manager会为服务分配30000-32767范围内的端口。

   外部组件(如云负载平衡器)可以访问群集中任何节点的发布端口上的服务,无论该节点当前是否正在运行该服务的任务。swarm路由中的所有节点都进入到正在运行的任务实例的连接。

   Swarm模式有一个内部DNS组件,它自动为Swarm中的每个服务分配一个DNS条目。swarm manager使用内部负载平衡根据服务的DNS名称在群集中的服务之间分配请求。

二、Swarm的功能亮点

Docker Engine集成集群管理:使用Docker Engine CLI创建一个Docker引擎群,您可以在其中部署应用程序服务。你不需要额外的编排软件来创建或管理蜂群。
分散式设计:Docker引擎在运行时处理任何专门化,而不是在部署时处理节点角色之间的差异。您可以使用Docker引擎部署两种类型的节点,管理器和工作者。这意味着您可以从一个磁盘映像构建一个完整的群。
声明性服务模型:Docker引擎使用声明性方法来定义应用程序堆栈中各种服务的所需状态。例如,您可以描述一个由web前端服务、消息队列服务和数据库后端组成的应用程序。
扩容缩放:对于每个服务,您可以声明要运行的任务数。当您放大或缩小时,swarm manager会通过添加或删除任务来自动进行调整,以保持所需的状态。
理想状态协调:swarm manager节点不断监视群集状态,并协调实际状态与所表达的期望状态之间的任何差异。
多主机网络:可以为您的服务指定overlay网络。swarm管理器在初始化或更新应用程序时自动为覆盖网络上的容器分配地址。
服务发现:Swarm管理器节点为群中的每个服务分配一个唯一的DNS名称和运行容器的负载平衡。您可以通过swarm中嵌入的DNS服务器查询swarm中运行的每个容器。
负载平衡:可以将服务的端口公开给外部负载平衡器。在内部,swarm允许您指定如何在节点之间分发服务容器。
默认安全:Swarm中的每个节点都强制TLS相互身份验证和加密,以确保自身和所有其他节点之间的通信安全。您可以选择使用自签名根证书或来自自定义根CA的证书。
滚动更新:升级时,可以逐步更新服务到节点。swarm manager允许您控制服务部署到不同节点集之间的延迟。如果出现任何问题,您可以回滚到该服务的以前版本。

三、Swarm如何工作?

 服务、任务和容器之间关系如下:

  

  下图显示了群集模式如何接受服务创建请求以及如何将任务调度到工作者节点

 

四、集群示例:

 1、使用Machine创建集群中docker环境,以下环境  

节点角色 名称 IP地址
manager manager 192.168.0.110
worker worker1 192.168.0.107
worker worker2 192.168.0.108

  进入GitBash命令创建:

docker-machine create -d hyperv --hyperv-virtual-switch docker_Virtual_Switch manager
docker-machine create -d hyperv --hyperv-virtual-switch docker_Virtual_Switch worker1
docker-machine create -d hyperv --hyperv-virtual-switch docker_Virtual_Switch worker2

  

 2、开启集群模式

#进入manager节点:
docker-machine ssh manager #初始化swarm
docker swarm init
--advertise-addr 192.168.0.110
#用于添加工作节点命令
docker swarm join --token SWMTKN-1-2ixlcvkjnv4tzh3i8qq14v0bfit7876pr0qputxmeu6w14m0p6-586ta6x7nf0y0ewh513qt8dwu 192.168.0.110:2377
 

  

 3、加入工作节点到集群模式

#进入worker1节点:
docker-machine ssh worker1
#工作节点加入集群
docker swarm join --token SWMTKN-1-2ixlcvkjnv4tzh3i8qq14v0bfit7876pr0qputxmeu6w14m0p6-586ta6x7nf0y0ewh513qt8dwu 192.168.0.110:2377 

#进入worker2节点:
docker-machine ssh worker2
#工作节点加入集群
docker swarm join --token SWMTKN-1-2ixlcvkjnv4tzh3i8qq14v0bfit7876pr0qputxmeu6w14m0p6-586ta6x7nf0y0ewh513qt8dwu 192.168.0.110:2377 

  

 4、部署服务到集群中  

docker service create --replicas 1 --name helloworld alpine ping docker.com
  • docker service create命令创建服务。
  • --name标志为服务命名helloworld
  • --replicas标志指定1个运行实例的所需状态。
  • 参数alpine ping docker.com将服务定义为执行命令的Alpine Linux容器ping docker.com

  

  5、服务管理

#扩展服务语法
docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>
#示例:
docker service scale helloworld=5

#查看服务语法
docker service ps <SERVICE-ID>
#示例
docker service ps helloworld

#删除服务语法、
docker service rm <SERVICE-ID>
#示例
docker service rm helloworld

其他常用命令使用docker service -h 查看

执行结果如下

 

五、节点操作:

  • 显示节点列表:docker node ls
  • 修改节点:docker node update 参数
  • 退出集群:doker swarm leave
  • 节点升级:docker node promote 节点名
  • 节点降级:docker node demote 节点名

后续:

 通过Swarm基本了解后,接下来使用实际案例部署到swarm验证,加深理解及操作。

参考:

   //docs.docker.com/engine/swarm/

Tags: