博文大纲
1.Docker Swarm简介及集群的作用。
2.实施部署Swarm集群。
一、Docker Swarm
Swarm是Docker公司推出的用来管理docker集群的平台,几乎全部用GO语言来完成的开发的,代码开源在点击这里, 它是将一群Docker宿主机变成一个单一的虚拟主机,Swarm使用标准的Docker API接口作为其前端的访问入口,换言之,各种形式的Docker。
Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。
从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,我们就不需要像之前一样,再配置 Etcd 或者 Consul 来进行服务发现配置了。
Docker Swarm集群中的角色
Swarm:作用于运行docker engine(引擎)的多个主机组成的集群。
node:每一个docker engine都是一个node(节点),分为manager和worker。
manager node:负责执行容器的编排和集群的管理工作,保持并维护swarm处于期望的状态。swarm可以有多个manager node,它们会自动协调并选举出一个Leader执行编排任务。但相反,不能没有manager node。
worker node:接受并执行由manager node派发的任务,并且默认manager node也是一个work node,不过可以将它设置为manager-only node,让它只负责编排和管理工作。
service:用来定义worker上执行的命令。
二、部署Docker Swarm
部署前准备:
Docker01 | Docker02 | Docker03 |
---|---|---|
Node01 | Node02 | Node03 |
192.168.2.60 | 192.168.2.50 | 192.168.2.80 |
关闭防火墙、禁用selinux、三台dockerhost区别主机名、时间同步。
Docker版本必须是:v1.12版本开始。
[root@node01 ~]# ntpdate time1.aliyun.com #与阿里云的时间同步,可以使用ntpdate 192.168.2.60与主机时间同步。
开始部署
1.初始化集群,Docker01上:
[root@node01 ~]# docker swarm init --advertise-addr 192.168.2.60 ##--advertise-addr:指定其他node通信的地址。
Swarm initialized: current node (pjortjrcrucuihbz6uphl8qnu) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4zz7hmub1du7b9xtpc57tdo9rd74dci0ly7eaj8fmyjluvurr5-41wghyxhgc8bg9ipctcmw75bx 192.168.2.60:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
##当执行完上面的命令时,会返回上面的信息,这些信息提示信息给出的是,如果其他节点需要加入此节点,需要执行的命令,直接复制,对其主机执行即可加入集群。
如果想要添加work节点运行下面的命令:
docker swarm join --token SWMTKN-1-4zz7hmub1du7b9xtpc57tdo9rd74dci0ly7eaj8fmyjluvurr5-41wghyxhgc8bg9ipctcmw75bx 192.168.2.60:2377
PS:这里--token:令牌,密钥,默认保存24小时。只有24小时有效期。
如果想要添加manager节点:运行下面的命令:
docker swarm join-token manager
2.两台docker02和docker03加入集群:
Docker02:
[root@node02 ~]# docker swarm join --token SWMTKN-1-4zz7hmub1du7b9xtpc57tdo9rd74dci0ly7eaj8fmyjluvurr5-41wghyxhgc8bg9ipctcmw75bx 192.168.2.60:2377
This node joined a swarm as a worker.
Docker03:
[root@node03 ~]# docker swarm join --token SWMTKN-1-4zz7hmub1du7b9xtpc57tdo9rd74dci0ly7eaj8fmyjluvurr5-41wghyxhgc8bg9ipctcmw75bx 192.168.2.60:2377
This node joined a swarm as a worker.
当其他两个节点加入成功之后,我们可以在manager node上执行docker node ls 查看节点详情:
[root@node01 ~]# docker node ls #这条命令只有manager node可以执行,worker node不可以执行。
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
pjortjrcrucuihbz6uphl8qnu * node01 Ready Active Leader 18.09.0
045waz9m9j9xfuk3p21nnyl17 node02 Ready Active 18.09.0
jtkz4zp2tp3f9ote21ohwhmgs node03 Ready Active 18.09.0
#这里的*号代表当前所在的节点。
可以看出,node01是leader(领导者嘛)。
3.将docker02和docker03提升为manager node,然后再将02和03恢复到worker node。(怎么灵活应用)
[root@node01 ~]# docker node promote node02
[root@node01 ~]# docker node promote node03
[root@node01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
pjortjrcrucuihbz6uphl8qnu * node01 Ready Active Leader 18.09.0
1emp6dh2iawsgy8700fdswk5d node02 Ready Active Reachable 18.09.0
39yu0s3ykz21gcphr53j7lp1y node03 Ready Active Reachable 18.09.0
这时候docker02和docker03也是manager node了,也可以使用另一种方法:
首先docker02和docker03申请离开集群:
Docker02:
[root@node02 ~]# docker swarm leave #申请离开一个集群,之后查看节点状态会变成down,然后可以通过manager node将其删除。
Node left the swarm.
Docker03:
[root@node03 ~]# docker swarm leave
Node left the swarm.
回到docker01的leader上,删除节点:
[root@node01 ~]# docker node rm node02
node02
[root@node01 ~]# docker node rm node03
node03
重新生成令牌:docker01上:
[root@node01 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4zz7hmub1du7b9xtpc57tdo9rd74dci0ly7eaj8fmyjluvurr5-c6ccobdctfzuit8mue3zafe60 192.168.2.60:2377
上面的信息,也是告诉我们,如果想要成为manager node,可以执行上面信息中的命令。
#docker swarm join-token [manager | worker]生成令牌,可以是manager身份或worker身份。
在docker02和docker03上执行上述命令,然后再次查看节点详情:
Docker02:
[root@node02 ~]# docker swarm join --token SWMTKN-1-4zz7hmub1du7b9xtpc57tdo9rd74dci0ly7eaj8fmyjluvurr5-c6ccobdctfzuit8mue3zafe60 192.168.2.60:2377
This node joined a swarm as a manager.
Docker03:
[root@node03 ~]# docker swarm join --token SWMTKN-1-4zz7hmub1du7b9xtpc57tdo9rd74dci0ly7eaj8fmyjluvurr5-c6ccobdctfzuit8mue3zafe60 192.168.2.60:2377
This node joined a swarm as a manager.
执行完成后,其他节点也可以查看节点详情了:
[root@node03 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
pjortjrcrucuihbz6uphl8qnu node01 Ready Active Leader 18.09.0
1emp6dh2iawsgy8700fdswk5d node02 Ready Active Reachable 18.09.0
39yu0s3ykz21gcphr53j7lp1y * node03 Ready Active Reachable 18.09.0
恢复docker02和docker03为work:
直接在leader(docker01)上执行:
[root@node01 ~]# docker node demote node02
Manager node02 demoted in the swarm.
[root@node01 ~]# docker node demote node03
Manager node03 demoted in the swarm.
查看节点详情:
[root@node01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
pjortjrcrucuihbz6uphl8qnu * node01 Ready Active Leader 18.09.0
1emp6dh2iawsgy8700fdswk5d node02 Ready Active 18.09.0
39yu0s3ykz21gcphr53j7lp1y node03 Ready Active 18.09.0
当然也可以使用生成令牌的方法降级为work。(这里就不再演示了)
4.部署docker swarm集群网络:
overlay:覆盖型网络。
[root@node01 ~]# docker network create -d overlay --attachable docker
#--attachable:这个参数必须要加,否则不能用于容器。
在创建网络的时候,我们并没有部署一个存储服务,比如consul,那是因为docker swarm自带存储。
5.部署一个图形化webUI界面。
[root@node01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dockersamples/visualizer latest f6411ebd974c 11 months ago 166MB
#镜像可以通过docker下载镜像。
运行图形化webUI界面容器:
[root@node01 ~]# docker run -d -p 8080:8080 -e HOST=192.168.2.60 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualizer dockersamples/visualizer
然后可以通过浏览器访问验证:IP:8080
这样就可以很清楚的看清节点的信息及状态。
如果访问不到网页,需要开启路由转发,执行下面两条命令:
echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
sysctl -p
6.创建services:
[root@node01 ~]# docker service create --replicas 5 --network docker --name web1 -p 80 nginx:latest
#--replicas:副本数量。
大概可以理解为:一个副本等于一个容器。
查看service:
[root@node01 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
j0a5resb13r6 web1 replicated 5/5 nginx:latest *:30003->80/tcp
回到网页查看详情:
设置manager node不参加工作:
[root@node01 ~]# docker node update node01 --availability drain
node01
再次回到网页查看:
查看service信息:
[root@node01 ~]# docker service ps web1
当然还可以增加容器的数量和减少容器的数量:
增加容器:
[root@node01 ~]# docker service scale web1=8
切换网页查看:
减少容器:
[root@node01 ~]# docker service scale web1=3
总结:
Docker Swarm基础命令总结:
离开集群:
docker swarm leave
删除节点:
docker node rm node02 #这里注意,只有申请离开集群的node才可以删除。
生成令牌,可以是manager身份或worker身份:
docker swarm join-token [manager | worker]
降级为work与升级为manager:
docker node demote(降级):将swarm节点的manager降级为work
docker node promote(升级):将swarm节点的work升级为manager
Service基础命令:
查看service列表:
docker service ls
查看service信息:
docker service ps xxx
增加容器与减少容器:
docker service scale web1=8
docker service scale web1=3 #等号后接容器的数量。
设置manager node不参加工作:
docker node update node01 --availability drain
可以设置三个参数:
active"|"pause"|"drain #活跃”|“暂停”|“不工作
本博文结束,感谢观看,记得点个赞,谢谢!