1 概述
Docker Swarm是Docker公司在2014年初发布的一套管理Docker集群的工具,其可将一群Docker宿主机集群成一个单一、虚拟的主机。Swarm使用标准的Docker API接口作为其前端访问接口,各种形式的Docker工具和指令都能很容易与其集成。但是,和Google的Kubernetes相比,其功能较少,在生产环境中的应用也较少。
Docker Swarm的结构图如下,在使用Swarm管理Docker集群时,会有一个主机充当swarm manager角色以及若干的swarm node,而swarm manager本身也属于一个swarm node。swarm manager上运行swarm daemon,用户只需要跟swarm manager通信,而swarm manager再根据discovery service的信息选择一个swarm node来运行container。值得注意的是,swarm daemon只是一个任务调度器(scheduler)和路由器(router),它本身不运行容器,它只接受Docker client 发送过来的请求,调度合适的swarm node来运行container。这意味着,即使swarm daemon由于某些原因挂掉了,已经运行起来的容器也不会有任何影响。
在利用Swarn管理Docker集群时,有以下两点需要注意:
(1)集群中的每台节点上面的 Docker 的版本都不能小于1.4
(2)为了让 swarm manager 能够跟每台 swarm node 进行通信,集群中的每台节 点的 Docker daemon 都必须监听同一个网络接口。
2 安装
2.1 拉取Swarm镜像
sudo docker pull swarm
在国内拉取Docker Hub上的镜像可能有点问题,此时可以使用下列指令拉取daocloud上的镜像
sudo docker pull daocloud.io/swarm
查看是否安装成功
sudo docker run --rm daocloud.io/swarm -v
输出类似下列信息表示安装成功
swarm version 1.2.5 (27968ed)
2.2 修改集群中节点的docker deamon监听方式
在所有需要被Swarm管理的节点主机上修改Docker配置文件:vim /etc/default/docker
在文件结尾添加:DOCKER_OPTS="-H 0.0.0.0:2375 -H unix:///var/run/docker.sock"
重启Docker:sudo service docker restart
2.3 服务发现(Discovery service backend)功能
Docker集群管理需要使用服务发现(Discovery service backend)功能,Swarm主要支持以下几种方式:DockerHub提供的服务发现功能,本地的文件,etcd,counsel,zookeeper和IP列表等,这里主要介绍第一种方式,其他的用法都是大同小异
这里的实验环境如下:
使用三台云主机:10.4.230.62,10.4.228.219,10.4.230.16,其中第一台同时充当swarm manager角色
2.3.1 创建集群token
在三台机器上的任何一台执行create命令来获取集群的唯一token,用来标识要管理的集群
sudo docker run --rm daocloud.io/swarm create
这里,在第一台云主机上(其实每一台节点主机都可以,并不一定要在充当swarm manager的主机上)执行该命令,输出如下:
[root@docker ~]# sudo docker run --rm daocloud.io/swarm create
d5e1c2c733eb8968a72dfadefbf48a7f
命令的返回值:d5e1c2c733eb8968a72dfadefbf48a7f就是上面说到的token,这个token需要在后面的操作中反复用到
2.3.2 加入集群
在所有需要被管理的节点主机上执行join命令来使其加入集群中,例如,在第一台云主机上执行:
sudo docker run -d daocloud.io/swarm join --addr=10.4.230.62:2375 token://d5e1c2c733eb8968a72dfadefbf48a7f
可以看到,这里用到了上一步产生的token,在另外两台主机上只要将ip改成其对应的主机ip即可
2.3.3 启动swarm manager
在需要充当swarm manager的主机上执行manage命令:
sudo docker run -d -p 2376:2375 daocloud.io/swarm manage token://d5e1c2c733eb8968a72dfadefbf48a7f
这里再次用到了token,其中的2376表示映射端口,它可以是除了2375以外未被占用的端口
2.3.4 验证集群创建是否成功
在任何一台节点主机上执行list命令可以验证集群是否创建成功,这里在第二台主机(ip为10.4.228.219)执行:
[root@docker0 ~]# sudo docker run --rm daocloud.io/swarm join list token://d5e1c2c733eb8968a72dfadefbf48a7f
10.4.230.62:2375
10.4.228.219:2375
10.4.230.16:2375
输出的3个ip即为加入集群的节点主机的ip,表示集群创建成功
2.3.5 操作集群
现在可以在任何一台节点主机上执行docker命令了(命令需要通过-H参数指明swarm manager节点主机的ip),例如,在第二台主机上执行docker info命令查看集群中节点信息
[root@docker0 ~]# sudo docker -H 10.4.230.62:2376 info
输出下列关于集群的信息,可以看到节点数为3(Nodes参数),集群调度策略(后面会介绍)为spread(Strategy参数)等
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: swarm/1.2.5
Role: primary
Strategy: spread
Filters: health, port, containerslots, dependency, affinity, constraint
Nodes: 3
(unknown): 10.4.228.219:2375
└ ID:
└ Status: Pending
└ Containers: 0
└ Reserved CPUs: 0 / 0
└ Reserved Memory: 0 B / 0 B
└ Labels:
└ UpdatedAt: 2016-10-28T05:34:52Z
└ ServerVersion:
(unknown): 10.4.230.16:2375
└ ID:
└ Status: Pending
└ Containers: 0
└ Reserved CPUs: 0 / 0
└ Reserved Memory: 0 B / 0 B
└ Labels:
└ UpdatedAt: 2016-10-25T02:09:52Z
└ ServerVersion:
(unknown): 10.4.230.62:2375
└ ID:
└ Status: Pending
└ Containers: 0
└ Reserved CPUs: 0 / 0
└ Reserved Memory: 0 B / 0 B
└ Labels:
└ UpdatedAt: 2016-10-28T05:10:52Z
└ ServerVersion:
Plugins:
Volume:
Network:
Swarm:
NodeID:
Is Manager: false
Node Address:
Security Options:
Kernel Version: 3.10.0-123.el7.x86_64
Operating System: linux
Architecture: amd64
CPUs: 0
Total Memory: 0 B
Name: b1573f3d6178
Docker Root Dir:
Debug Mode (client): false
Debug Mode (server): false
WARNING: No kernel memory limit support