从主机的层面来看,docker swarm管理的是docker host集群。

 

什么是集群?

    服务器集群由一组网络上相互连接的服务器组成,他们一起协同工作。

一个集群和一堆服务器的显著区别是:

集群能够像单个系统那样工作,同时提供高可用,负载均衡和并行处理。

这样,部署应用的时候,我们只考虑需要多少的内存和CPU,而不是考虑会使用哪台服务器的内存和CPU。我们不应该关心应用部署在哪里,我们应该关心运行这些应用需要哪些资源,然后将它部署到集群,集群管理程序(比如:docker swarm)会搞定这些细节。

集群整体容量的调整是通过集群中添加和删除主机节点实现的。但不管怎样的操作,集群始终还是一个整体

 

 

从今天开始,我们将重点学习docker swarm,我们会创建docker swarm集群,部署应用,伸缩扩展应用,以及对应用执行滚动升级

 

docker swarm Mode

docker v1.12是一个非常重要的版本,Docker重新实现了集群编排方式。再此之前,提供集群功能的docker swarm是一个单独的软件,而且依赖外部数据库(比如:consul。etcd。zookeeper)

 

从v1.12开始,docker swarm的功能已经完全与docker engine集成,要管理集群,只需要启动swarm mode。安装好docker ,swarm就已经在那里了,服务发现也已经在那里了(不需要安装consul等外部数据库)

 

相比kubnetes,用docker swarm创建集群非常简单,不需要额外安装任何软件,也不需要做任何额外的配置。

 

swarm

swarm是运行docker engine的多个主机组成的集群

从v1.12开始,集群管理和编排功能已经集成在docker engine。当docker engine初始化了一个swarm或者加入到一个存在的swarm时,他就启动了swarm mode。

没启动swarm mode时,docker 执行的是容器的命令;运行swarm mode后,docker 增加了编排service的能力

docker 允许在同一个docker 主机上即运行swarm service,又运行单独的容器。

 

node

swarm中每个docker engine都是一个node,有两种类型的node:manager和worker

 

为了向swarm中部署应用,我们需要在manager node上执行部署命令,manager node会将部署任务拆解并分配给一个或多个worker node完成部署。

manager node负责执行编排和集群管理工作,保持并维护swarm处于期望的状态。swarm中如果有多个manager node,他们会自动协商,并选举出一个leader执行编排任务。

 

worker node接受并执行由manager node派发的任务。默认配置下manager node同事也是一个worker node,不过可以将其配置成manager-only node,让其专门负责编排和集群管理工作。work node会定期向manager node报告自己的状态和他正在执行的任务的状态,这样manager就可以维护整个集群的状态。

 

 

service

service定义了worker node上要执行的任务。

swarm主要编排任务就是保证service处于期望的状态。

 

 举个service例子:

在swarm中启动一个http服务,使用的镜像是httpd:latest,副本数为3

manager node负责创建这个service,经过分析知道需要启动3个httpd容器,根据当前各worker node的状态将运行容器的任务分配下去,比如worker1上运行两个容器,worker2上运行两个容器。

运行了一段时间,worker2突然宕机了,manager监控到这个故障,于是立即在worker3上启动一个新的httpd容器

这样就保证了service处于期望的三个副本状态