Docker Swarm

Docker Swarm项目

1.Swarm介绍

DockerSwarm是Docker官方编排(项目之一,负责对Docker集群进行管理.DockerSwarm将一群Docker宿主机变成一个单一的,虚拟的主机.Swarm使用标准的Docker API接口作为其前端访问入口,换言之,各种形式的Docker工具比如Dokku,Compose,Krane,Deis,Docker-py,Docker本身等都可以很容易的与Swarm进行集成.在使用Swarm管理docker集群的时候, 会有一个swarmmanager以及若干swarm node,swarm manager上运行swarm daemon,用户只需要跟swarm manager通信,然后swarm manager再根据discoveryservice的信息选择一个swarm node来运行container.需要注意的是,swarmdaemon只是一个任务调度器(scheduler)和路由器(router),他本身不运行容器,它只接受Docker Client发送过来的请求,调度合适的swarm node来运行container.这意味着,即使swarm daemon由于某些原因挂掉了,已经运行起来的容器也不会有任何影响,和Swarm一起发布的Docker管理工具还有Machine以及Compose。

2.Swarm架构
Swarm作为一个管理Docker集群的工具,首先需要将其部署起来,可以单独将Swarm部署于一个节点。另外,自然需要一个Docker集群,集群上每一个节点均安装有Docker。具体的Swarm架构图可以参照下图:


Swarm架构中最主要的处理部分自然是Swarm节点,Swarm管理的对象自然是Docker Cluster,Docker Cluster由多个Docker Node组成,而负责给Swarm发送请求的是Docker Client。

有两点需要注意:

1、急集群中的每台节点上面的Docker版本都不能小于1.4

2、为了让swarmmanager能够每台swarm node进行通信,集群中的每台几段的Docker daemon都必须监听同一个网络接口.

 

3.Swarm命令
Swarm架构图可以让大家对Swarm有一个初步的认识,比如Swarm的具体工作流程:Docker Client发送请求给Swarm;Swarm处理请求并发送至相应的Docker Node;Docker Node执行相应的操作并返回响应。除此之外,Swarm的工作原理依然还不够明了。深入理解Swarm的工作原理,可以先从Swarm提供的命令入手。Swarm支持的命令主要有4个:swarm create、swarm manage、swarm join、swarm list。当然还有一个swarm help命令,该命令用于指导大家如何正确使用swarm命令,本文不再赘述。
3.1 swarm create
Swarm中swarm create命令用于创建一个集群标志,用于Swarm管理Docker集群时,Docker Node的节点发现功能。发起该命令之后,Swarm会前往Docker Hub上内建的发现服务中获取一个全球唯一的token,用以唯一的标识Swarm管理的Docker集群。
注:Swarm的运行需要使用服务发现,目前该服务内建与Docker Hub,该服务发现机制目前还在alpha版本,站点为:http://discovery-stage.hub/docker.com 。
3.2 swarm manage
Swarm中swarm manage是最为重要的管理命令。一旦swarm manage命令在Swarm节点上被触发,则说明用户需要swarm开始管理Docker集群。从运行流程的角度来讲,swarm经历的阶段主要有两点:启动swarm、接收并处理Docker集群管理请求。
Swarm启动的过程包含三个步骤:
1)发现Docker集群中的各个节点,收集节点状态、角色信息,并监视节点状态的变化;
2)初始化内部调度(scheduler)模块;
3)创建并启动API监听服务模块;
第一个步骤,Swarm发现Docker集群中的节点。发现(discovery)是Swarm中用于维护Docker集群状态的机制。既然涉及到发现(discovery),那在这之前必须先有注册(register)。Swarm中有专门负责发现(discovery)的模块,而关于注册(register)部分,不同的discovery模式下,注册(register)也会有不同的形式。目前,Swarm中提供了5种不同的发现(discovery)机制:Node Discovery、File Discovery、Consul Discovery、EtcD Discovery和Zookeeper Discovery。
第二个步骤,Swarm内部的调度(scheduler)模块被初始化。swarm通过发现机制发现所有注册的Docker Node,并收集到所有Docker Node的状态以及具体信息。此后,一旦Swarm接收到具体的Docker管理请求,Swarm需要对请求进行处理,并通过所有Docker Node的状态以及具体信息,来筛选(filter)决策到底哪些Docker Node满足要求,并通过一定的策略(strategy)将请求转发至具体的一个Docker Node。
第三个步骤,Swarm创建并初始化API监听服务模块。从功能的角度来讲,可以将该模块抽象为Swarm Server。需要说明的是:虽然Swarm Server完全兼容Docker的API,但是有不少Docker的命令目前是不支持的,毕竟管理Docker集群与管理单独的Docker会有一些区别。当Swarm Server被初始化并完成监听之后,用户即可以通过Docker Client向Swarm发送Docker集群的管理请求。Swarm的swarm manage接收并处理Docker集群的管理请求,即是Swarm内部多个模块协同合作的结果。请求入口为Swarm Server,处理引擎为Scheduler,节点信息依靠Disocovery。
3.3 swarm join
Swarm的swarm join命令用于将Docker Node添加至Swarm管理的Docker集群中。从这点也可以看出swarm join命令的执行位于Docker Node,因此在Docker Node上运行该命令,首先需要在Docker Node上安装Swarm,由于该Swarm只会执行swarm join命令,故可以将其当成Docker Node上用于注册的agent模块。功能而言,swarm join可以认为是完成Docker Node在Swarm节点处的注册(register)工作,以便Swarm在执行swarm manage时可以发现该Docker Node。然而,上文提及的5种discovery模式中,并非每种模式都支持swarm join命令。不支持的discovery的模式有Node Discovery与File Discovery。Docker Node上swarm join执行之后,标志着Docker Node向Swarm注册,请求加入Swarm管理的Docker集群中。Swarm通过注册信息,发现Docker Node,并获取Docker Node的状态以及具体信息,以便处理Docker请求时作为调度依据。
3.4 swarm list
Swarm中的swarm list命令用以列举Docker集群中的Docker Node。
Docker Node的信息均来源于Swarm节点上注册的Docker Node。而一个Docker Node在Swarm节点上注册,仅仅是注册了Docker Node的IP地址以及Docker监听的端口号。
使用swarm list命令时,需要指定discovery的类型,类型包括:token、etcd、file、zk以及<ip>。而swarm list并未罗列Docker集群的动态信息,比如Docker Node真实的运行状态,或者Docker Node在Docker集群中扮演的角色信息。


