Docker学习笔记-5 创建Swarm集群
Swarm集群简介:
-
创建三台虚拟机,用virtualBox安装CentOS系统,这里我用的是CentOS7 minimal版,只有900多M。
安装好后,三台虚拟机的IP是:
192.168.56.101
192.168.56.102
192.168.56.103
后面的文章中就用101、102、103代替。 -
在三台虚拟机中安装docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
- 启动docker服务
systemctl start docker
- 检查docker是否可用
docker run hello-world
结果如下:

上面是运行了一个镜像"hello-world",这个镜像是docker仓库中的,如果本地没有会下载下来。
5. 设置docker服务开机启动
systemctl enable docker
Ok,至此,我们三台docker服务器就准备好了,接下来我们创建Swarm集群。这里我用到的是镜像是之前自己创建的demo:1镜像,大家也可以用自己定义的镜像,或者docker仓库中已经有的镜像。关于自定义镜像可以看这篇文章:https://www.cnblogs.com/hucat/articles/15507110.html
我这个demo:1镜像是一个springboot项目,对外提供一个http接口,在创建集群之前我先把三台docker里的demo:1镜像运行起来,看看是否正常,在三台docker服务器上执行命令来启动容器:
docker run -p 8090:8080 -d demo:1
我们在物理机上访问一下虚拟机java服务,看看服务是否正常:

看到三个服务都是正常的。
在创建集群之前我们最好修改一下主机名,这样在创建好集群后,方便定位node对应哪台机器。
我们开始搭建Swarm集群,这里我们在101这台机器上创建集群,102和103加入:
在101上执行命令:
docker swarm init --advertise-addr 192.168.56.101
看到以下结果就是成功了:

这里集群就创建好了,其中101是管理节点,需要把102和103加入进来,当作worker节点,在102和103上执行命令:
docker swarm join --token SWMTKN-1-56zsi0rbm4zdunx2phwk4l6xyo8ze6vte2q86fzzrzjk9swxms-3o150etla0bilqelrq3a019rp 192.168.56.101:2377
这样就加入到集群中了,现在集群中有3台机器,可以用以下命令查看集群中的节点:
docker node ls
结果如下:

节点可以加入集群了,那么退出集群用什么命令呢,在worker节点用执行下面命令即可退出:
docker swarm leave
如果在manager节点执行上面的命令,会有警告,如果忽略警告退出的话,会解散当前集群。
警告信息:

忽略警告:
docker swarm leave --force
这样集群就解散了。
我们说回刚才创建好集群的时候,接下来我们创建service,service是swarm中的一个概念,可以理解为swarm集群做的事,现在我们创建好了swarm集群,但是它还没有事可做,我们来创建一个service让它有事可做。创建service在manager节点执行命令就可以:
docker service create --name demo_java -p 8090:8080 --replicas 1 demo:1
- --name demo_java,表示当前service的名称叫demo_java
- -p 8090:8080 是容器和宿主机的端口映射,宿主机端口:容器端口
- --replicas 1 是指当前service要用到几个node,我们集群中有3个node,这里只用一个,也可以指定为2或者3
- demo:1 这里最后的参数是镜像名称
我们在三台机器上查看运行的容器,来看看这个service被分配到哪台node上了:
docker ps

可以看到这个任务分配给centos3这台机器了。
看到这里,聪明的小伙伴已经能对service这个概念有一个初步的认识了。我们没有集群的时候,要想运行一个容器,在docker服务器上运行docker run 镜像名即可。当我们创建了一个swarm集群时,想要运行一个容器,就不能用这个命令了。需要用service概念,docker service命令是在集群中的manager节点上执行的,管理节点会分配给当前service需要的节点数,来创建容器,运行镜像。
当我们要访问我们的java接口时,也不需要知道集群中有多少个node,只访问manager节点的端口即可。
curl http://192.168.56.101:8090/a/1
可以看到结果:

这里虽然我们的容器是运行在centos3上面的,但是我们访问centos1,也可以正确拿到结果,因为swarm帮我们负载了。
现在我们把service节点扩容3个:
docker service scale demo_java=3
- scale 就是调整服务节点的意思,后面跟服务名=节点数
结果:

这样就是扩容成功了。我们来看一下,都运行在哪些节点上:
docker service ps demo_java
结果:

只需要看DESIRED STATE的值是Running的即可,当前就是在centos1、centos2、centos3各运行了一个容器,这样我们就可以实现动态扩容缩容了。如果3个节点不够用也可以使用docker swarm join命令来加入新docker节点。这样服务扩容和docker集群扩容都可以实现了。
如果manager节点挂了怎么办?
为了高可用,我们不能只设置一个manager节点,swarm支持设置多个备用manager节点。
我们来看一下目前节点的状态:
docker node ls

只有一个leader,其他两个都是worker。
我们使用下面命令对node升级:
#升级
docker node promote 节点主机名
#降级
docker node demote 节点主机名
将centos2升级为备用管理节点:
docker node promote centos2
再次查看,发现centos2的MANAGER STATUS已经变成"Reachable"了:

这时,如果centos1挂了,centos2可以做和centos1一样的事。
我们可以测试以下centos2是否能也和centos1一样能负载服务,我们把service的节点数降为1
docker service scale demo_java=1
查看当前运行在哪个节点上:
docker service ps demo_java

运行在centos3上,正是我们想要的结果,如果不是的话,可以指定运行到centos3上,swarm如何指定运行节点?可以参考这篇文章:https://blog.nowcoder.net/n/6863fb62b9584bbbaa511274cc8dc5ad
服务是运行在centos3上的,这时我们访问centos1和centos2,看看能否正常访问:

也是可以正常访问的,说明centos2也是管理节点了。
我们再来测试一下,当一个节点挂了,会不会影响服务,因为当前服务只配置了一个节点,我们把这个centos3节点关机(kill掉docker不行,docker是有守护进程的,kill掉又会启一个新的,所以我们直接关机)。
再查看服务运行在哪个节点上:
docker service ps demo_java
结果:

这时服务自动切换到centos2上面运行了。看来是可以实现自动切换节点的。
以上就是docker swarm集群的所有内容了,有问题欢迎在评论区留言讨论。

浙公网安备 33010602011771号