一、简介
- Docker Swarm提供Docker容器集群服务,是Docker官方对容器云生态进行支持的核心方案。使用它,用户可以将多个Docker主机抽象为大规模的虚拟Docker服务,快速打造一套容器云平台。
- 作为容器集群管理器,Swarm最大的优势之一就是原生支持Docker API,给用户使用带来极大的便利。各种基于标准API的工具比如Compose、Docker SDK、各种管理软件,甚至Docker本身等都可以很容易的与Swarm进行集成。这大大方便了用户将原先基于单节点的系统移植到Swarm上。同时Swarm内置了对Docker网络插件的支持,用户可以很容易地部署跨主机的容器集群服务。
- Swarm也采用了典型的“主从”结构,通过Raft协议来在多个管理节点(Manager)中实现共识。工作节点(Worker)上运行agent接受管理节点的统一管理和任务分配。用户提交服务请求只需要发给管理节点即可,管理节点会按照调度策略在集群中分配节点来运行服务相关的任务。

在Swarm V2中,集群中会自动通过Raft协议分布式选举出Manager节点,无须额外的发现服务支持,避免了单点瓶颈。同时,V2中内置了基于DNS的负载均衡和对外部负载均衡机制的集成支持。
二、Swarm 中重要的概念
Swarm集群
Swarm集群(Cluster)为一组被统一管理起来的Docker主机。集群是Swarm所管理的对象。这些主机通过Docker引擎的Swarm模式相互沟通,其中部分主机可能作为管理节点(manager)响应外部的管理请求,其他主机作为工作节点(worker)来实际运行Docker容器。当然,同一个主机也可以即作为管理节点,同时作为工作节点。
当用户使用Swarm集群时,首先定义一个服务(指定状态、复制个数、网络、存储、暴露端口等),然后通过管理节点发出启动服务的指令,管理节点随后会按照指定的服务规则进行调度,在集群中启动起来整个服务,并确保它正常运行。
- 节点
节点(Node)是Swarm集群的最小资源单位。每个节点实际上都是一台Docker主机。
Swarm集群中节点分为两种:
- 管理节点(manager node):负责响应外部对集群的操作请求,并维持集群中资源,分发任务给工作节点。同时,多个管理节点之间通过Raft协议构成共识。一般推荐每个集群设置5个或7个管理节点;
- 工作节点(worker node):负责执行管理节点安排的具体任务。默认情况下,管理节点自身也同时是工作节点。每个工作节点上运行代理(agent)来汇报任务完成情况。
用户可以通过docker node promote命令来提升一个工作节点为管理节点;或者通过docker node demote命令来将一个管理节点降级为工作节点。
- 服务
服务(Service)是Docker支持复杂多容器协作场景的利器。
一个服务可以由若干个任务组成,每个任务为某个具体的应用。服务还包括对应的存储、网络、端口映射、副本个数、访问配置、升级配置等附加参数。
一般来说,服务需要面向特定的场景,例如一个典型的Web服务可能包括前端应用、后端应用,以及数据库等。这些应用都属于该服务的管理范畴。
Swarm集群中服务类型也分为两种(可以通过-mode指定):
- 复制服务(replicated services)模式:默认模式,每个任务在集群中会存在若干副本,这些副本会被管理节点按照调度策略分发到集群中的工作节点上。此模式下可以使用-replicas参数设置副本数量;
- 全局服务(global services)模式:调度器将在每个可用节点都执行一个相同的任务。该模式适合运行节点的检查,如监控应用等。
- 任务
任务是Swarm集群中最小的调度单位,即一个指定的应用容器。例如仅仅运行前端业务的前端容器。任务从生命周期上将可能处于创建(NEW)、等待(PENDING)、分配(ASSIGNED)、接受(ACCEPTED)、准备(PREPARING)、开始(STARTING)、运行(RUNNING)、完成(COMPLETE)、失败(FAILED)、关闭(SHUTDOWN)、拒绝(REJECTED)、孤立(ORPHANED)等不同状态。
Swarm集群中的管理节点会按照调度要求将任务分配到工作节点上。例如指定副本为2时,可能会被分配到两个不同的工作节点上。一旦当某个任务被分配到一个工作节点,将无法被转移到另外的工作节点,即Swarm中的任务不支持迁移。
- 服务的外部访问
Swarm集群中的服务要被集群外部访问,必须要能允许任务的响应端口映射出来。Swarm中支持入口负载均衡(ingress load balancing)的映射模式。该模式下,每个服务都会被分配一个公开端口(PublishedPort),该端口在集群中任意节点上都可以访问到,并被保留给该服务。
当有请求发送到任意节点的公开端口时,该节点若并没有实际执行服务相关的容器,则会通过路由机制将请求转发给实际执行了服务容器的工作节点。
