Docker Swarm 简介
关于使用 Docker 的 DevOps 一些介绍
直到上一节,我们都是从开发者的角度来学习的。本节将带你初步了解使用 Docker 的 DevOps 实践。
设定我们的预期
本课程的重点是使用 Docker 进行开发。我们已经涵盖了开发者视角所需的所有内容。通过本课程的学习,你将能够轻松地使用 Docker 开发 Web 应用。
然而,你可能也希望对部署过程有一定程度的了解,以便更好地理解项目中正在发生的事情。因此,本节将为你提供关于 Swarm 架构的高层次理解,帮助你建立对基于 Docker Swarm 部署的生产环境的概念性认识。
让我们开始吧。
什么是容器编排?
假设你开发了一个非常出色的、将被数百万用户使用的应用程序。如何在不出现单点故障的情况下高效部署,以应对大量请求?
在大规模环境下管理系统非常困难。成千上万的容器分布在不同的机器上运行。你如何追踪哪个容器已停止,或哪个服务不再运行?
有效地管理这一容器集群的过程被称为容器编排。目前,有三种主要工具可用于容器编排,分别是 Docker Swarm、Kubernetes 和 Apache Mesos。
在接下来的课程中,我们将深入学习 Docker Swarm。
什么是 Docker Swarm?
Docker Swarm 是一种容器编排工具,允许用户在多台主机上管理部署的多个容器。
Docker Swarm 具有多个组件,这些组件共同协作,实现对 Swarm 集群的有效管理。让我们通过架构图来理解其工作原理。
Docker Swarm 架构

工作节点(Worker Node)是管理者创建任务并执行的地方。每个工作节点上会运行服务,以保持与 YAML 文件中定义的状态一致。
在这个架构中,仅使用一个 YAML 文件。这正是 YAML 文件的强大之处:通过该文件,可以创建并部署一组服务到每个工作节点上。
节点是一台机器。它可以充当管理节点、工作节点,或同时承担两者角色。我们可以拥有多个管理节点,但始终有一个主节点负责管理整个 Swarm 集群。
管理节点的主要特性包括:
- 始终掌握集群的精确状态
- 负责维护由 YAML 文件描述的集群状态
- 在工作节点上创建不同任务,以维持服务所需的期望状态
- 在节点故障时保存备份,并在可用节点上启动新容器,以维持容器数量
现在让我们逐一理解架构中的各个组成部分。
Docker Swarm 的核心构建模块
一个 Swarm 集群可以包含以下组件:
-
节点(Node):节点即宿主机。一台机器可以作为工作节点、管理节点,或同时作为两者。我们也可以只用一个节点组成一个 Swarm 集群,此时该机器同时扮演工作节点和管理节点的角色。
例如,在由 5 台计算机组成的集群中,每台计算机都是一个节点,其中有一台主控计算机负责集群之间的通信。
-
栈(Stack):多个服务组合在一起称为一个栈。栈与 Compose 有些类似,但存在一些差异:在非 Swarm 模式下,
docker-compose会忽略某些命令,比如deploy。举个例子,当你希望用一条命令部署整个项目(如包含 Web 服务器、数据库和任务队列等服务)时,你可以将所有服务定义在一个 YAML 文件中,这个文件就成为 Swarm 管理器的“服务栈”。Swarm 管理器将部署该栈,并持续维护 YAML 文件中定义的服务期望状态。
-
服务(Service):服务是定义在管理节点或工作节点上执行的任务的规范。它是 Swarm 系统的核心结构,也是用户与 Swarm 交互的主要入口。创建服务时,你需要指定要使用的容器镜像以及在运行容器中执行的命令。
举个例子,我们之前创建的 Flask 应用就是一个服务。为什么?因为我们使用了
flask_app:2.0镜像,它将在容器中运行 WSGI 服务器。 -
任务(Task):任务负责维护服务所需的副本数量。为了在工作节点上部署服务,Swarm 管理器会创建一个任务,并在其中启动一个容器。
如果你熟悉 Kubernetes,那么“任务”类似于“Pod”。任务是 Swarm 中最基本的调度单元。
举个例子,你定义了一个服务,要求 Swarm 管理器始终运行三个 HTTP 监听器实例。协调器会响应创建三个任务。每个任务是一个调度槽位,调度器通过启动容器来填充它。容器就是任务的具体实例。如果某个 HTTP 监听器任务后续健康检查失败或崩溃,协调器将创建一个新的副本任务,并启动新的容器。

任务是一种单向机制,其状态按顺序单调推进:分配、准备、运行等。如果任务失败,协调器会移除该任务及其容器,并根据服务定义的期望状态创建一个新的任务来替代它。