Docker Engine从1.12开始整合swarm(集群)模式,集成很多工具和特性,比如:跨主机上快速部署服务,服务的快速扩展,集群的管理整合到docker引擎,这意味着可以不可以不使用第三方管理工具。分散设计,声明式的服务模型,可扩展,状态协调处理,多主机网络,分布式的服务发现,负载均衡,滚动更新,安全(通信的加密)等等,下面开始创建Docker集群,但是要先认识一些集群swarm模式关键概念
本文将说明如何构建Nginx集群。
关键概念
Swarm
集群的管理和编排是使用嵌入到docker引擎的SwarmKit,可以在docker初始化时启动swarm模式或者加入已存在的swarm
Node
一个节点(node)是已加入到swarm的Docker引擎的实例
当部署应用到集群,你将会提交服务定义到管理节点,接着Manager管理节点调度任务到worker节点,manager节点还执行维护集群的状态的编排和群集管理功能,worker节点接收并执行来自manager节点的任务。通常,manager节点也可以是worker节点,worker节点会报告当前状态给manager节点
服务和任务
服务是要在worker节点上要执行任务的定义,它在工作者节点上执行,当你创建服务的时,你需要指定容器镜像
任务是在docekr容器中执行的命令,Manager节点根据指定数量的任务副本分配任务给worker节点
创建swarm
在开始之前先创建先把节点创建起来,下面将会创建三个节点,分别是manager节点,两个worker节点,manager节点在主机上部署,两个worker节点在虚拟机中部署(这里不限于是虚拟机只要可以联网的机器即可比如VPS等),虚拟机使用Virtualbox(在生产环境中建议使用CoreOs)
CoreOs 是为集群部署而设计的一个轻量级的Linux操作系统
初始化
在当前主机上启动swarm模式,要保存初始化后token,因为在节点加入时要使用token作为通讯的密钥
➜ docker swarm init --advertise-addr 192.168.1.2
这里要注意的是IP地址,如果你的worker节点部署在远程的VPS上,那么你应该给个远程的外网可以访问的IP地址,在多网卡的机器上需要注意这个问题
创建两个worker节点
可以使用docker-machine创建,Linux用户请自行安装docker-machine
分别命名为node0,node1
➜ docker-machine create -d virtualbox nodeX
使用docker-machine的命令登录node0,node1节点并加入到swarm集群中
➜ docker-machine ssh node0 ##登录到nodeo节点,node1一样
加入到swarm集群中
➜ docker swarm join \
--token SWMTKN-11m0u46krm5khxd7a46ugyxbsg16nqse8r8r0fdprv1zkvm99kj2sq8vm12ho9gqi3hwowbunugw \
192.168.1.2:2377
在两个节点上执行加入swarm集群的命令,现在manager节点和两个worker节点已经建立,并且可以在manager节点查看
➜ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
4qva9xt8q9pyts6glaik1dsk1 * Freax Ready Active Leader
8xwcgflzhcq9xfefxjnrpyoyh node1 Ready Active
f4me2j2vmq4g0xb9eihrybz57 node0 Ready Active
部署服务
在manager节点部署nginx服务,服务数量为10个,公开指定端口是8080映射容器80,使用nginx镜像
➜ docker service create --replicas 10 --name nginx --publish 8080:80 nginx
执行这个命令时manager节点分发任务到各个worker节点,包括Manager节点本身(管理节点也可以是worker节点),可以通过下面的命令查看
➜ docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
w2k6zsgssnguzsj nginx.1 nginx Freax Running Running about an hour ago
3t9lpx6xeyi3ywu nginx.2 nginx Freax Running Running about an hour ago
.....
jif5q0hgbg800jh nginx.10 nginx Freax Running Running about an hour ago
可以看到Manager节点也运行nginx服务
测试
现在可以在浏览器中输入192.168.1.2
,docker就会使用routing mesh作为负载均衡器分发请求给各个节点的nginx服务,如果在生产环境中请使用Haproxy或者其它的高性能的TCP/HTTP负载均衡器
扩展服务
现在可以继续加入更多的节点扩展服务,第一步增加节点
➜ docker-machine create -d virtualbox node2
继续在Manager节点增加服务
➜ docker service scale nginx=15
➜ docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
8uj879zlkl7o68gl7 nginx.1 nginx node1 Running Preparing 1 seconds ago
......
ywbav9etj7osqyag nginx.15 nginx node0 Running Preparing 1 seconds ago
swarm工作方式
Node
services
服务, 任务, 容器
任务与调度
服务副本与全局服务
Thank Docker