说明:此文章为腾讯云机器自动从本人csdn博客搬迁过来。是本人授权操作。
申明:无本人授权,不可转载本文。如有转载,本人保留追究其法律责任的权利。
龚浩华,QQ 29185807,月牙寂 道长
第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang
swarm是docker公司开发的一个管理docker集群的工具。swarm使用标准docker api来作为入口。功能简单,关键是复用了docker api。
下面将来简单的分析下swarm源码。
注:源码为swarm-0.1.0版本
我们先进入到main函数
代码在swarm\main.go
这里 初始化了一个app。其利用的是一个第三方库"github.com/codegangsta/cli"
然后添加了一个Before的动作,用于设置log
接着添加了create command
create操作,用于生成一个集群totken,用于集群的唯一标识
添加list command
list操作,用于打印当前集群中所有的node节点
添加了manage command还有join command。
最后调用了app.Run
manage操作,用于swarm manage的开启。
join操作,用于将机器添加到swarm集群中。
一般使用过程为:
1、create,创建一个集群的token,用于标识集群
2、join,将当前机器加入到集群中。
3、manage,开启swarm manage服务。
关于集群的创建,网上有很多文章,可以自行的去搜索。
那么我们先看看第三方库app是如何工作的。
代码在github.com\codegangsta\cli\app.go
我们先看看app结构体
其中最主要的是Befor,Commands
下面看看NewApp
这里很简单,都是一些默认的参数设置。
下面进入到Run
上面一个默认helpprinter的赋值
解析参数,并将其构造成context
参数的检查,如果before有被设置,则执行befor。
在swarm中,before中设置了log
查找command,然后调用command的Run
这里就是commands的遍历查找
源码在github.com\codegangsta\cli\command.go
先看结构体
其中最重要的就是Action
再看看Run
func (c Command) Run(ctx *Context) error {
这里省略了一些代码,直接看核心代码。一些参数的解析,然后最后,调用了Action
我们先看看create的注册
这个是在main函数中的
那么看下Action
代码在swarm\discovery\token\token.go
初始化,TokenDiscoveryService中的heartbeat设置为0,url使用了默认的url https://discovery-stage.hub.docker.com/v1
通过向url post一个请求,获取一个token
先看看main函数
join的Action则是join函数
代码在swarm\join.go
代码流程是,构建一个discovery,然后调用discovery.Register,注册当前机器
那么我们看看discovery
代码在swarm\discovery\discovery.go
discovery是一个插件模式。New中,通过查找scheme,来查找相对应的插件
下面是DiscoveryService接口
那我们看看插件注册
代码在swarm\discovery\consul\consul.go
代码在swarm\discovery\etcd\etcd.go
代码在swarm\discovery\file\file.go
代码在swarm\discovery\nodes\nodes.go
代码在swarm\discovery\token\token.go
代码在swarm\discovery\zookeeper\zookeeper.go
一共注册了6种插件
注册函数
将其放到了一个全局的map中
下面我们一etcd来讲解join的流程
代码在swarm\discovery\etcd\etcd.go
初始化了一个etcd client设置相关的参数
向etcd服务器发起一个注册url
swarm的代码还是比较少的,很清晰。
文中如果有哪里讲解的不对的地方,还请见谅,望指正。