DockerSwarm简单教程
⽂章⽬录
⼀、什么是Docker Swarm
  换⾔之,各种形式的Docker Client(compose,docker-py等)均可以直接与Swarm通信,甚⾄Docker本⾝都可以很容易的与Swarm 集成,这⼤⼤⽅便了⽤户将原本基于单节点的系统移植到Swarm上,同时Swarm内置了对Docker⽹络插件的⽀持,⽤户也很容易的部署跨主机的容器集服务。
  Docker Swarm 和 Docker Compose ⼀样,都是 Docker 官⽅容器编排项⽬,但不同的是,Docker Compose 是⼀个在单个服务器或主机上创建多个容器的⼯具,⽽ Docker Swarm 则可以在多个服务器或主机上创建容器集服务,对于微服务的部署,显然 Docker Swarm 会更加适合。
  从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现⼯具,我们就不需要像之前⼀样,再配置 Etcd 或者 Consul 来进⾏服务发现配置了。
  Swarm deamon只是⼀个调度器(Scheduler)加路由器(router),Swarm⾃⼰不运⾏容器,它只是接受Docker客户端发来的请求,调度适合的节点来运⾏容器,这就意味着,即使Swarm由于某些原因挂掉了,集中的节点也会照常运⾏,放Swarm重新恢复运⾏之后,他会收集重建集信息。
1.1、Docker Swarm 基本结构图
  在结构图可以看出 Docker Client使⽤Swarm对 集(Cluster)进⾏调度使⽤。
  上图可以看出,Swarm是典型的master-slave结构,通过发现服务来选举manager。manager是中⼼管理节点,各个node上运⾏agent接受manager的统⼀管理,集会⾃动通过Raft协议分布式选举出manager节点,⽆需额外的发现服务⽀持,避免了单点的瓶颈问题,同时也内置了DNS的负载均衡和对外部负载均衡机制的集成⽀持
1.2、Swarm的⼏个关键概念
1.2.1、Swarm
  集的管理和编排是使⽤嵌⼊docker引擎的SwarmKit,可以在docker初始化时启动swarm模式或者加⼊已存在的swarm
1.2.2、Node
  ⼀个节点是docker引擎集的⼀个实例。您还可以将其视为Docker节点。您可以在单个物理计算机或云服务器上运⾏⼀个或多个节点,但⽣产集部署通常包括分布在多个物理和云计算机上的Docker节点。
  要将应⽤程序部署到swarm,请将服务定义提交给 管理器节点。管理器节点(manager nodes)将称为任务的⼯作单元分派 给⼯作节点(worker nodes)。
  Manager节点还执⾏维护所需集状态所需的编排和集管理功能。Manager节点选择单个领导者来执⾏编排任务。⼯作节点接收并执⾏从管理器节点分派的任务。
  默认情况下,管理器节点还将服务作为⼯作节点运⾏,但您可以将它们配置为仅运⾏管理器任务并且是仅管理器节点。代理程序在每个⼯作程序节点上运⾏,并报告分配给它的任务。⼯作节点向管理器节点通知其分配的任务的当前状态,以便管理器可以维持每个⼯作者的期望状态。
  node是加⼊到swarm集中的⼀个docker引擎实体,可以在⼀台物理机上运⾏多个node,node分为:
manager nodes,也就是管理节点,执⾏集的管理功能,维护集的状态,选举⼀个leader节点去执⾏调度任务。
worker nodes,也就是⼯作节点,接收和执⾏任务。参与容器集负载调度,仅⽤于承载task。
Node的⼯作模式
1.2.3、Service
  ⼀个服务是任务的定义,管理机或⼯作节点上执⾏。它是体系统的中⼼结构,是⽤户与体交互的主要根源。创建服务时,你需要指定要使⽤的容器镜像。
  创建⼀个服务,指定了容器所使⽤的镜像和容器运⾏的命令; service是运⾏在worker nodes上的task的描述,service的描述包括使⽤哪个docker 镜像,以及在使⽤该镜像的容器中执⾏什么命令。
