Docker swarm-1
本章要点:docker-swarm集群基础理论,docker compose与swarm的对比
参考文档:Docker Swarm 全面总结,Docker Swarm介绍,Docker之Swarm详细讲解,Swarm 集群管理,compose 多主机网络共享 overlay,纳米ai
Docker swarm概述
我们用完docker compose就会发现它只能在单台机器上运行,如果是多主机节点,那compose就不太适用了,这里就需要用到swarm, Swarm是Docker官方提供的一款集群管理工具, 几乎全部用 GO 语言来完成的开发的,代码开源站点, 其主要作用就是若干台安装docker的机器抽象为一个整体, 并且通过一个入口统一管理这些Docker主机上的各种Docker资源。
Docker Swarm 与 Docker Compose 对比分析
来源: 可参考ai查询
-
核心定位与功能
特性 Docker Compose Docker Swarm 核心目标 管理单主机上的多容器应用 管理多主机容器集群,提供服务编排、高可用和负载均衡 部署范围 仅限当前主机 跨多个服务器或节点组成的集群 服务编排能力 通过 docker-compose.yml定义多容器依赖关系,一键启动/停止应用支持服务扩缩容、滚动更新、自愈能力(容器异常时自动重启) 负载均衡 无内置负载均衡,需手动配置 内置 DNS 负载均衡,支持服务发现和外部负载均衡集成 高可用 不支持,依赖单主机稳定性 基于 Raft 协议选举 manager 节点,避免单点故障 -
架构差异
-
Docker Compose
- 采用单机架构,通过 YAML 文件(
docker-compose.yml)声明多个容器的配置(如镜像、端口、 volumes、依赖关系等),执行docker-compose up即可按配置启动所有服务。仅能管理当前主机上的容器,不具备跨主机调度能力。
- 采用单机架构,通过 YAML 文件(
-
Docker Swarm
-
采用 master-slave 集群架构:
-
Manager 节点:负责集群管理、服务调度、负载均衡配置等。
-
Worker 节点:运行容器并接受 Manager 节点的统一管理。
集群通过 Raft 协议自动选举 Manager 节点,确保高可用,无需额外依赖外部服务 。
-
-
-
-
适用场景
工具 适用场景 不适用场景 Docker Compose 1. 开发环境的多容器应用测试(如前端+后端+数据库) 2. 单主机部署的小型应用 1. 生产环境的大规模集群部署 2. 跨主机容器管理 Docker Swarm 1. 生产环境的容器集群管理 2. 需高可用和负载均衡的微服务架构 1. 单机环境的简单应用部署 2. 复杂的容器编排需求(如自动扩缩容策略) -
总结
- 若需在单机环境快速管理多容器应用,选择 Docker Compose;
- 若需跨主机集群部署并保证高可用,选择 Docker Swarm。
- 生产环境中,Swarm 适合中小型集群,复杂场景可考虑 Kubernetes。
服务架构

上图可以看出,Swarm 是典型的 master-slave 结构,通过发现服务来选举 manager。manager 是中心管理节点,各个 node 上运行 agent 接受 manager 的统一管理,集群会自动通过 Raft 协议分布式选举出 manager 节点,无需额外的发现服务支持,避免了单点的瓶颈问题,同时也内置了 DNS 的负载均衡和对外部负载均衡机制的集成支持。
工作原理
-
Docker Engine client
bashdocker service create:我们通过 docker service create 这个命令去创建一个服务 -
swarm manager
-
调度
- API:这个请求直接由Swarm manager的API进行接收,接收命令并创建服务对象。
- orchestrator:为服务创建一个任务。
- allocater:为这个任务分配IP地址。
- dispatcher:将任务分配到指定的节点。
- scheduler:再该节点中下发指定命令。
-
其使用
Raft实现,管理器维护整个 swarm 及其上运行的所有服务的一致内部状态。为了利用 swarm 模式的容错特性,Docker 建议您根据组织的高可用性要求实现奇数个节点。当您有多个管理器时,您可以在不停机的情况下从管理器节点的故障中恢复。- 三个管理器的群体最多可以容忍一个管理器的损失。
- 一个五管理器群可以容忍最大同时丢失两个管理器节点。
- 一个N管理器集群最多可以容忍管理器的丢失 (N-1)/2。
- Docker 建议一个群最多有七个管理器节点。
-
-
worker node
- 调度
- container:创建相应的容器。
- worker:连接到调度程序以检查分配的任务。
- executor:执行分配给工作节点的任务。
- 工作节点也是 Docker 引擎的实例,其唯一目的是执行容器。Worker 节点不参与 Raft 分布式状态,不做出调度决策,也不为 swarm 模式 HTTP API 提供服务。

- 调度
重要概念
- Swarm:集群的管理和编排是使用嵌入docker引擎的SwarmKit,可以在docker初始化时启动swarm模式或者加入已存在的swarm。
- Node:每一个docker engine都是一个node(节点),分为 manager 和worker。Manager节点还执行维护所需群集状态所需的编排和集群管理功能。Work节点接收并执行从管理器节点分派的任务。
- Service:一个服务是任务的定义,管理机或工作节点上执行。它是群体系统的中心结构,是用户与群体交互的主要根源。创建服务时,你需要指定要使用的容器镜像。
- Task:任务是在docekr容器中执行的命令,Manager节点根据指定数量的任务副本分配任务给worker节点。一个任务包含了一个容器及其运行的命令。task是service的执行实体,task启动docker容器并在容器中执行任务。
命令行说明
-
docker swarm:集群管理
-
作用:执行集群的管理功能,维护集群的状态,选举一个leader节点去执行调度任务。
-
子命令说明,通过
docker swarm --help查看参数 说明 init 初始化集群 join 将节点加入集群
-
-
docker service:服务管理
-
作用: 一个服务是work节点上执行任务的定义。创建一个服务,指定了容器所使用的镜像和容器运行的命令
-
子命令说明,通过
docker service --help查看参数 说明 create 创建一个新的服务 inspect 列出一个或多个服务的详细信息 ps 列出一个或多个服务中的任务信息 ls 列出服务 rm 删除一个或多个服务 scale 扩展一个或多个服务 update 更新服务
-
-
docker node:节点管理
-
作用: 接收和执行任务。参与容器集群负载调度,仅用于承载 task
-
子命令说明,通过
docker node --help查看参数 说明 demote 将集群中一个或多个节点降级 inspect 显示一个或多个节点的详细信息 ls 列出集群中的节点 promote 将一个或多个节点提升为管理节点 rm 从集群中删除停止的节点,--force强制删除参数 ps 列出一个或多个节点上运行的任务 update 更新节点
-
调度策略
Swarm在调度(scheduler)节点(leader节点)运行容器的时候,会根据指定的策略来计算最适合运行容器的节点,目前支持的策略有:spread, binpack, random
-
Spread
- 在同等条件下,Spread 策略会选择运行容器最少的那台节点来运行新的容器,binpack策略会选择运行容器最集中的那台机器来运行新的节点。使用 Spread 策略会使得容器会均衡的分布在集群中的各个节点上运行,一旦一个节点挂掉了只会损失少部分的容器。
-
Binpack
- Binpack策略最大化的避免容器碎片化,就是说 binpack 策略尽可能的把还未使用的节点留给需要更大空间的容器运行,尽可能的把容器运行在一个节点上面。
-
Random
- 顾名思义,就是随机选择一个 Node 来运行容器,一般用作调试用,spread 和 binpack 策略会根据各个节点的可用的 CPU, RAM 以及正在运行的容器的数量来计算应该运行容器的节点。
-
策略类型 核心逻辑 优势 局限性 适用场景 Spread(默认) 优先选择资源(CPU、内存)占用最少的节点,均衡分配容器。 集群负载均衡,避免单点过载,提升整体稳定性。 在复杂资源需求场景下可能导致资源碎片化,部分节点资源利用率低。 通用场景,需保证节点负载均匀的业务。 Binpack 优先将容器集中调度到资源剩余较多的节点,尽可能填满节点。 提高单节点资源利用率,减少空闲节点,降低硬件成本。 可能导致部分节点负载过高,影响任务执行效率和容错能力。 资源密集型任务,需最大化硬件利用率。 Random 随机选择节点分配容器(简单策略,较少实际应用)。 实现简单,无复杂计算开销。 完全不考虑资源状态,可能导致负载失衡和资源浪费。 测试环境或对调度效率要求极低的场景。
Cluster 模式特性
- 批量创建服务: 建立容器之前先创建一个 overlay 的网络,用来保证在不同主机上的容器网络互通的网络模式。
- 强大的集群的容错性: Swarm Cluster 不光只是提供了优秀的高可用性,同时也提供了节点弹性扩展或缩减的功能。当容器组想动态扩展时,只需通过 scale 参数即可复制出新的副本出来。如果有需求想在每台节点上都 run 一个相同的副本,方法其实很简单,只需要在命令中将 "--replicas n" 更换成 "--mode=global" 即可!
- 复制服务(--replicas n): 将一系列复制任务分发至各节点当中,具体取决于您所需要的设置状态,例如 "--replicas 3"。
- 全局服务(--mode=global): 适用于集群内全部可用节点上的服务任务,例如"--mode global"。如果大家在 Swarm 集群中设有 7 台 Docker 节点,则全部节点之上都将存在对应容器。
- 调度机制: 所谓的调度其主要功能是cluster的server端去选择在哪个服务器节点上创建并启动一个容器实例的动作。它是由一个装箱算法和过滤器组合而成。每次通过过滤器(constraint)启动容器的时候,swarm cluster 都会调用调度机制筛选出匹配约束条件的服务器,并在这上面运行容器。