14、Docker swarm-1-理论

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 即可按配置启动所有服务。仅能管理当前主机上的容器,不具备跨主机调度能力。
    • 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

    bash 复制代码
    docker 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 以及正在运行的容器的数量来计算应该运行容器的节点。
  • Docker Swarm 三种原生调度策略对比

    策略类型 核心逻辑 优势 局限性 适用场景
    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 都会调用调度机制筛选出匹配约束条件的服务器,并在这上面运行容器。
相关推荐
惊讶的猫3 小时前
docker常见命令:从拉取到推送社区仓库
docker
Will_Ye3 小时前
在Ubuntu中使用Docker打包程序(Conda, pip)
ubuntu·docker·conda
轩辕Ruins3 小时前
docker compose配置容器只允许指定的外部IP访问
docker
❀͜͡傀儡师3 小时前
docker离线镜像文件选择导入脚本
运维·docker·容器
安卓开发者3 小时前
Docker 安装和配置 Elasticsearch 完整指南
elasticsearch·docker·容器
筑梦之路3 小时前
docker ubuntu22.04更新报错问题——筑梦之路
运维·docker·容器
CodeHorizon3 小时前
Docker Buildx 构建多平台镜像的强大工具
其他·docker·容器·eureka
阿巴~阿巴~3 小时前
深入理解sigaction函数:Linux信号处理机制与使用指南
linux·运维·服务器·信号处理
_dindong4 小时前
Linux网络编程:进程间关系和守护进程
linux·运维·服务器·网络·c++·学习