对于有多台服务器来说,若是每一台都去手动操控,那将会是一件很是浪费时间的事情,毕竟时间这东西,于咱们而言,十分宝贵,或许在开始搭建环境的时候耗费点时间,感受是正常的,我也如此,花费大堆时间在采坑和填坑的路上,可是当你踩完后,还经过手动管理的方式去维护,那即是折磨,所以对于多台服务器下的容器编排管理,借助工具将会节省着大把时间,现现在有名的容器编排工具,K8s、Docker Swarm,甚至功能更强大的Rancher,本次我将使用且是我惟一使用过的Docker Swarm工具搭建Docker集群并部署服务。html
Docker Swarm官方文档地址:https://docs.docker.com/engine/swarm/java
在以前的文章中,对于一台新的服务器加入到服务器集群中,经过Docker Machine去管理,配置好Docker Enginee环境,简单也方便,同时在配置时,将本地的私钥发送给了新的服务器,也就配置好了关联关系,若有须要能够查看该文章:http://www.javashuo.com/article/p-hxkguhrj-w.htmlnode
加入进来后对于整个服务器集群来说,可预见的Swarm方式是这样的,也是最为简便的方式管理,Manager做为容器集群发起者,也是管理者,通常来说,我会尽量少的在上面部署服务,经过一些方式过滤掉服务在上面的部署,毕竟它的职责更多的侧重于管理整个容器集群,可是对于一些开支小的且比较稳定的服务,也是能够i直接部署在Manager节点中的,这是一种建议。redis
这是我当前的服务器下的容器集群,存在一个Leader也就是Manager,也能够设置多个,可是现有场景下,彻底知足个人需求了。docker
咱们利用Docker Swarm中的Docker CLI去建立集群、管理集群、动态扩容服务。而对于Swarm的版本,建议是Docker版本要高于1.13,在1.13之上,将Swarm功能集成到了Docker中,而对于1.13之下,须要单独设置Swarm模式,在此建议,使用1.13之上的版本。服务器
在Swarm中有几个名字概念:微信
Node:节点,分为Manager Node和Worker Node,在上图中有一个Manager节点和三个Worker节点,这个概念很好理解。网络
Service:服务,对于Swarm而言,部署服务是它对外的职责,对于整个集群来说,都是经过部署服务的形式,而且经过扩容、缩放来动态的决定服务数量。ssh
Task:服务的具体承载,在于Manager节点将服务分发到具体的Worker节点上,属于下达具体任务概念。相较于Service属于微观概念。工具
对于Swarm模式下,须要开启几个相关的端口,而在系统中,这几个端口是默认打开的:
TCP Port 2377:用于集群间通讯,
TCP 和UDP Port 7946:用于节点间通讯,
UDP Port 4789:用于Overlay网络方式下通讯,这个是在集群模式下的网络通讯方式,单机下采用的是Bridge方式。
在须要设置为Manager的节点上输入以下命令,开始容器集群搭建,IP地址写如今服务对外IP。
$ docker swarm init --advertise-addr <MANAGER-IP>
能够得到以下信息,集群建立完毕,复制该命令,在其余子节点上执行完毕,子节点即是加入了该容器集群(可经过docker-machine ssh xxx的方式快速进入到目的节点中执行)。
对全部节点加入完毕,经过docker node ls命令查看节点信息,加入的节点和自己节点将会显示出来。
若是有新的服务器加入了,而且已经安装好了docker enginee须要加入到节点中且忘记了这一条token的值,能够经过在manager上执行该命令再次得到这个值
docker swarm join-token worker
至此,整个容器集群就搭建完毕,Manager节点和Worker节点都接入进来了。
进入到Manager节点,开始部署一个服务到容器集群中,经过以下命令建立一个服务:
$ docker service create --replicas 1 --name helloworld alpine ping docker.com
命令解读:
一、docker service create:用于建立服务;
二、--replicas 用于肯定须要多少个节点容器去运行服务;
三、对于参数alpine ping docker.com 则是指定alpine镜像,并在容器启动后执行ping docker.com操做;
经过docker service ls查看当前建立的全部服务,能够经过docker service remove 服务名或ID的形式移除服务,这类操做和Docker的操做是差很少的。
经过docker service inspect --pretty 服务名或ID方式查看服务的详细信息,
在不带--pretty参数下,能够查看到Json格式的详细信息,
经过命令docker service ps 服务名或ID查看服务运行状态,
一、扩容/伸缩现有服务承载容器数量
经过scale命令执行,并再次查看服务运行信息:
docker service scale 服务名或ID=实例数量
二、滚动更新使用服务使用镜像版本,本次从新搭建一个redis服务,用四个实例承载服务,并经过滚动升级redis版本。
对于--update-delay 为更新先后切换时间,对于后面跟随的时间类型能够有时分秒如10h10m10s,
经过--update -parallelism参数能够指定最大的实例更新数量,如本次中有四个实例,指定为2后将最大容许两个实例更新到新版本中,
更新实例版本规则,当一个实例更新完毕并返回running才继续更新下一个实例,若是有一个实例更新失败,整个更新队列将会停止,能够经过--update-failure-action参数指定更新失败后的解决方式,如docker swarm create或是update服务。
服务建立后实例运行结果结果
如今开始更新版本:
docker service update --image redis:3.0.7 redis
指定新版本镜像及现有服务名称,开始更新,查看当前服务运行状况,四个redis均完成更新。
接下来,经过控制worker节点的状态来控制是否承载某一个服务,经过以下命令,将现有节点下的host1再也不承载redis服务,命令以下
docker node update --availability drain host1
经过参数--availability指定为drain(置空)来设置host1节点不参与服务承载,以下能够看到原有服务已经移交到manager节点下了。
而后启用该host1节点恢复为活跃模式,可是该节点不会再去承载redis服务,由于服务如今并不须要它去承载。
docker node update --availability active host1
至此,对于容器集群的搭建就此完成了。
对于容器集群的其余高级用法能够参见官方文档:https://docs.docker.com/engine/swarm/services/#roll-back-to-the-previous-version-of-a-service
本文地址:http://www.javashuo.com/article/p-zsvfctcs-eu.html
欢迎关注微信订阅号,有新的文章将同步到订阅号中
2018-10-27,望技术有成后能回来看见本身的脚步