注意事项
Swarm 模式是用于管理 Docker 守护进程集群的一项高级特性。如果你打算将 Swarm 用作生产运行时环境,那就使用 Swarm 模式。如果你不打算使用 Swarm 进行部署,可改用 Docker Compose。如果正在为 Kubernetes 部署进行开发,可以考虑使用 Docker Desktop 中集成的 Kubernetes 功能。
Docker 包含 Swarm(集群) 模式,可用于对称为 “swarm” 的 Docker 引擎集群进行原生管理。使用 Docker 命令行界面(CLI)来创建一个 swarm 集群、向 swarm 集群部署应用服务以及管理 swarm 的行为。Docker Swarm 模式内置于 Docker 引擎中。不要将 Docker Swarm 模式与已不再积极开发的 Docker Classic Swarm 相混淆。
Docker Swarm特性亮点
与 Docker 引擎集成的集群管理
使用 Docker 引擎命令行界面(CLI)创建由 Docker 引擎组成的 swarm 集群,在此集群中可以部署应用服务。无需额外的编排软件来创建或管理 swarm 集群。
去中心化设计
Docker 引擎在运行时处理节点角色的专业化问题,而不是在部署时处理节点角色的区分。使用 Docker 引擎部署两种类型的节点,即管理节点和工作节点。这意味着可以从单个磁盘镜像构建整个 swarm 集群。
去中心化设计是Docker Swarm集群中的一个核心概念。在去中心化的设计中,每个节点都参与管理集群状态,没有单独的“中心”节点。这样做的好处是,如果一个管理节点失效,其它的节点可以接管工作,维护整个集群的服务。
在Docker Swarm集群中,节点被分为管理节点(Manager)和工作节点(Worker)。管理节点负责集群的管理和调度,而工作节点仅执行任务。
声明式服务模型
Docker 引擎采用声明式方法,让能够定义应用栈中各个服务的期望状态。例如,描述一个由带有消息队列服务的 Web 前端服务和数据库后端组成的应用程序。
扩展
对于每个服务,你可以声明要运行的任务数量。当进行扩展或收缩时,swarm 管理器会通过自动添加或删除任务来维持期望状态。
期望状态协调
swarm 管理器节点会持续监控集群状态,并协调实际状态与你所设定的期望状态之间的任何差异。例如,如果设置一个服务运行某个容器的 10 个副本,而承载其中两个副本的工作机器崩溃了,管理器会创建两个新的副本以替换崩溃的副本,并将新副本分配给正在运行且可用的工作节点。
多主机网络
可以为服务指定一个覆盖网络。swarm 管理器在初始化或更新应用程序时会自动为覆盖网络上的容器分配地址。
服务发现
swarm 管理器节点会为 swarm 中的每个服务分配一个唯一的 DNS 名称,并对正在运行的容器进行负载均衡。通过嵌入在 swarm 中的 DNS 服务器查询 swarm 中运行的每个容器。
负载均衡
将服务的端口暴露给外部负载均衡器。在内部,swarm 允许你指定如何在节点之间分配服务容器。
默认安全
swarm 中的每个节点都会强制实施 TLS 双向认证和加密,以确保自身与所有其他节点之间的通信安全。可以选择使用自签名根证书或来自自定义根 CA 的证书。
滚动更新
在推出更新时,对节点逐步应用服务更新。swarm 管理器允许控制向不同节点组部署服务之间的延迟。如果出现问题,可以回滚到服务的先前版本。
Docker Swarm基本概念
什么是集群(swarm)?
Docker Engine 中嵌入的集群管理与编排功能是基于 Swarmkit 构建的。Swarmkit 是一个独立的项目,它实现了 Docker 的编排层,并直接在 Docker 内部使用。
一个集群由多个以集群模式运行的 Docker 主机组成,这些主机充当管理器(用于管理成员关系和任务委派)和工作节点(用于运行集群服务)。给定的 Docker 主机可以是管理器、工作节点,或者同时扮演这两种角色。当你创建一项服务时,要定义它的理想状态 —— 副本数量、可供其使用的网络和存储资源、服务对外暴露的端口等等。Docker 会努力维持这种期望状态。例如,如果一个工作节点不可用,Docker 会将该节点的任务调度到其他节点上。任务是指作为集群服务一部分且正在运行的容器,它由集群管理器管理,这与独立容器不同。
集群服务相对于独立容器的一个主要优势在于,可以修改服务的配置,包括它所连接的网络和卷,而无需手动重启服务。Docker 会更新配置,停止那些配置过时的服务任务,并创建符合期望配置的新任务。
当 Docker 以集群模式运行时,仍然可以在参与集群的任何 Docker 主机上运行独立容器以及集群服务。独立容器和集群服务之间的一个关键区别在于,只有集群管理器才能管理集群,而独立容器可以在任何守护进程上启动。Docker 守护进程可以作为管理器、工作节点或两者兼具的角色参与到集群中。
就像可以使用 Docker Compose 来定义和运行容器一样,也可以定义和运行集群服务栈。
节点
节点是参与集群的 Docker 引擎的一个实例。可以将其视为一个 Docker 节点。可以在一台物理计算机或云服务器上运行一个或多个节点,但生产环境中的集群部署通常包括分布在多台物理机和云服务器上的 Docker 节点。
要将应用程序部署到集群中,需要向一个管理器节点提交服务定义。管理器节点会将称为任务的工作单元分派到工作节点上。
管理器节点还执行维持集群期望状态所需的编排和集群管理功能。管理器节点会选出一位单一的领导者来执行编排任务。
工作节点接收并执行从管理器节点分派过来的任务。默认情况下,管理器节点也会像工作节点一样运行服务,但你可以将它们配置为专门运行管理器任务,使其成为仅作管理的节点。每个工作节点上都运行着一个代理,它会报告分配给它的任务情况。工作节点会将其分配任务的当前状态通知给管理器节点,以便管理器能够维持每个工作节点的期望状态。
以下图片形象的展示了集群中管理节点与工作节点的关系。
服务和任务
任务(Task)
是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器;服务(Services)
是指一组任务的集合,服务定义了任务的属性。
服务是关于在管理器或工作节点上要执行的任务的定义。它是集群系统的核心结构,也是用户与集群进行交互的主要根源。
任务承载着一个 Docker 容器以及要在容器内运行的命令。它是集群的原子调度单元。管理器节点会根据服务规模中设置的副本数量将任务分配给工作节点。一旦任务被分配到一个节点上,它就不能转移到另一个节点。它只能在分配的节点上运行,或者失败。
以下图片形象的展示了容器、任务、服务的关系。
负载均衡
集群管理器使用入口负载均衡来将希望在集群外部可用的服务暴露出去。集群管理器可以自动为服务分配一个已发布端口,或者可以为服务配置一个已发布端口。可以指定任何未使用的端口。如果不指定端口,集群管理器会为服务分配一个在 30000 - 32767 范围内的端口。
外部组件,如云计算负载均衡器,可以通过集群中任何节点的已发布端口访问服务,无论该节点当前是否正在运行该服务的任务。集群中的所有节点都会将入口连接路由到一个正在运行的任务实例。
集群模式有一个内部 DNS 组件,它会自动为集群中的每个服务分配一个 DNS 条目。集群管理器使用内部负载均衡根据服务的 DNS 名称在集群内的服务之间分配请求。