service的⼯作模式
1.2.4、Task
  任务是在docekr容器中执⾏的命令,Manager节点根据指定数量的任务副本分配任务给worker节点
  ⼀个任务包含了⼀个容器及其运⾏的命令。task是service的执⾏实体,task启动docker容器并在容器中执⾏任务。
任务与调度
服务副本与全局服务
1.3、Swarm相关的命令
docker swarm:集管理,⼦命令有 init, join, leave, update。(docker swarm --help查看帮助)
docker service:服务创建,⼦命令有 create, inspect, update, remove, tasks。(docker service–help查看帮助)
docker node:节点管理,⼦命令有 accept, promote, demote, inspect, update, tasks, ls, rm。(docker node --help查看帮助)1.4、Swarm的调度策略
  Swarm在调度(scheduler)节点(leader节点)运⾏容器的时候,会根据指定的策略来计算最适合运⾏容器的节点,⽬前⽀持的策略有:spread, binpack, random.
1)Random
  顾名思义,就是随机选择⼀个Node来运⾏容器,⼀般⽤作调试⽤,spread和binpack策略会根据各个节点的可⽤的CPU, RAM以及正在运⾏的容器的数量来计算应该运⾏容器的节点。
2)Spread
  在同等条件下,Spread策略会选择运⾏容器最少的那台节点来运⾏新的容器,binpack策略会选择运⾏容器最集中的那台机器来运⾏新的节点。
  使⽤Spread策略会使得容器会均衡的分布在集中的各个节点上运⾏,⼀旦⼀个节点挂掉了只会损失少部分的容器。
3)Binpack
  Binpack策略最⼤化的避免容器碎⽚化,就是说binpack策略尽可能的把还未使⽤的节点留给需要更⼤空间的容器运⾏,尽可能的把容器运⾏在⼀个节点上⾯。
1.5、Swarm Cluster模式特性
1)批量创建服务
  建⽴容器之前先创建⼀个overlay的⽹络,⽤来保证在不同主机上的容器⽹络互通的⽹络模式
2)强⼤的集的容错性
  当容器副本中的其中某⼀个或某⼏个节点宕机后,cluster会根据⾃⼰的服务注册发现机制,以及之前设定的值--replicas n,
  在集中剩余的空闲节点上,重新拉起容器副本。整个副本迁移的过程⽆需⼈⼯⼲预,迁移后原本的集的load balance依旧好使!
  不难看出,docker service其实不仅仅是批量启动服务这么简单,⽽是在集中定义了⼀种状态。Cluster会持续检测服务的健康状态并维护集的⾼可⽤性。
3)服务节点的可扩展性
  Swarm Cluster不光只是提供了优秀的⾼可⽤性,同时也提供了节点弹性扩展或缩减的功能。当容器组想动态扩展时,只需通过 scale 参数即可复制出新的副本出来。
  仔细观察的话,可以发现所有扩展出来的容器副本都run在原先的节点下⾯,如果有需求想在每台节点上都run⼀个相同的副本,⽅法其实很简单,只需要在命令中将 "--replicas n" 更换成 "--mode=global" 即可!
复制服务(–replicas n)
将⼀系列复制任务分发⾄各节点当中,具体取决于您所需要的设置状态,例如“–replicas 3”。
全局服务(–mode=global)
适⽤于集内全部可⽤节点上的服务任务,例如 "--mode=global" 。如果⼤家在 Swarm 集中设有 7 台 Docker 节点,则全部节点之上都将存在对应容器。
4)调度机制
  所谓的调度其主要功能是cluster的server端去选择在哪个服务器节点上创建并启动⼀个容器实例的动作。它是由⼀个装箱算法和过滤器组合⽽成。每次通过过滤器(constraint)启动容器的时候,swarm cluster 都会调⽤调度机制筛选出匹配约束条件的服务器,并在这上⾯运⾏容器。
