扯淡

集群模式是指在DOCKER引擎中嵌入的集群管理和编排特征。当你初始化一个新的集群或加入一个集群的节点时,DOCKER引擎以集群模式运行。        
为什么需要集群?为了解决单机瓶颈,从一到多,部署多份,从而构成“集群”。
从单机到集群,代码基本无需修改,仅仅是服务器的扩容,简单直接的提升了服务器的处理能力。  
     
参考文档:https://docs.docker.com/engine/swarm/swarm-tutorial/create-swarm

集群搭建

我们使用docker-machine来创建几个主机,用来演示swarm集群的创建。

1,先创建3台主机,我这里的命名是:h1 / h2 / h3,用其中的一台主机作为Leader,初始化swarm集群,并管理节点。

1
2
3
4
5
docker-machine create -d xhyve --xhyve-boot2docker-url ~/.docker/machine/cache/boot2docker.iso --engine-registry-mirror https://registry.docker-cn.com h1

docker-machine create -d xhyve --xhyve-boot2docker-url ~/.docker/machine/cache/boot2docker.iso --engine-registry-mirror https://registry.docker-cn.com h2

docker-machine create -d xhyve --xhyve-boot2docker-url ~/.docker/machine/cache/boot2docker.iso --engine-registry-mirror https://registry.docker-cn.com h3

查看创建好的3台主机:

1
docker-machine ls

输出:

1
2
3
4
_NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS_ 
_h1 - xhyve Running tcp://192.168.64.5:2376 v18.06.1-ce_
_h2 - xhyve Running tcp://192.168.64.6:2376 v18.06.1-ce_
_h3 - xhyve Running tcp://192.168.64.7:2376 v18.06.1-ce_

2,登录h1主机,初始化swarm集群

1
2
docker-machine ssh h1
docker swarm init --advertise-addr 192.168.64.5

输出:

1
2
3
4
5
6
7
8
_Swarm initialized: 
current node (h78ft6qqs27xxi1af9lw7w4tk) is now a manager.
To add a worker to this swarm, run the following

command:
docker swarm join --token SWMTKN-1-2lk16l2cjvporghr3g1kg6orjrotq682axu2yc0kjm5aepvois-br6bpyng0bvqg2jqcn4ud3cvs 192.168.64.5:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

3,分别登录h2h3,执行上面输出的join命令的添加到swarm集群

1
docker swarm join --token SWMTKN-1-2lk16l2cjvporghr3g1kg6orjrotq682axu2yc0kjm5aepvois-br6bpyng0bvqg2jqcn4ud3cvs 192.168.64.5:2377

输出:

1
_This node joined a swarm as a worker.

后续,如果需要查看添加节点的token和命令,可以使用如下命令:

1
docker swarm join-token worker

4,重新登录h1,查看集群节点情况,Leader表示主节点

1
2
3
docker-machine ssh h1

docker node ls

输出:

1
2
3
4
_ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION_ 
_h78ft6qqs27xxi1af9lw7w4tk h1 Ready Active Leader 18.06.1-ce_
_ifo2uegzz9s1619t72gnz64yk h2 Ready Active 18.06.1-ce_
_fysd1bc0knxvgkk53604joje2 h3 Ready Active 18.06.1-ce_

5,移除集群节点

a,在需要退出的节点上操作下面命令down掉节点,如需强制退出,可添加参数“-f”,如:

1
docker swarm leave -f

b,到主节点上“docker node ls”列出所有节点,根据id使用命令“docker node rm ”删除节点即可,如:

1
docker node rm <ID>

 

服务部署与扩容

如何将我们的容器部署到swarm集群?下面我们使用nginx来演示。

1,登录主机,执行下面的命令部署nginx服务

1
docker service create --replicas 3 -p 80:80 --name nginx nginx:1.15-alpine

2,查看服务部署情况,可以使用下面两个命令

1
2
3
docker service ls

docker service ps nginx

输出:

1
2
_ID NAME MODE REPLICAS IMAGE PORTS_ 
_26fd9ljhbjsp nginx replicated 3/3 nginx:1.15-alpine \*:80->80/tcp_

现在,我们已经可以在浏览器输入任意一个节点的地址,访问部署到nginx服务了,如访问:“http://192.168.64.5”

3,服务扩容,我们通过scale命令可以针对集群的服务进行扩容和缩减,控制的数量为当前集群的指定服务数量,一切都变的那么自然,可控。

1
docker service scale nginx=3

集群监控平台

监控是必须的,这使得 我们可以更直接的观察和管理 集群中的节点和服务,这里我们选用的是Docker Swarm Visualizer,简单直观。

登录管理节点,执行下面的命令添加监控:

1
2
3
4
5
6
docker service create \\
--name=viz \\
--publish=8080:8080/tcp \\
--constraint=node.role==manager \\
--mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \\
dockersamples/visualizer

监控部署后,我们就可以通过浏览器访问地址查看:http://192.168.64.7:8080/
监控效果:

常用命令

docker swarm

1
2
3
4
docker swarm init #初始化集群 
docker swarm join-token worker #查看工作节点
token docker swarm join-token manager #查看管理节点
token docker swarm join #加入集群中

docker node

1
2
3
4
5
6
7
docker node ls #查看所有集群节点 
docker node rm #删除某个节点(-f强制删除)
docker node inspect #查看节点详情
docker node demote #节点降级,由管理节点降级为工作节点
docker node promote #节点升级,由工作节点升级为管理节点
docker node update #更新节点
docker node ps #查看节点中的 Task 任务

docker service

1
2
3
4
5
6
7
docker service create #部署服务 
docker service inspect #查看服务详情
docker service logs #产看某个服务日志
docker service ls #查看所有服务详情
docker service rm #删除某个服务(-f强制删除)
docker service scale #设置某个服务个数
docker service update #更新某个服务