Docker Swarm更确切地说应该称为Swarm Mode。在Docker 1.12.0之前Docker Swarm是一个单独的项目,要想使用Docker Swarm需要单独安装。Docker 1.12.0 及后续版本Docker Swarm集成到Docker Engine中,所以安装了Docker,只要使用docker swam命令初始化host或者加入host到集群,docker就启动了SwarmMode模式了。另外我们也不需要安装外部的服务发现及配置管理系统了(比如zookeeper、consul、etcd等),可以说更加方便了。这里我们暂且就叫它Docker Swarm了。
Docker Swarm包含以下重要的内容:
docker swarm:集群管理
docker node:节点管理
docker service:服务管理
在开始之前,我们需要了解一些基本概念:
Cluster
顾名思义cluster是集群的意思,所以说这里Docker Swarm管理的是Docker Host集群。Cluster并不是简单的把一堆Host堆在一起就称为集群了。集群是为了使提高资源的利用率,使之利用率最大化。集群一般要求高可用、可以负载均衡,而且管理应用也方便。用户不需要关注资源如何使用,集群本身就会搞定这些事情。
Nodes
Node表示加入Swarm集群中的一个Docker Engine实例,基于该Docker Engine可以创建并管理多个Docker容器。其中,最开始创建Swarm集群的时候,Swarm Manager便是集群中的第一个Node。在所有的Node中,又根据其职能划分为Manager Node和Worker Node:
(1)Manager Node
Manager Node负责调度Task,一个Task表示要在Swarm集群中的某个Node上启动Docker容器,一个或多个Docker容器运行在Swarm集群中的某个Worker Node上。同时,Manager Node还负责编排容器和集群管理功能(或者更准确地说,是具有Manager管理职能的Node),维护集群的状态。需要注意的是,默认情况下,Manager Node也作为一个Worker Node来执行Task。Swarm支持配置Manager只作为一个专用的管理Node,后面我们会详细说明。
(2)Worker Node
Worker Node接收由ManagerNode调度并指派的Task,启动一个Docker容器来运行指定的服务,并且Worker Node需要向Manager Node汇报被指派的Task的执行状态。
Services and Tasks
根据上图描绘的,Swarm中部署的最小粒度是service,其下才是容器。可以理解为可以批量的部署应用。当create service时,Manager Node就会分配task给可用的Worker Node去启动container。
Docker Swarm具有如下基本特性:
集群管理集成进Docker Engine
使用内置的集群管理功能,我们可以直接通过Docker CLI命令来创建Swarm集群,然后去部署应用服务,而不再需要其它外部的软件来创建和管理一个Swarm集群。
去中心化设计
Swarm集群中包含Manager和Worker两类Node,可以直接基于DockerEngine来部署任何类型的Node。而且在Swarm集群运行期间,我们可以对其作出任何改变,实现对集群的扩容和缩容等,如添加Manager Node,如删除Worker Node,而做这些操作不需要暂停或重启当前的Swarm集群服务。
声明式服务模型(Declarative Service Model)
在我们实现的应用栈中,Docker Engine使用了一种声明的方式,让我们可以定义我们所期望的各种服务的状态,例如,我们创建了一个应用服务栈(stack):一个Web前端服务、一个后端数据库服务、Web前端服务又依赖于一个消息队列服务。
服务扩容缩容
对于我们部署的每一个应用服务,我们可以通过命令行的方式,设置启动多少个Docker容器去运行它。已经部署完成的应用,如果有扩容或缩容的需求,只需要通过命令行指定需要几个Docker容器即可,Swarm集群运行时便能自动地、灵活地进行调整。
协调预期状态与实际状态的一致性
Swarm集群Manager Node会不断地监控集群的状态,协调集群状态使得我们预期状态和实际状态保持一致。例如我们启动了一个应用服务,指定服务副本为10,则会启动10个Docker容器去运行,如果某个Worker Node上面运行的2个Docker容器挂掉了,则Manager Node会选择集群中其它可用的Worker Node,并创建2个服务副本,使实际运行的Docker容器数仍然保持与预期的10个一致。
滚动更新(Rolling Update)
对于服务需要更新的场景,我们可以在多个Node上进行增量部署更新,Manager Node支持通过使用Docker CLI设置一个delay时间间隔,实现多个服务在多个Node上依次进行部署。这样可以非常灵活地控制,如果有一个服务更新失败,则暂停后面的更新操作,重新回滚到更新之前的版本。
多主机网络
我们可以为待部署应用服务指定一个Overlay网络,当应用服务初始化或者进行更新时,Manager Node在给定的Overlay网络中为Docker容器自动地分配IP地址,实际是一个虚拟IP地址(VIP)。
服务发现
Manager Node会给集群中每一个服务分配一个唯一的DNS名称,对运行中的Docker容器进行负载均衡。我们可以通过Swarm内置的DNS Server,查询Swarm集群中运行的Docker容器状态。
负载均衡
在Swarm内部,可以指定如何在各个Node之间分发服务容器(Service Container),实现负载均衡。如果想要使用Swarm集群外部的负载均衡器,可以将服务容器的端口暴露到外部。
安全策略
在Swarm集群内部的Node,强制使用基于TLS的双向认证,并且在单个Node上以及在集群中的Node之间,都进行安全的加密通信。我们可以选择使用自签名的根证书,或者使用自定义的根CA(Root CA)证书。
后面我们通过实践一步步体会Swarm的这些特性。
领取专属 10元无门槛券
私享最新 技术干货