------------------Swarm cluster的创建过程包含以下三个步骤----------------------
1)发现Docker集中的各个节点,收集节点状态、⾓⾊信息,并监视节点状态的变化
2)初始化内部调度(scheduler)模块
3)创建并启动API监听服务模块
  ⼀旦创建好这个cluster,就可以⽤命令docker service批量对集内的容器进⾏操作,⾮常⽅便!
  在启动容器后,docker 会根据当前每个swarm节点的负载判断,在负载最优的节点运⾏这个task任务,⽤"docker service ls" 和"docker service ps + taskID"可以看到任务运⾏在哪个节点上。容器启动后,有时需要等待⼀段时间才能完成容器创建。
⼆、Dcoker Swarm 集部署
2.1、环境情况
机器环境(四台机器,centos7.x系统)
IP:192.168.13.130 ;主机名:host-192-168-13-130 ;担任⾓⾊:swarm manager
IP:192.168.13.131 ;主机名:host-192-168-13-131 ;担任⾓⾊:swarm node
IP:192.168.13.132 ;主机名:host-192-168-13-132 ;担任⾓⾊:swarm node
IP:192.168.13.133 ;主机名:host-192-168-13-133 ;担任⾓⾊:swarm node
2.2、准备⼯作
  1、修改 hosts 信息
# 编辑修改 192.168.13.130 服务器的 /etc/hosts ⽂件为以下内容
$ vim /etc/hosts
127.0.0.1  localhost localhost.localdomain localhost4 localhost4.localdomain4
::1        localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.13.130  host-192-168-13-130
192.168.13.131  host-192-168-13-131
192.168.13.132  host-192-168-13-132
192.168.13.133  host-192-168-13-133
  2、将 hosts ⽂件同步到其他节点
# 将 hosts ⽂件同步到 host-192-168-13-131 节点
$ scp /etc/hosts root@192.168.13.131:/etc/hosts
# 将 hosts ⽂件同步到 host-192-168-13-132 节点
$ scp /etc/hosts root@192.168.13.132:/etc/hosts
# 将 hosts ⽂件同步到 host-192-168-13-133 节点
$ scp /etc/hosts root@192.168.13.133:/etc/hosts
  3、设置防⽕墙
  关闭三台机器上的防⽕墙。如果开启防⽕墙,则需要在所有节点的防⽕墙上依次放⾏ 2377/tcp(管理端⼝)、7946/udp(节点间通信端⼝)、4789/udp(overlay ⽹络端⼝)端⼝。
# 关闭防⽕墙
$ systemctl disable firewalld.service
$ systemctl stop firewalld.service
  防⽕墙开发端⼝(命令含义)
–zone #作⽤域
–add-port=80/tcp #添加端⼝,格式为:端⼝/通讯协议
–permanent #永久⽣效,没有此参数重启后失效
# 添加规则
$ firewall-cmd --zone=public --add-port=2377/tcp --permanent
$ firewall-cmd --zone=public --add-port=7946/udp--permanentdocker重启容器命令
$ firewall-cmd --zone=public --add-port=4789/udp--permanent
# 重启防⽕墙
$ firewall-cmd --reload
  4、安装docker并配置加速器(在四台主机都要安装)
  安装过程省略不写
