Docker swarm
docker swarm集群:三剑客之一
一. Docker Swarm 的基本概念和原理
Docker Swarm 简介
Swarm是Docker公司推出的用来管理docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机。Swarm使用标准的Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(docker client in Go, docker_py, docker等)均可以直接与Swarm通信。Swarm几乎全部用go语言来完成开发,Swarm0.2发布,相比0.1版本,0.2版本增加了一个新的策略来调度集群中的容器,使得在可用的节点上传播它们,以及支持更多的Docker命令以及集群驱动。
Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受docker客户端发送过来的请求,调度适合的节点来运行容器,这意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,当Swarm重新恢复运行之后,它会收集重建集群信息.
Docker Swarm 工作原理
Docker 客户端通过 Docker API 向 Swarm 管理端发送请求,Swarm Manager 通过守护进程调用集群中的某个节点来执行任务。因为容器都是运行在节点上,Swarm 作为一个独立的集群管理工具,故并不会因某些原因导致不能正常工作而影响集群内所有节点的正常运行。当服务恢复正常后,Swarm 会读取日志来执行集群的恢复动作。架构图如图 1:
图 1.Docker Swarm 架构图
二. Docker Swarm要点
**Swarm的负载非常低。**据我观察,Swarm进行调度和通信的CPU负载非常低。因此,Swarm的管理节点(Manager)可以同时作为工作节点(Worker)。如果你需要搭建一个非常大的集群(1000+ 节点),管理节点需要更多资源,但是对于中小型集群来说,管理节点需要的资源可以忽略不计。
**Swarm集群的网络通信(服务发现,负载均衡以及容器间通信)非常可靠。**当你开启一个服务的端口之后,在Swarm集群中的任何一个节点都可以访问它。负载均衡也是由Swarm提供的。后文会提到一些之前遇到的问题,但是Docker 1.13之后,这些问题都解决了。
三. 实验环境
主机 | IP地址 | 服务 |
---|---|---|
docker01 | 192.168.1.11 | swarm+service+webUI+registry |
docker02 | 192.168.1.13 | docker |
docker03 | 192.168.1.20 | docker |
三台主机都关闭防火墙,禁用selinux,修改主机名,时间同步,并添加域名解析。
docker版本必须是:v1.12版本开始(可使用docker version查看版本)
1.关闭防火墙,禁用selinux
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# hostnamectl set-hostname docker03
[root@localhost ~]# su -
2.时间同步
mv /etc/localtime /etc/localtime.bk
cp /usr/share/zoneinfo/Asia/Shanghai/etc/localtime
3.修改主机名(三台都要)
[root@localhost ~]# hostnamectl set-hostname docker01
[root@localhost ~]# su -
4.添加域名解析
[root@docker01 ~]# echo 192.168.1.11 docker01 >> /etc/hosts
[root@docker01 ~]# echo 192.168.1.13 docker02 >> /etc/hosts
[root@docker01 ~]# echo 192.168.1.20 docker03 >> /etc/hosts
四. swarm原理
**swarm:**作用运行docker engin的多个主机组成的集群
**node:**每一个docker engin都是一个node(节点),分为manager和worker。
**manager node:**负责执行容器的编排和集群的管理工作,保持并维护swarm处于期望的状态。swarm可以有多个manager node,他们会自动协调并选举一个leader执行编排任务。但相反,不能没有manager node。
**worker node:**接受并执行由manager node派发的任务,并且默认manager node也是一个worker node,不过可以将它设置为manager-only node,让他只负责编排和管理工作。
**service:**用来定义worker上执行的命令。
基本命令操作
**docker swarm leave:**申请离开一个集群,之后查看节点状态会变成down,然后可通过manager node 将其删除
**docker node rm xxx:**删除某个节点docker swarm join-token [manager|worker]:生成令牌,可以是manager或worker身份。
docker node demote(降级):将swarm节点的为manager降级为worker
docker node promote(升级):将swarm节点的work升级为manager
**docker node ls:**查看群集的信息(只可以在manager角色的主机上查看)
docker service scale web05=6:容器的动态扩容及缩容
docker service ps web01: 查看创建的容器运行在哪些节点
docker service ls: 查看创建的服务
docker swarm leave: 脱离这个群集
docker node rm docker03: 在manager角色的服务器上移除dock