Swarm介绍
Swarm是Docker公司在2014年12月初发布的一套较为简单的工具,用来管理Docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机。Swarm使用标准的DockerAPI接口作为其前端访问入口,换言之,各种形式的DockerClient(dockerclient in go, docker_py, docker等)均可以直接与Swarm通信。Swarm几乎全部用Go语言来完成开发
Swarm deamon只是一个调度器(Scheduler)和路由器(router),Swarm自己不运行容器,它只是接受docker客户端发送过来的请求,调度适合的节点来运行容器,这意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,当Swarm重新恢复运行之后,它会收集重建集群信息。下面是Swarm的结构图:
Swarm的源码并不多,本文就简单讲述下swarm的关键代码,主要是创建容器的过程。
本文选取的swarm版本为VERSION = "1.0.1"
先看下代码文件夹结构
api |
swarm起来后对外提供的API |
cluster |
swarm集群管理 |
Dockerfile |
如果swarm以容器方式运行时的容器配置 |
leadership |
|
main.go |
swarm入口 |
RELEASE-CHECKLIST.md |
|
script |
|
CHANGELOG.md |
|
CONTRIBUTING.md |
|
docs |
|
LICENSE |
|
MAINTAINERS ROADMAP.md |
|
test |
|
cli |
命令行解析 |
discovery |
集群发现 |
Godeps |
|
logo.png |
|
README.md |
|
scheduler |
调度器(包含过滤,权衡等策略) |
version |
|
源码解析
1、 先看入口main.go
package main
import (
_"github.com/docker/swarm/discovery/file"
_"github.com/docker/swarm/discovery/kv"
_"github.com/docker/swarm/discovery/nodes"
_"github.com/docker/swarm/discovery/token"
"github.com/docker/swarm/cli"
)
func main() {
cli.Run()
}
可见入口实际调用的cli.Run 函数
2、 看 cli/ cli.go 文件中run函数
注意到,文件首import进来的"github.com/codegangsta/cli"
codegangsta/cli是 simple, fast, and funpackage for building command line apps in Go
gitlab链接https://github.com/codegangsta/cli
用这个包可以快速创建一个go语言的命令行应用。
在run函数里,主要对debug 参数和日志级别参数进行了设置,最后还是运行
app.Commands =commands
if err :=app.Run(os.Args); err != nil {
log.Fatal(err)
}
3、 那边commands到底有哪几个呢,见cli/commands.go
commands =[]cli.Command{
{
Name: "create",
ShortName:"c",
Usage: "Create a cluster",
Action: create,
},
{
Name