2.3、创建Swarm并添加节点
2.3.1)、创建Swarm集(需要在swarm manager所在的节点执⾏)
$ docker swarm init --advertise-addr 192.168.13.130
Swarm initialized: current node (z2n633mty5py7u9wyl423qnq0) is now a manager.
To add a worker to this swarm, run the following command:
# 这就是添加节点的⽅式(要保存初始化后token,因为在节点加⼊时要使⽤token作为通讯的密钥)
docker swarm join --token SWMTKN-1-2lefzq18zohy9yr1vskutf1sfb2a590xz9d0mjj2m15zu9eprw-2938j5f50t35ycut0vbj2sx0s 192.168.31.43:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
  上⾯命令(docker swarm join)执⾏后,该机器⾃动加⼊到 swarm 集。这个会创建⼀个集token,获取全球唯⼀的 token,作为集唯⼀标识。
  后续将其他节点加⼊集都会⽤到这个token值。其中,--advertise-addr 参数表⽰其它swarm中的worker节点使⽤此ip地址与manager联系。命令的输出包含了其它节点如何加⼊集的命令。
  如果当前节点中已经有 swarm,则会出现以下错误:
$ docker swarm init --advertise-addr 192.168.13.130
Error response from daemon: This node is already part of a swarm. Use "docker swarm leave" to leave this swarm and join another one.
  解决⽅式很简单:离开之前的swarm即可:
  这⾥的leave就是在集中删除节点,-f参数强制删除,执⾏完在重新执⾏OK
$ docker swarm leave -f
2.3.2)、其它节点加⼊到集
# 192.168.13.131 服务器加⼊到集中(在192.168.13.131服务器上执⾏当前命令)
$ docker swarm join --token SWMTKN-1-2lefzq18zohy9yr1vskutf1sfb2a590xz9d0mjj2m15zu9eprw-2938j5f50t35ycut0vbj2sx0s 192.168.13.130:2377
# 192.168.13.132 服务器加⼊到集中(在192.168.13.132服务器上执⾏当前命令)
$ docker swarm join --token SWMTKN-1-2lefzq18zohy9yr1vskutf1sfb2a590xz9d0mjj2m15zu9eprw-2938j5f50t35ycut0vbj2sx0s 192.168.13.130:2377
# 192.168.13.133 服务器加⼊到集中(在192.168.13.133服务器上执⾏当前命令)
$ docker swarm join --token SWMTKN-1-2lefzq18zohy9yr1vskutf1sfb2a590xz9d0mjj2m15zu9eprw-2938j5f50t35ycut0vbj2sx0s 192.168.13.130:2377 2.3.3)、查看集中的机器及状态
  当前命令需要在 swarm manager所在的节点执⾏
$ docker node ls
ID                            HOSTNAME              STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
odudl9jtsh9outjeqpvep97of *  host-192-168-13-130  Ready              Active              Leader              19.03.13
rks3yfgf0on9vianshk00z4gw    host-192-168-13-131  Ready              Active                                  19.03.13
wfdmpemouhxmsorc555znl92a    host-192-168-13-132  Ready              Active                                  19.03.13
jsj8jtontfa6lzqg659mkw3z9    host-192-168-13-133  Ready              Active                                  19.03.12
  swarm集中node的 availability 状态可以为 active 或者drain,其中:
active状态下,node可以接受来⾃manager节点的任务分派;
drain状态下,node节点会结束task,且不再接受来⾃manager节点的任务分派(也就是下线节点)
2.3.4)、上线和下线服务
  上线和下线的操作分为:主动上下线(在需要上下线所在的服务器上执⾏命令) 和 被动上下线(在manager上执⾏命令)
  主动上下线
# 下线操作
$ docker swarm leave -f
# 上线操作
$ docker swarm join --token SWMTKN-1-2lefzq18zohy9yr1vskutf1sfb2a590xz9d0mjj2m15zu9eprw-2938j5f50t35ycut0vbj2sx0s 192.168.13.130:2377
  被动上下线
# 下线操作
$ docker node update --availability drain host-192-168-13-133
# 上线操作
$ docker node update --availability active host-192-168-13-133
2.4、在Swarm中部署服务(nginx为例)
  Docker 1.12版本提供服务的Scaling、health check、滚动升级等功能,并提供了内置的dns、vip机制,实现service的服务发现和负载均衡能⼒
2.4.1)、创建⽹络(在manager节点执⾏)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。