什么是DockerSwarm
Swarm是Docker公司推出的用来管理docker集群的平台,几乎全部用GO语言来完成的开发的,代码开源在https://github.com/docker/swarm, 它是将一群Docker宿主机变成一个单一的虚拟主机,Swarm使用标准的Docker API接口作为其前端的访问入口,换言之,各种形式的Docker
Client(compose,docker-py等)均可以直接与Swarm通信,甚至Docker本身都可以很容易的与Swarm集成,这大大方便了用户将原本基于单节点的系统移植到Swarm上,同时Swarm内置了对Docker网络插件的支持,用户也很容易的部署跨主机的容器集群服务。
Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。
从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,我们就不需要像之前一样,再配置 Etcd 或者 Consul 来进行服务发现配置了。
Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受Docker客户端发来的请求,调度适合的节点来运行容器,这就意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,放Swarm重新恢复运行之后,他会收集重建集群信息。
Swarm工作模式
官方介绍:https://docs.docker.com/engine/swarm/how-swarm-mode-works/nodes/
Docker Engine 1.12引入了swarm模式,使您可以创建一个或多个Docker Engine集群,称为swarm。一个群集由一个或多个节点组成:以群集模式运行Docker Engine 1.12或更高版本的物理机或虚拟机。
所有操作都在Manger上,Worke只是负责工作
10台以上的集群,建议使用 K8S;
10台一下的集群,建议使用 Swarm。
manager是中心管理节点,各个node上运行agent接受manager的统一管理,集群会自动通过Raft协议分布式选举出manager节点,无需额外的发现服务支持,避免了单点的瓶颈问题,同时也内置了DNS的负载均衡和对外部负载均衡机制的集成支持
一、Node
二、Service
三、任务与调度
四、服务副本与全局服务
环境准备
一、配置并启动系统
通过VMware启动四台Centos7系统,其Ip分别为图中所示:
四台虚拟机的配置都是如下:
二、修改主机名
- IP:192.168.0.103 主机名:manager103 担任角色:swarm manager
- IP:192.168.0.104 主机名:manager104担任角色:swarm manager
- IP:192.168.0.106 主机名:node106 担任角色:swarm node
- IP:192.168.0.107 主机名:node107 担任角色:swarm node
1) 修改主机名
# 192.168.0.103 主机上执行
[root@centosTest ~]# hostnamectl set-hostname manager103
# 192.168.0.104 主机上执行
[root@centosTest ~]# hostnamectl set-hostname manager104
# 192.168.0.106 主机上执行
[root@centosTest ~]# hostnamectl set-hostname note106
# 192.168.0.107 主机上执行
[root@centosTest ~]# hostnamectl set-hostname note107
三 、设置防火墙
设置所有系统的防火墙上依次放行2377/tcp(管理端口)、7946/udp(节点间通信端口)、4789/udp(overlay 网络端口)端口。
# 开启防火墙端口
$ firewall-cmd --zone=public --add-port=2377/tcp --permanent
$ firewall-cmd --zone=public --add-port=7946/tcp --permanent
$ firewall-cmd --zone=public --add-port=7946/udp --permanent
$ firewall-cmd --zone=public --add-port=4789/udp --permanent
# 重启防火墙生效
$ systemctl restart firewalld
# 查看开放的端口
$ firewall-cmd --list-ports
四台系统安装Docker
使用 MobaXterm 工具操作 SSH,笔者这里使用的是免费版。
安装好 MobaXterm 后,启动四台Centos7会话
启动同步键盘操作
可以在多个窗口展示相同命令操作
Docker安装教程,请参考此处:
安装Docker后,必须配置Docker的镜像加速,笔者这里墙裂推荐选择阿里云镜像加速
检查四台Centos7系统是否安装Docker成功
$ docker version
Swarm使用方式
命令 | 描述 |
docker swarm | 集群管理,子命令有init, join, leave, update。(docker swarm –help查看帮助) |
docker service | 服务创建,子命令有create, inspect, update, remove, tasks。(docker service–help查看帮助) |
docker node | 节点管理,子命令有accept, promote, demote, inspect, update, tasks, ls, rm。(docker node –help查看帮助) |
docker swarm join-token manager | 创建管理节点 |
docker swarm join-token worker | 创建工作节点 |
搭建Swarm集群
一、创建管理节点
[root@manager103 ~]# docker swarm init --advertise-addr 192.168.0.103
[root@manager103 ~]# docker swarm join-token manager
[root@manager104 ~]# docker swarm join --token SWMTKN-1-1kq7dkd0bgnnfaoyd6l521tlvu5w6kbt24y832q6s9nz8d0q2k-0t26bqb4u285ia3s2w1a9rtfy 192.168.0.103:2377
二、创建工作节点
工作节点106设置
[root@node106 ~]# docker swarm join --token SWMTKN-1-1kq7dkd0bgnnfaoyd6l521tlvu5w6kbt24y832q6s9nz8d0q2k-dgr8g9p67pvepuq7fur03g7ld 192.168.0.103:2377
工作节点107设置
[root@node107 ~]# docker swarm join --token SWMTKN-1-1kq7dkd0bgnnfaoyd6l521tlvu5w6kbt24y832q6s9nz8d0q2k-dgr8g9p67pvepuq7fur03g7ld 192.168.0.103:2377
三、查看集群启动状况
[root@manager103 ~]# docker node ls
四、更改节点状态
swarm集群中node的availability状态可以为 active或者drain,其中:
active状态下,node可以接受来自manager节点的任务分派;
drain状态下,node节点会结束task,且不再接受来自manager节点的任务分派(也就是下线节点)
[root@manager103 ~]# docker node update --availability drain node104 # 将node104节点下线。如果要删除node104节点,命令是"docker node rm --force node104"
如上,当node104的状态改为drain后,那么该节点就不会接受task任务分发,就算之前已经接受的任务也会转移到别的节点上。
再次修改为active状态(及将下线的节点再次上线)
[root@manager103 ~]# docker node update --availability active node104
Raft协议
Raft协议:保证大多数节点存活才可以用。只要 > 1,集群至少大于等于3台!
体验Swarm
一、启动服务
# 在管理节点,执行服务排列
[root@manager103 /]# docker service create -p 8888:80 --name my-nginx nginx
docker run 容器启动,不具有扩缩容器!
docker service 集群服务,具有扩缩容器,滚动更新!
设置集群副本数量
动态扩缩容
# 设置集群副本数量一共10个
$ docker service update --replicas 10 my-nginx
# 简写
$ docker service scale my-nginx=10
二、查看服务启动概况
# 查看集群服务下,指定容器服务
$ docker service ps my-nginx
# 查看集群服务下,所有服务
$ docker service ls
集群中任意的节点都可以访问。服务可以有多个副本动态扩缩容实现高可用!
三、页面访问测试
四、移除集群服务
[root@manager103 /]# docker service rm my-nginx
概念总结
一、Swarm
集群的管理和编排是使用嵌入docker引擎的SwarmKit,可以在docker初始化时启动swarm模式或者加入已存在的swarm
二、Node
一个节点是docker引擎集群的一个实例。您还可以将其视为Docker节点。您可以在单个物理计算机或云服务器上运行一个或多个节点,但生产群集部署通常包括分布在多个物理和云计算机上的Docker节点。
要将应用程序部署到swarm,请将服务定义提交给 管理器节点。管理器节点将称为任务的工作单元分派 给工作节点。
Manager节点还执行维护所需群集状态所需的编排和集群管理功能。Manager节点选择单个领导者来执行编排任务。
工作节点接收并执行从管理器节点分派的任务。默认情况下,管理器节点还将服务作为工作节点运行,但您可以将它们配置为仅运行管理器任务并且是仅管理器节点。
代理程序在每个工作程序节点上运行,并报告分配给它的任务。工作节点向管理器节点通知其分配的任务的当前状态,以便管理器可以维持每个工作者的期望状态。
三、Service
一个服务是任务的定义,管理机或工作节点上执行。它是群体系统的中心结构,是用户与群体交互的主要根源。创建服务时,你需要指定要使用的容器镜像。
四、Task
任务是在docekr容器中执行的命令,Manager节点根据指定数量的任务副本分配任务给worker节点