- Docker Swarm 允许您创建节点集群,以编排具有高可用性和集成负载均衡的容器化服务。
- 节点、管理器、工作节点、服务、任务和覆盖网络等概念是理解 Swarm 如何管理和分发容器的基础。
- docker swarm init、docker service create 或 docker service scale 等命令使部署、扩展和更新应用程序变得容易。
- Swarm 非常适合中小型项目,可与云服务、DevOps 实践、人工智能和商业智能集成。

如果仅仅依赖基础的 Docker 功能,管理分布在多台机器上的数十甚至数百个容器会变得非常棘手。当涉及到高可用性、自动扩展或零停机部署时,仅仅管理单个容器是不够的:你需要容器编排。而 Docker Swarm 正是为此而生,它是 Docker 提供的用于协调集群中容器的原生解决方案。
如果您之前在单机上使用 Docker Compose,但发现它无法满足实际环境的需求,那么 Swarm 就是下一个合乎逻辑的选择。它允许您搭建节点集群,将服务分布在这些节点上,进行负载均衡,替换崩溃的容器,并最终将众多服务器整合到一个统一的、可用于生产环境的平台中,而无需直接迁移到Kubernetes(如果您觉得它过于繁琐或复杂)。
什么是 Docker Swarm?它在容器编排中为何如此重要?
Docker Swarm 是直接内置于 Docker 中的集群和编排引擎。它不是一个外部工具,而是 Docker 引擎本身的一种运行模式,它允许你将多台机器(物理机或虚拟机)组合成一个逻辑集群,称为 Swarm,并在该集群上部署服务,而不是部署孤立的容器。
Swarm 的妙处在于它抽象了所有节点,让你感觉就像拥有一个“超级服务器”。你只需定义服务、副本数量、暴露端口和各种限制,Swarm 就会决定每个容器(任务)的运行位置、节点故障时如何重新分配资源以及如何在它们之间平衡流量。
在容器编排方面,Docker Swarm 能够满足许多 DevOps 团队的典型需求:易于横向扩展、基本高可用性、内部负载均衡、节点间分层网络以及可控部署,使其非常适合微服务架构。它尤其适用于中小型项目,或者对 Docker 生态系统非常熟悉但不需要 Kubernetes 全部复杂性的组织。
Swarm 非常适合那些以简洁性为关键的场景:例如实验室、预发布环境、中小企业内部集群,甚至是不想管理复杂平台的云生产环境。此外,它还能与已使用 Docker 进行应用打包的 CI/CD 流水线和 DevOps 实践无缝集成。
Docker Swarm 的关键概念:节点、服务和网络
在你开始疯狂输入命令之前,必须先了解 Swarm 如何指代每个组件。这些概念你会在命令行界面 (CLI) 和文档中反复看到。
节点是指集群中的任何一台机器;它可以是物理服务器、云端虚拟机,甚至是测试环境中的笔记本电脑。每个节点都运行 Docker Engine,并使用特定角色向集群注册。
管理节点:这是集群的核心。它负责维护集群的预期状态、调度任务和协调操作。为了确保控制平面的高可用性,可以有多个管理节点,但其中一个会作为领导者,协调其他节点。
工作节点:这些是集群中的“工作节点”。它们不参与编排决策;它们只执行管理器分配给它们的任务(容器)。这样,计算能力就可以根据需要通过添加更多工作节点来扩展。
在 Swarm 中,服务是部署的基本单元。它定义了要使用的容器镜像、副本数量、端口、环境变量、配置、密钥和其他选项。与使用 `docker run` 运行单个容器不同,`docker service create` 描述的是 Swarm 维护的、处于所需状态的服务。
任务是与服务关联并分配给节点的容器的具体实例。如果您请求一个具有 3 个副本的服务,Swarm 会创建 3 个任务。如果某个任务失败,管理器会创建另一个任务以维持副本数量。
覆盖网络:这是一种分布式虚拟网络,它允许位于不同节点上的容器像在同一本地网络上一样进行通信。Swarm 依靠这些覆盖网络来连接服务、在副本之间进行负载均衡以及隔离应用程序。
第一步:初始化和测试 Docker Swarm 集群
如果你的机器上已经安装了 Docker ,那么搭建一个基本的集群就非常简单。你不需要任何额外的软件:只需启用集群模式并将节点加入集群即可。
步骤 1:创建第一个管理器。在要用作初始管理器节点的机器上,运行:
docker swarm init --advertise-addr
`--advertise-addr` 参数指定其他节点用于查看此管理器的 IP 地址。运行该命令后,Docker 将自动显示一个令牌和一个命令,供其他节点加入集群成为工作节点。
步骤 2:将工作节点加入集群。在每台将作为工作节点的机器上,运行类似如下的命令:
docker swarm join --token :2377
加入令牌和管理器的 IP 地址由 `docker swarm init` 命令输出。默认情况下,控制通信使用 2377 端口。此后,该节点将作为集群的一部分出现,并准备好接收任务。
检查集群状态非常简单,只需登录到管理器(在单独的工作节点上不起作用)并运行以下命令:
docker 节点 ls
此命令会显示集群中的所有节点,包括它们的 ID、主机名、角色(管理节点或工作节点)和当前状态。通过此命令,您可以检测是否有节点宕机、处于资源耗尽模式或遇到连接问题。
在 Docker Swarm 中部署服务:从第一个 nginx 到生产环境
集群启动并运行后,精彩的部分就开始了:部署服务。您无需使用 `docker run` 命令启动单个容器,而是定义由 Swarm 自动维护和重新平衡的服务。
使用如下命令即可创建像 Nginx Web 服务器这样可以从集群外部访问的简单服务:
docker service create –name my-nginx -p 80:80 nginx
这将启动一个名为 my-nginx 的服务,该服务将容器的 80 端口暴露给集群节点的 80 端口。Swarm 会负责发布该服务,并在您扩展集群时,将传入的请求负载均衡到不同的副本上。
列出已部署的服务有助于您跟踪集群中正在运行的服务:
docker 服务 ls
这里显示服务名称、服务模式以及当前/期望副本数(格式为 3/5)。例如,如果显示 3/5,则表示服务仍在创建任务以达到期望状态。
通过检查特定服务的任务详情和状态,您可以确定每个实例在哪个节点上运行:
docker service ps my-nginx
输出结果显示任务、分配的节点、状态(运行中、准备中、关闭中等)、使用的镜像以及运行时间。这对于调试部署或负载均衡问题至关重要。
生命周期管理:服务的扩展、升级和删除
编排的一大优势在于能够扩展和更新服务,而无需逐个服务器进行操作。Swarm 使得通过命令行即可轻松实现这一点。
在 Docker Swarm 中扩展服务意味着指定所需的服务副本总数。例如,如果您创建 my-nginx 时只有一个副本,现在想将其增加到三个副本:
docker service scale my-nginx=3
Swarm 负责在可用节点上调度新任务,并会考虑工作节点的资源和状态。如果以后需要更多容量,可以升级到五个副本:
docker service scale my-nginx=5
更新服务镜像也是关键所在,尤其是在生产环境中。与其手动停止和删除容器,不如执行受控更新:
docker service update –image nginx:latest my-nginx
此命令指示 Swarm 按照定义的更新策略(默认情况下为滚动更新)逐步将现有任务迁移到新镜像。这最大限度地减少了对最终用户的影响。
当您不再需要某项服务时,将其移除也是在集群级别完成的,而不是在单个容器级别完成的:
docker service rm my-nginx
这将停止并移除 Swarm 中所有相关的任务,从而释放节点上的资源。这是一种干净利落的方式来停用架构中不再适用的组件。
指导练习:搭建自己的集群并部署服务
为了巩固概念,没有什么比在实验室环境中,使用本地虚拟机或廉价的云实例进行复现的小练习更好的了。
练习 1:配置 Docker Swarm 集群。目标是至少配置三个节点:一个作为管理节点,两个作为工作节点。在管理节点上,使用以下命令启用 Swarm:
docker swarm init --advertise-addr
接下来,复制输出中显示的join 命令,并在每个工作节点上运行它:
docker swarm join --token :2377
检查一下以下各项是否进展顺利:
docker 节点 ls
您会看到管理器处于“领导者”状态,工作进程处于“活动”状态。如果任何进程显示为“已关闭”,请检查网络连接、防火墙和 Docker 版本。
练习 2:部署和扩展服务。集群准备就绪后,创建一个可通过 HTTP 访问的 nginx 服务:
docker service create –name my-nginx -p 80:80 nginx
请用以下方式检查其是否存在:
docker 服务 ls
使用以下方法将服务扩展到三个副本:
docker service scale my-nginx=3
使用以下命令检查任务部署位置:
docker service ps my-nginx
作为该练习的基本解决方案,您应该看到三个任务分布在不同的节点上(如果资源充足),并且当向集群的 80 端口发出 HTTP 请求时,Swarm 将根据其内部负载均衡器将流量路由到不同的副本。
Docker Swarm 相较于手动容器管理的优势
使用 Swarm 而不是启动单个容器可以带来许多好处,当您需要的不仅仅是一个简单的测试环境时,这些好处就会变得显而易见。
集成到 Docker CLI 中的简单部署:您无需学习全新的工具;服务和集群管理命令与您使用 docker run、docker ps 或 docker images 所做的非常相似。
内置负载均衡:当您使用 `-p` 参数暴露服务时,Swarm 会在必要的节点上广播端口,并将流量分配到可用的副本上。您无需添加像Traefik这样基本的外部负载均衡器来分配请求,从而简化了初始架构。
高可用性和容错性:如果容器崩溃或工作节点发生故障,Swarm 会检测到任务丢失,并尝试在其他节点上重新创建这些任务,以维持副本数量。这可以防止因孤立故障导致的许多服务中断。
集中管理所需状态:您只需声明所需的副本数量、使用的镜像、要开放的端口以及要应用的限制,集群就会负责收敛到该状态。未来的变更(更新、扩容、节点淘汰)也通过此控制平面进行管理。
在项目中何时使用 Docker Swarm 才合适?
并非所有情况都需要 Kubernetes 或功能强大的微服务。Docker Swarm 非常适合许多需要兼顾简易性和编排能力的用例。
中小型生产集群:如果您管理几个业务应用程序、API 或内部服务,并且您的基础设施规模不大,那么 Swarm 可以提供您所需的一切,而无需您学习庞大的生态系统。
对于那些与 Docker 深度集成,并希望快速过渡到编排模式,但又不想被 Kubernetes 的学习曲线所困扰的团队来说,Swarm 是一个理想的选择。由于 Swarm 本身就是 Docker 引擎的一部分,因此过渡过程通常会更加平滑快捷。
在云环境和分布式架构中,您希望继续使用来自主流供应商的托管服务(数据库、消息队列、存储等),同时您的应用程序运行在由 Swarm 编排的容器中。这是一种将简易性与云功能相结合的明智之选。
在需要构建镜像、将其上传到镜像仓库并自动部署到集群的流水线的DevOps 和自动化用例中, Swarm 能够很好地与 CI/CD 工具集成,并有助于实现快速的持续交付周期。
当您需要极致的控制、庞大的生态系统或复杂的集成时, Kubernetes 可能更合适。但对于许多实际项目而言,Swarm 能够以更少的运维摩擦提供必要的编排功能。
实用指南和DevOps方法:从基础知识到高级部署
如果你曾因Docker Swarm 相关零散的教程、奇怪的生产错误和不连贯的文档而感到迷茫,你并不孤单。许多开发和运维团队在从独立容器迁移到编排平台时都会遇到类似的难题。
一份全面的 Swarm DevOps 指南通常由几个关键模块组成。首先,它会介绍 Docker 的基础知识:镜像创建、容器管理和优化、镜像仓库的使用以及最佳打包实践。这个坚实的基础对于防止后续的编排工作变成一场噩梦至关重要。
接下来,我们将深入探讨网络和持久化:Docker 网络类型(桥接、主机、覆盖、macvlan)、卷管理和数据持久化,以及如何使用 Docker Compose 部署多容器应用程序。这将帮助您清晰地了解在将技术栈部署到分布式集群之前,其应有的结构。
下一阶段的重点是实现 Swarm 服务,涵盖从集群初始化到高级功能(例如密钥、配置和堆栈)的所有内容。您将在此阶段使用声明式服务定义、加密凭据以及跨容器共享的配置。
另一个关键领域是负载均衡、日志记录和可观测性:学习如何正确地暴露服务、查看日志、识别瓶颈并应用故障排除技巧,以维持日常的高可用性。对于系统监控和诊断,一份涵盖指标和警报的高级监控指南将非常有用。
最后,所有内容都集成到 DevOps 流水线中,并辅以实际的编程练习:从自动化镜像构建到跨集群的持续部署,确保每次代码更改都能可靠且可重复地部署到生产环境中。
进阶篇:Docker 网络及 Swarm 的后续步骤
一旦你掌握了如何启动集群和第一个服务,下一步通常是彻底了解你的容器如何相互通信以及如何与外部世界通信。
Docker桥接网络和主机网络负责单台机器上的大部分通信,而覆盖网络则是连接集群中不同节点容器的关键。了解它们的区别、何时使用哪种网络以及它们如何与外部防火墙和负载均衡器交互,对于避免生产环境中出现意外情况至关重要。
像 macvlan 这样的网络允许您将物理网络中的“真实”IP 地址分配给容器,这在需要服务在网络级别像独立主机一样运行的特定环境中非常有用,但它也增加了复杂性和额外的配置要求。
深入了解 Docker 网络将有助于您更好地将 Swarm 服务设计与组织或云提供商的网络拓扑结构相匹配,明确定义哪些服务是内部的,哪些服务暴露在外部,以及如何在环境(开发、测试、生产)之间划分流量。
Swarm 的另一个有趣发展方向是更深入地利用密钥和配置来管理凭据、证书和配置文件,而无需将它们直接嵌入镜像或使用普通的环境变量。这提高了安全性,并使环境管理更加井然有序。
基于 Docker Swarm 构建的定制开发、云服务和商业智能服务
容器编排并非独立于IT生态系统的其他部分。专注于定制应用程序和定制软件的开发公司通常依赖Swarm等容器平台来提供更强大、更具可扩展性的解决方案。
将 Swarm 与 AWS 和 Azure 云服务集成,可以实现灵活集群的部署。
利用托管云组件(数据库、消息队列、对象存储),同时保持对容器执行层的直接控制。
与此同时,面向企业的人工智能和 AI非常适合与容器进行协调的环境:AI 模型、推理微服务和 AI 代理可以作为 Swarm 服务运行,并根据负载进行扩展,从而防止单台机器成为瓶颈。
在商业智能和 Power BI 领域,将后端部署在 Docker Swarm 上,可以更轻松地从 API、ETL 服务和处理管道中可靠地提取数据。编排机制确保这些服务始终可用,从而为仪表板和分析提供数据。
在此背景下,网络安全的重要性日益凸显:配置完善的集群,通过TLS通信、受控镜像更新、漏洞扫描和集中式密钥管理,相比于独立容器的混乱部署,能够有效降低风险。此外,强化措施和访问控制也能进一步提升环境的整体安全性。
最终,将定制开发、云服务、人工智能和商业智能结合在 Docker Swarm 等编排平台上,可以构建现代化、可扩展且具有弹性的解决方案,而不会增加技术复杂性或运营成本。
掌握 Docker Swarm 作为容器编排工具,能让你在 DevOps 领域占据非常强大的地位:你将不再为分散的容器和脆弱的部署而苦恼,而是能够使用一个连贯、可扩展且安全的集群,该集群能够支持从简单的 Web 应用程序到具有云服务、人工智能、自动化和集成商业智能解决方案的分布式架构的一切。
指数
- 1 什么是 Docker Swarm?它在容器编排中为何如此重要?
- 2 Docker Swarm 的关键概念:节点、服务和网络
- 3 第一步:初始化和测试 Docker Swarm 集群
- 4 在 Docker Swarm 中部署服务:从第一个 nginx 到生产环境
- 5 生命周期管理:服务的扩展、升级和删除
- 6 指导练习:搭建自己的集群并部署服务
- 7 Docker Swarm 相较于手动容器管理的优势
- 8 在项目中何时使用 Docker Swarm 才合适?
- 9 实用指南和DevOps方法:从基础知识到高级部署
- 10 进阶篇:Docker 网络及 Swarm 的后续步骤
- 11 基于 Docker Swarm 构建的定制开发、云服务和商业智能服务