安装:

安装swarm的最简单的方式是使用Docker官方的swarm镜像载 

$docker pull swarm 

使用如下命令来测试一下swarm是否安装成功.

$dockerrun --rm swarm -v 

显示的信息如下:

swarmversion 1.2.5 (27968ed)

使用:

在使用swarm管理集群前,需要把集群中的所有节点的docker daemon的监听方式更改为0.0.0.0:2375.

直接修改Docker的配置文件(ubuntu上 /etc/default/docker,linux的版本不同,这个文件可能不同),在文件最后添加这样的一句话:

DOCKER_OPTS=”-H 0.0.0.0:2375 -Hunix:///var/run/docker.sock”需要注意的是,一定是要在所有被swarm管理的节点上进行的,修改之后需要重启Docker.

servicedocker restart 

把要加入集群的机器IP地址和端口号写入文件中,本次实验就是要在11这台机器上操作:

$echo192.168.66.11:2375 >> cluster 

$echo192.168.66.23:2375 >> cluster 

$cat  cluster

192.168.66.11:2375 

192.168.66.23:2375 

第二步是在11这台机器上执行swarm manage:

dockerrun -d -p 2376:2375 -v $(pwd)/cluster:/tmp/cluster swarm manage file:///tmp/cluster 

这条命令成功后返回的也是一个ID.

还是使用docker ps命令来查看有没有启动成功.

 

swarm调度策略:

swarm支持多种调度策略来选择节点.每次在swarm启动container的时候,swarm会根据选择的调度策略来选择节点运行container.目前支持的有:spread,binpack和random.通过名字就能看出他们的调度策略有啥不同.在执行swarmmanage命令启动swarm集群的时候可以通过--strategy参数来指定,默认是spread.spread和binpack策略会根据每台节点的可用CPU,内存以及运行的containers的数量来给各个节点分级,而random策略是随机选择一个节点来启动container.

 spread策略:swarm会选择一个正在运行的container的数量最少的那个节点来运行container.这种情况会导致启动的container会尽可能的分布在不同的机器上运行,这样的好处就是如果有节点坏掉的时候不会损失太多的container.

binpack策略:这种情况下,swarm会尽可能的把所有的容器放在一台节点上运行.这种策略会避免容器碎片化,因为它会把未使用的机器分配给更大的容器,带来的好处就是swarm会使用最少的几点运行最多的容器.


Swarm过滤器:

swarm的调度器(scheduler)在选择节点运行容器的时候支持几种过滤器(filter):Constraint,Affinity,Port,Dependency,Health.可以在执行swarmmanage命令的时候通过--filter选择来设置.

ConstraintFilter:

constraint是一个跟具体节点相关联的键值对,可以看做是每个节点的标签,这个标签可以在启动docker daemon的时候指定,比如:

$docker-d --label label_name=label01 

也可以写在docker的配置文件里面(ubuntu上是在/etc/default/docker).

本次试验中,给11添加标签打开/etc/default/docker文件,修改DOCKER_OPTS:

DOCKER_OPTS="-H0.0.0.0:2375 -H unix:///var/run/docker.sock --label label_name=011" 

别忘了,每台机器的DOCKER_OPTS都需要修改.

在使用docker run命令启动容器的时候,使用 -e constarint:key=value 的形式,可以指定container运行的节点.比如我们想在1上面启动一个redis容器.

$docker-H 192.168.66.11:2376 run --name redis_1 -d -e constraint:label_name==011 redis 

AffinityFilter:

通过使用AffinityFilter,可以让一个容器紧挨着另一个容器启动,也就是说让两个容器在同一个节点上面启动.

$docker-H 192.168.66.11:2376 run -d --name redis redis 

$docker-H 192.168.66.11:2376 run -d --name redis_1 -e addinity:container==redis redis

PortFilter:

Port会被认为是一个唯一的资源

$docker-H 192.168.66.11:2376 run -d -p 80:80 nginx 

执行完这条命令,之后任何使用80端口的容器都会启动失败.

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值