Share feedback
Answers are generated based on the documentation.

Swarm 模式关键概念

本主题介绍 Docker Engine 1.12 中集群管理和编排功能特有的一些概念。

什么是 swarm?

Docker Engine 中内置的集群管理和编排功能是使用 swarmkit 构建的。Swarmkit 是一个独立项目,实现了 Docker 的编排层,并直接在 Docker 中使用。

一个 swarm 由多个运行在 Swarm 模式的 Docker 主机组成,这些主机充当管理节点(manager)和工作节点(worker)。管理节点负责成员管理和任务委派,工作节点负责运行 swarm 服务。一个 Docker 主机可以同时是管理节点和工作节点,也可以只承担其中一种角色。创建服务时,您需要定义其理想状态——副本数量、可用的网络和存储资源、服务对外暴露的端口等。Docker 会努力维持这一期望状态。例如,如果某个工作节点不可用,Docker 会将该节点上的任务调度到其他节点。任务(task)是 swarm 服务中的一个运行中的容器,由 swarm 管理节点管理,这与独立容器(standalone container)不同。

swarm 服务相比独立容器的一个关键优势是:您可以修改服务的配置(包括其连接的网络和卷),而无需手动重启服务。Docker 会自动更新配置,停止配置过时的服务任务,并创建符合新配置的新任务。

当 Docker 运行在 Swarm 模式时,您仍然可以在 swarm 中的任意 Docker 主机上运行独立容器和 swarm 服务。独立容器与 swarm 服务的一个关键区别是:只有 swarm 管理节点可以管理 swarm,而独立容器可以在任意 Docker 守护进程上启动。Docker 守护进程可以作为管理节点、工作节点,或同时承担两种角色参与 swarm。

与使用 Docker Compose 定义和运行容器类似,您也可以定义和运行 Swarm 服务栈。

继续阅读以了解与 Docker swarm 服务相关的概念,包括节点、服务、任务和负载均衡。

节点

节点(node)是参与 swarm 的 Docker engine 实例,也可以称为 Docker 节点。您可以在单个物理计算机或云服务器上运行一个或多个节点,但生产环境中的 swarm 部署通常会将 Docker 节点分布在多个物理和云机器上。

要将应用程序部署到 swarm,您需要向管理节点提交服务定义。管理节点会将称为 任务 的工作单元分发给工作节点。

管理节点还执行编排和集群管理功能,以维持 swarm 的期望状态。管理节点会选举出一个领导者来执行编排任务。

工作节点接收并执行管理节点分派的任务。默认情况下,管理节点也会作为工作节点运行服务,但您可以配置它们仅运行管理任务,成为纯管理节点。每个工作节点上都运行一个代理(agent),用于报告分配给它的任务。工作节点会向管理节点通知其分配任务的当前状态,以便管理节点维持每个工作节点的期望状态。

服务与任务

服务(service)是在管理节点或工作节点上执行的任务的定义。它是 swarm 系统的核心结构,也是用户与 swarm 交互的主要入口。

创建服务时,您需要指定要使用的容器镜像以及在运行中的容器内执行的命令。

复制服务模型(replicated services)中,swarm 管理节点会根据期望状态中设置的规模,将特定数量的副本任务分配给各个节点。

对于全局服务(global services),swarm 会在集群中每个可用节点上为服务运行一个任务。

任务(task)包含一个 Docker 容器和要在容器内运行的命令。它是 swarm 的原子调度单元。管理节点根据服务规模中设置的副本数量,将任务分配给工作节点。一旦任务被分配给某个节点,它就不能迁移到其他节点,只能在分配的节点上运行或失败。

负载均衡

swarm 管理节点使用入口负载均衡(ingress load balancing)来暴露您希望 swarm 外部访问的服务。swarm 管理节点可以自动为服务分配一个发布端口,您也可以手动配置服务的发布端口。您可以指定任意未使用的端口。如果不指定端口,swarm 管理节点会为服务分配一个 30000-32767 范围内的端口。

外部组件(如云负载均衡器)可以通过集群中任意节点的发布端口访问服务,无论该节点当前是否运行该服务的任务。swarm 中的所有节点都会将入口连接路由到运行中的任务实例。

Swarm 模式有一个内部 DNS 组件,会自动为 swarm 中的每个服务分配一个 DNS 条目。swarm 管理节点使用内部负载均衡,根据服务的 DNS 名称在集群内的服务之间分发请求。

下一步