一、Swarm
前文的学习都是针对docker单机环境下,进行简单的认识与了解,那么如果是docker集群环境下又是怎么管理呢?这时候就需要一个容器的编排技术,docker中默认是实现了swarm技术,用来管理docker集群环境下的容器,同时还可以使用Kubernetes(k8s,也就是后续将要学习的新的容器编排技术)
可以通过docker swarm --help指令来查看当前的一个帮助文档
在swarm集群中有两个部分组成:
管理节点:主要负责整个集群的管理工作,比如集群的配置以及服务的管理等
工作节点:主要负责运行相应的任务
二、Demo
我们先准备好三台安装了docker的机器,此时他们都是独立节点,此时我们需要通过swarm技术来对他们进行统一的管理操作。
首先通过init命令来初始化一个swarm环境
docker swarm init
此时根据输出结果,可以在另外两个节点上执行如下命令,就可以另外两个节点添加到当前节点的管理之下
docker swarm join --token SWMTKN-1-4188ptlhc1ewkh74h8ff1jvx0r6eqvdx07bmjj2e706bgkc61a-6lk0xvql1s4yofjo44oe8yo7b 192.168.0.10:2377
在docker中有个node命令,这个命令就是用来管理docker集群中的每个节点,也就是说docker集群中每一个docker节点都可以看做是一个node节点,通过manager来统一进行管理,docker node这个命令只有manage节点才可以运行
既然swarm是用来建立集群,node是用来管理集群中的每个节点,那么docker service就是用来管理集群中的任务,也就是具体客户所关心的应用。
我们以Nginx为例,在docker进群中去部署Nginx实例,实例目的是在集群中动态的添加、删除Nginx的节点。
首先我们需要创建一个overlay类型的网络,这是实现docker集群中的通信。
此时,我们需要用到docker service 命令来创建Nginx实例,其帮助文档如下
我们先创建只有一个Nginx服务
docker service create --replicas 1 --network my-nginx -p 80:80 --name mynginx nginx
此时在我们的manage节点中就已经创建好了一个服务,此时我们想扩节点,可以使用期scale命令
docker service scale mynginx=4
此时,我们发现在192.168.0.11这个节点上部署了两个服务
此时我们来模拟宕机操作,我们来关闭.11这个节点
此时我们发现在10和12机器上分别部署了两个。如果我们关闭12上的两个容器,并启动11的容器,此时发现,11和12分别运行着一个服务
我们再做一个实验,只保留一个服务在容器中,如下所示,只有manage节点中运行着Nginx实例
此时,我们访问http://192.168.0.10/可以成功访问
当我们继续用http://192.168.0.11/和http://192.168.0.12/访问时同样可以成功访问,说明在swarm底层给我们做了一层负载均衡,也就是我们可以通过访问集群中任意一节点就可以正确的定向到实例中。
注意: 集群之间通信时采用overlay的网络模式,其中涉及到端口的访问问题比如集群管理通信:TCP,端口2377 和节点通信:TCP和UDP,端口7946 以及UDP,端口4789 overlay驱动,所以在做配置的时候记得开启对应的端口,或者关闭防火墙
既然我们可以动态的扩容,那么swarm的一种机制是什么呢?
- spread:默认方式,也就是均匀的分布到每个节点
- binback:尽量使用某一个节点
- random:随机模式
三、总结
本文简单介绍了docker swarm技术,后续将重点学习Kubernetes的容器编排技术。
以上,有任何不对的地方请指正,谢谢!