Docker Swarm概述
Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目
但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具
而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合
从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具
我们就不需要像之前一样,再配置 Etcd 或者 Consul 来进行服务发现配置了
使用docker-compose部署集群实现负载均衡的时候,我们使在一台主机上面做的,不可以动态的拉神web服务的数量
因为使用docker-compose不满足实际生产环境的要求,因此不需要使用docker-compose了
实际当中我们的web(rs)服务器是要随着业务的增加而增加的
因此使用daoker内置的swarm集群来实现
swarm要求docker-compose必须v3版本以上
swarm自带docker stack会替代docker-compose
其实docker-machine+docker-swarm,就可以实现自动部署docker和自动实现各种功能
Docker swarm的好处
可以实现:负载均衡,高可用(服务的自动迁移)动态拉神与压缩web服务器的数量
每一个节点都会拉起容器,而且都是调度器
但是监控只能在server1这个管理节点上面做
docker-machine、docker swarm、docker node、docker service 和 docker stack 常用命令要知道
实验环境
3台rhel7.3版本的虚拟机
一共三台主机:server1 server2 server3
server1是主节点(leader节点\manager节点)
(1)使用真机连接server1、server2和server3
(2)从真机给三个节点都发送一个nginx镜像
首先三台机子都必须安装docker,均有nginx的镜像
这个我之前的实验已经做过,因此直接在上面做即可,不再演示安装docker服务的过程
(3)三个节点的docker服务已经安装好,并且实验环境干净
#server1
server2
Docker Swarm 配置集群节点具体的实现过程(手动搭建swarm集群)
昨天做了docker-compose之后,发现不是很灵活,现在我们使用docker swarm来部署docker集群不使用docker-compose了
(1)部署基本的swarm集群(Docker Service 部署单个集群服务,手动搭建)
自动实现集群部署、负载均衡、高可用
(1)在server1上
server1是leader节点,因此在server1上面初始化集群
docker swarm init
(2)在server2上
server2是worker节点,将server2也加入集群当中
(3)在server3上面
server3是worker节点,将server3也加入集群当中
(4)在server1上面
docker node ls集群已经创建好了
server1是管理节点,可以看到基本的swarm集群已经搭建成功
(5)在server1、server2、server3上面
导入nginx镜像
docker images
docker tag nginx:1.16 nginx
docker images
(6)在server1上面
准备部署使用容器部署nginx集群服务
docker service --help
docker service create --help
(7)在server1、server2、server3上面
集群部署好之后三个节点上面都会出现两个自动生成的网络
docker network ls
(8)在server1上面
docker service create --name web --replicas 3 --publish 80:80 nginx
利用nginx镜像运行容器,运行三个web(副本),副本个数不限制,会平均分配给三个节点
docker service ls查看总的服务
docker service ps web查看每个web服务运行在哪个节点
docker ps查看容器的运行情况
可以看到3个web刚好负载均衡给了三个节点
可以看到运行了一个容器
(9)在server2上面
docker ps可以看到运行了一个容器
(10)在server3上面
docker ps可以看到运行了一个容器
因为有三个web副本,因此刚好三个节点各自运行一个容器
如果是六个副本,那么三个几点各自运行两个容器
其实也不完全是平均分配的
副本数量比较少的时候是平均分配的,副本数量大的时候会根据节点的资源情况分配
(11)测试
浏览器访问172.25.2.1发现负载均衡的效果不是很明显
(12)在server1、server2、server3上面
#在server1
[root@server1 ~]# vim index.html
<h1>server1</h1>
[root@server1 ~]# docker container cp index.html cd39f9053551:/usr/share/nginx/html
[root@server1 ~]# cat index.html
<h1>server1</h1>
#在server2
[root@server2 ~]# vim index.html
[root@server2 ~]# cat index.html
<h1>server2</h1>
[root@server2 ~]# docker container cp index.html ba3def5d9003:/usr/share/nginx/html
#在server3
[root@server3 ~]# vim index.html
[root@server3 ~]# cat index.html
<h1>server3</h1>
[root@server2 ~]# docker container cp index.html 5a3def5d9003:/usr/share/nginx/html
测试:
[root@foundation10 Desktop]# curl 172.25.10.1
<h1>server3</h1>
[root@foundation10 Desktop]# curl 172.25.10.1
<h1>server2</h1>
[root@foundation10 Desktop]# curl 172.25.10.1
<h1>server1</h1>
(13)在真机上面验证负载均衡
[root@foundation70 Desktop]# for i in {1..10};do curl 172.25.10.1;done #测试的另一种方法,循环10次
[root@foundation70 Desktop]# for i in {1..10}; do curl http://172.25.2.2; done
[root@foundation70 Desktop]# for i in {1..10}; do curl http://172.25.2.3; done
总结:以上就实现了使用命令搭建swarm集群
##(2)swarm集群中对运行web服务个数的拉伸
######(1)在server1上面:拉伸副本的个数
[root@server1 ~]# docker service ls
[root@server1 ~]# docker service ps web
[root@server1 ~]# docker service scale web=6 #由原来的三个拉伸到6台
[root@server1 ~]# docker service ps web 查看运行的容器个数,刚好两个web容器
(2)在server2上面
docker ps刚好两个web容器
(3)在server3上面
docker ps刚好两个web容器
(4)在真机上面
[root@foundation70 Desktop]# for i in {1..10};do curl 172.25.10.1;done #测试的另一种方法,循环10次
[root@foundation70 Desktop]# for i in {1..10}; do curl http://172.25.2.2; done
[root@foundation70 Desktop]# for i in {1..10}; do curl http://172.25.2.3; done
和刚才的相比,发现有默认发布页面,因为加入了新的web服务器
#缩减
[root@server1 ~]# docker service scale web=3
测试
[root@server1 ~]# docker service ps web #按顺序缩减
以上实现了基本的拉神,缩减也是这个道理
(3)实现利用监控页面监控集群中各个节点容器的运行情况(含缩减和拉伸)
利用图形监控更加直观形象
(1)从真机给server1拷贝一个监控镜像并且导入
注意:这个镜像只需要给管理节点(server1)即可
(2)在server1上面拉起监控的这个容器
[root@server1 ~]# 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
可以看到server1上面的监控容器正在运行
(3)直接在浏览器里面访问
(4)在server1上面
docker servcie scale web=10拉神web服务的个数,其实就是增多容器的个数
free -m 可以查看一下三个节点的宿主机内存是否够用
(5)在浏览器里面进行查看
注意:不管为web的个数是多少,管理节点(自身也是worker节点)都会根据三个worker节点的资源使用情况合理分配
并不一定是平均分配的,这一点一定要注意,因此说实现了负载均衡、高可用等等
还有就是集群中的每个节点都应该有拉起容器的镜像,因为每个节点都有承担任务的可能性
(6)在server1上面
docker servcie scale web=5缩减web个数
可以看到server1上面运行了一个web容器
server2上运行了两个web容器
server3上运行了两个web容器
(7)在浏览器里面查看
(4)服务的滚动更新
拉神一下刚才web的个数
从真机给三个节点发送服务的镜像
给三个节点导入镜像并且查看
在server1上开始更新服务
更新策略:5s更新一次,一次更新两个
[root@server1 ~]# docker service update --update-parallelism 5 --update-delay 2s --image game2048 web #5个一起更新,隔2s更新一次;
过一会在浏览里面查看,发现已经更新完毕,全部由nginx服务变为game2048服务
这10个容器本来运行的是nginx服务,现在运行的是game2048小游戏
可能就是刚才的10个容器已经释放,重新拉起来10个容器
注意:每个节点的镜像一定要到位
刷新,容器id一直在变化,这个更能看出负载均衡的效果