一、Docker swarm简介
Docker swarm与docker-compose一样,都是docker官方推出的docker容器的编排工具。但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。
Docker swarm:其作用就是把若干个Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。Swarm和Kubernetes比较类似,但是更加轻,具有的功能也较kubernetes更少一些。
从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,我们就不需要像之前一样,再配置 Etcd 或者 Consul 来进行服务发现配置了。
Docker swarm中有三种角色:
- Manager node:负责执行容器的编排和集群的管理工作,保持并维护swarm处于期望的状态,swarm可以有多个manager node,他们会自动协商选举出一个leader执行编排任务;但相反,不能没有manager node;
- Worker node:接受并执行由manager node派发的任务,并且默认manager node也是一个work node,不过可以将它设置manager-only node,让它负责编排和管理工作;
- Service:用来定义worker上执行的命令;
注意:在一个Docker Swarm群集中,每台docker服务器的角色可以都是manager,但是,不可以都是worker,也就是说,不可以群龙无首,并且,参与群集的所有主机名,千万不可以冲突。
二、环境准备
注意事项:
- 保证时间同步;
- 关闭防火墙与SElinux(实验环境);
- 更改主机名;
- 编写host文件,保证可以i进行域名解析;
三、初始化Swarm群集
[[email protected] ~]# tail -3 /etc/hosts
192.168.1.1 node01
192.168.1.2 node02
192.168.1.3 node03
//三台主机都需配置hosts文件实现域名解析的效果
[[email protected] ~]# docker swarm init --advertise-addr 192.168.1.1
//--advertise-addr:指定与其他node通信的地址
命令的返回信息,如图:
图中①的命令:以worker身份加入swarm群集中;
②的命令:以manager身份加入swarm群集中;
出现上图表示初始化成功!注意:--token表示期限为24小时;
四、配置node02、node03加入、离开swarm群集
###################node02的操作如下###################
[[email protected] ~]# docker swarm join --token SWMTKN-1-4pc1gjwjrp9h4dny52j58m0lclq88ngovis0w3rinjd05lklu5-ay18vjhwu7w8gsqvct84fv8ic 192.168.1.1:2377
###################node03的操作如下###################
[[email protected] ~]# docker swarm join --token SWMTKN-1-4pc1gjwjrp9h4dny52j58m0lclq88ngovis0w3rinjd05lklu5-ay18vjhwu7w8gsqvct84fv8ic 192.168.1.1:2377
//node02、node03默认是以worker身份加入的
###################node01的操作如下###################
[[email protected] ~]# docker node ls
//查看节点详细信息(只能是manager身份才可查看)
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
mc3xn4az2r6set3al79nqss7x * node01 Ready Active Leader 18.09.0
olxd9qi9vs5dzes9iicl170ob node02 Ready Active 18.09.0
i1uee68sxt2puzd5dx3qnm9ck node03 Ready Active 18.09.0
//可以看出node01、node02、node03的状态为Active
###################node02的操作如下###################
[[email protected] ~]# docker swarm leave
###################node03的操作如下###################
[[email protected] ~]# docker swarm leave
//node02、node03申请离开群集
###################node01的操作如下###################
[[email protected] ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
mc3xn4az2r6set3al79nqss7x * node01 Ready Active Leader 18.09.0
olxd9qi9vs5dzes9iicl170ob node02 Down Active 18.09.0
i1uee68sxt2puzd5dx3qnm9ck node03 Down Active 18.09.0
///可以看到node02、node03的状态为Down
[[email protected] ~]# docker node rm node02
[[email protected] ~]# docker node rm node03
//node01将node02、node03移除群集
以上命令可以将某一个节点加入、删除群集,不过加入时是使用worker身份的,如果想要让节点是以manager身份加入群集,需要使用以下命令:
[[email protected] ~]# docker swarm join-token manager
//查询以manager身份加入群集的命令
[[email protected] ~]# docker swarm join-token worker
//查询以worker身份加入群集的命令
如图:
###################node02的操作如下###################
[[email protected] ~]# docker swarm join --token SWMTKN-1-2c0gcpxihwklx466296l5jp6od31pshm04q990n3ssncby3h0c-78rnxee2e990axj0q7td74zod 192.168.1.1:2377
###################node03的操作如下###################
[[email protected] ~]# docker swarm join --token SWMTKN-1-2c0gcpxihwklx466296l5jp6od31pshm04q990n3ssncby3h0c-78rnxee2e990axj0q7td74zod 192.168.1.1:2377
//node02、node03加入群集是以manager身份加入
###################node01的操作如下###################
[[email protected] ~]# docker node ls //查看节点的详细信息
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
exr8uoww0eih43iujqz5cbv6q * node01 Ready Active Leader 18.09.0
r35f48huyw5hvnkuzatrftj1r node02 Ready Active Reachable 18.09.0
gsg1irl1bywgdsmfawi9rna7p node03 Ready Active Reachable 18.09.0
//从MANAGER STATUS这列就可看出
虽然加入群集时,可以指定使用manager、worker身份,但是也可以通过以下命令,进行降级、升级,操作如下:
[[email protected] ~]# docker node demote node02
[[email protected] ~]# docker node demote node03
//将node02、node03降级为worker
[[email protected] ~]# docker node promote node02
[[email protected] ~]# docker node promote node03
//将node02、node03升级为manager
//自行验证
五、部署图形化UI
部署图形化UI界面由node01来完成!
[[email protected] ~]# docker run -d -p 8080:8080 -e HOST=172.16.0.10 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualizer dockersamples/visualizer
//-e HOST指定的是容器
使用浏览器访问:
浏览器可以正常访问,则表示图形化UI界面部署完成!
六、docker swarm群集的service服务配置
node01发布一个任务,(必须在manager角色的主机上)运行六个容器,命令如下:
[[email protected] ~]# docker service create --replicas 6 --name web -p 80:80 nginx
// --replicas:副本数量;大概可以理解为一个副本就是一个容器
容器运行完成后,可以登录web页面进行查看,如图:
注意:如果另外两台节点服务器上没有相应的惊醒,则默认会从docker Hub上自动进行下载!
[[email protected] ~]# docker service ls //查看创建的service
ID NAME MODE REPLICAS IMAGE PORTS
nbfzxltrcbsk web replicated 6/6 nginx:latest *:80->80/tcp
[[email protected] ~]# docker service ps web //查看创建的service都运行在那些容器上
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
v7pmu1waa2ua web.1 nginx:latest node01 Running Running 6 minutes ago
l112ggmp7lxn web.2 nginx:latest node02 Running Running 5 minutes ago
prw6hyizltmx web.3 nginx:latest node03 Running Running 5 minutes ago
vg38mso99cm1 web.4 nginx:latest node01 Running Running 6 minutes ago
v1mb0mvtz55m web.5 nginx:latest node02 Running Running 5 minutes ago
80zq8f8252bj web.6 nginx:latest node03 Running Running 5 minutes ago
如果现在node02、node03发生宕机时,service并不会因为节点的当即而死掉,而是自动跑到正常的节点上。
模拟node02宕机,web页面如下:
恢复node02,web页面如下:
即使node02恢复正常,也不会将service分配给node02。
因此,可以得出一个结论:如果node发生故障,service会自动跑到可用的节点上;反之,如果node没有发生故障,默认情况下,service不会轻易更改节点!
七、实现service的扩容、收缩
扩容:就i是添加几台service;
收缩:就是减少几台service;
针对上述环境实现收缩、扩容;
(1)service扩容
[[email protected] ~]# docker service scale web=8
//原本有6个service,现在增加到8台
web页面如下:
关于service分配到那台node节点上,是根据docker swarm自身的算法进行分配的。
(2)service收缩
[[email protected] ~]# docker service scale web=4
//原本有8个service,现在减少到4台
web页面如下:
(3)设置某个node不运行service
上述环境中,三台都是manager,即使是一台manager、两台worker默认情况manager也是进行工作的,将node02、node03降级为worker,执行如下命令:
[[email protected] ~]# docker node demote node02
[[email protected] ~]# docker node demote node03
如图:
可以通过设置,使某台节点不运行service,如下:
[[email protected] ~]# docker node update --availability drain node01
//设置noder01以后不运行容器,但已经运行的容器并不会停止
// --availability:选项后面共有三个选项可配置,如下:
active:工作;pause:暂时不工作;drain:永久性的不工作
web页面如下:
[[email protected] ~]# docker node update --availability drain node02
//node02也不参加工作,但已经运行的容器并不会停止
如图:
由此可以得出:不是只有manager才有不工作的权力!
八、docker Swarm群集常用命令
[[email protected] ~]# docker swarm leave
//那个节点想推出swarm群集,就在那台节点上执行这条命令
//节点自动退出swarm群集(相当于辞职)
[[email protected] ~]# docker node rm 节点名称
//由manager主动删除节点(相当于开除)
[[email protected] ~]# docker node promote 节点名称
//将节点升级
[[email protected] ~]# docker node demote 节点名称
//将节点降级
[[email protected] ~]# docker node ls
//查看swarm群集的信息(只可以在manager角色的主机上查看)
[[email protected] ~]# docker node update --availability drain 节点名称
//调整节点不参加工作
[[email protected] ~]# docker swarm join-token worker
//查看加入swarm群集的令牌(可以是worker也可以是manager)
[[email protected] ~]# docker service scale web=4
//扩容、收缩swarn群集servie的数量(取决与群集原本的数量)
//比原本群集数量多,就是扩容,反之、收缩
[[email protected] ~]# docker service ls
//查看创建的service
[[email protected] ~]# docker service ps service的名称
//查看创建的service运行在那些容器上
[[email protected] ~]# docker service create --replicas 6 --name web -p 80:80 nginx
//指定运行的service副本数量
九、docker swarm总结
- 参与群集的主机名一定不能冲突,并且可以互相解析对方的主机名;
- 集群内的所有节点可以都是manager角色,但是不可以都是worker角色;
当指定运行的镜像时,如果群集中的节点本地没有该镜像,那么它将会自动下载对应的镜像;- 当群集正常工作时,若一个运行着容器的docker服务器发生宕机,那么,其所运行的所有容器,都将转移到其他正常运行的节点之上,而且,就算发生宕机的服务器恢复正常运行,也不会再接管之前运行的容器;
————————————本文到此结束,感谢阅读——————————
原文地址:https://blog.51cto.com/14157628/2462561