欢迎光临
我们一直在努力

Docker Swarm 集群管理详解:从入门到实践

Docker Swarm 集群管理详解:从入门到实践

    • 一、Swarm 集群概述
      • 1.1 什么是 Docker Swarm
      • 1.2 Swarm 核心概念
    • 二、Swarm 集群架构
      • 2.1 架构组件说明
    • 三、Swarm 集群搭建实战
      • 3.1 环境准备
      • 3.2 创建管理节点
      • 3.3 添加工作节点
      • 3.4 验证集群状态
    • 四、服务管理
      • 4.1 服务生命周期流程图
      • 4.2 基础服务操作
        • 创建服务
        • 查看服务
        • 扩展服务
        • 更新服务
        • 删除服务
      • 4.3 滚动更新策略
    • 五、高级特性
      • 5.1 节点管理
        • 节点排水(Drain)
        • 节点激活
      • 5.2 服务约束
      • 5.3 服务健康检查
    • 六、最佳实践
    • 七、常见问题排查
    • 八、总结

🌺The Begin🌺点点关注,收藏不迷路🌺

一、Swarm 集群概述

1.1 什么是 Docker Swarm

Docker Swarm 是 Docker 官方提供的容器集群管理工具,它将多个 Docker 主机组成的集群转变为单个虚拟 Docker 主机。Swarm 提供了标准的 Docker API,使得任何已经与 Docker 守护程序通信的工具都可以无缝扩展到多个主机。

#mermaid-svg-FxX17ATkuyUpn1zS {font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-FxX17ATkuyUpn1zS .error-icon{fill:#552222;}#mermaid-svg-FxX17ATkuyUpn1zS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-FxX17ATkuyUpn1zS .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-FxX17ATkuyUpn1zS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-FxX17ATkuyUpn1zS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-FxX17ATkuyUpn1zS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-FxX17ATkuyUpn1zS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-FxX17ATkuyUpn1zS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-FxX17ATkuyUpn1zS .marker.cross{stroke:#333333;}#mermaid-svg-FxX17ATkuyUpn1zS svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-FxX17ATkuyUpn1zS .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-FxX17ATkuyUpn1zS .cluster-label text{fill:#333;}#mermaid-svg-FxX17ATkuyUpn1zS .cluster-label span{color:#333;}#mermaid-svg-FxX17ATkuyUpn1zS .label text,#mermaid-svg-FxX17ATkuyUpn1zS span{fill:#333;color:#333;}#mermaid-svg-FxX17ATkuyUpn1zS .node rect,#mermaid-svg-FxX17ATkuyUpn1zS .node circle,#mermaid-svg-FxX17ATkuyUpn1zS .node ellipse,#mermaid-svg-FxX17ATkuyUpn1zS .node polygon,#mermaid-svg-FxX17ATkuyUpn1zS .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-FxX17ATkuyUpn1zS .node .label{text-align:center;}#mermaid-svg-FxX17ATkuyUpn1zS .node.clickable{cursor:pointer;}#mermaid-svg-FxX17ATkuyUpn1zS .arrowheadPath{fill:#333333;}#mermaid-svg-FxX17ATkuyUpn1zS .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-FxX17ATkuyUpn1zS .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-FxX17ATkuyUpn1zS .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-FxX17ATkuyUpn1zS .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-FxX17ATkuyUpn1zS .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-FxX17ATkuyUpn1zS .cluster text{fill:#333;}#mermaid-svg-FxX17ATkuyUpn1zS .cluster span{color:#333;}#mermaid-svg-FxX17ATkuyUpn1zS div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-FxX17ATkuyUpn1zS :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

客户端

Swarm Manager

Worker Node 1

Worker Node 2

Worker Node 3

1.2 Swarm 核心概念

  • 管理节点(Manager Node):负责集群状态维护、任务调度、服务编排等管理工作
  • 工作节点(Worker Node):接收并执行来自管理节点的任务
  • 服务(Service):需要在集群中运行的应用定义
  • 任务(Task):服务的最小调度单位,对应一个运行的容器

二、Swarm 集群架构

#mermaid-svg-22Uze7nRMXzq3U3B {font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-22Uze7nRMXzq3U3B .error-icon{fill:#552222;}#mermaid-svg-22Uze7nRMXzq3U3B .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-22Uze7nRMXzq3U3B .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-22Uze7nRMXzq3U3B .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-22Uze7nRMXzq3U3B .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-22Uze7nRMXzq3U3B .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-22Uze7nRMXzq3U3B .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-22Uze7nRMXzq3U3B .marker{fill:#333333;stroke:#333333;}#mermaid-svg-22Uze7nRMXzq3U3B .marker.cross{stroke:#333333;}#mermaid-svg-22Uze7nRMXzq3U3B svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-22Uze7nRMXzq3U3B .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-22Uze7nRMXzq3U3B .cluster-label text{fill:#333;}#mermaid-svg-22Uze7nRMXzq3U3B .cluster-label span{color:#333;}#mermaid-svg-22Uze7nRMXzq3U3B .label text,#mermaid-svg-22Uze7nRMXzq3U3B span{fill:#333;color:#333;}#mermaid-svg-22Uze7nRMXzq3U3B .node rect,#mermaid-svg-22Uze7nRMXzq3U3B .node circle,#mermaid-svg-22Uze7nRMXzq3U3B .node ellipse,#mermaid-svg-22Uze7nRMXzq3U3B .node polygon,#mermaid-svg-22Uze7nRMXzq3U3B .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-22Uze7nRMXzq3U3B .node .label{text-align:center;}#mermaid-svg-22Uze7nRMXzq3U3B .node.clickable{cursor:pointer;}#mermaid-svg-22Uze7nRMXzq3U3B .arrowheadPath{fill:#333333;}#mermaid-svg-22Uze7nRMXzq3U3B .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-22Uze7nRMXzq3U3B .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-22Uze7nRMXzq3U3B .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-22Uze7nRMXzq3U3B .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-22Uze7nRMXzq3U3B .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-22Uze7nRMXzq3U3B .cluster text{fill:#333;}#mermaid-svg-22Uze7nRMXzq3U3B .cluster span{color:#333;}#mermaid-svg-22Uze7nRMXzq3U3B div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-22Uze7nRMXzq3U3B :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

Swarm Cluster

管理

管理

管理

Manager Node

Worker Node 1

Worker Node 2

Worker Node 3

2.1 架构组件说明

  • Manager Node:

    • 维护集群状态
    • 调度服务
    • 提供集群API端点
    • 实现Raft一致性算法保证高可用
  • Worker Node:

    • 接收并执行分配的任务
    • 向Manager报告任务状态
    • 不参与集群管理决策
  • 三、Swarm 集群搭建实战

    3.1 环境准备

    确保已安装:

    • Docker Engine
    • Docker Machine
    • VirtualBox(用于本地测试)

    3.2 创建管理节点

    # 创建虚拟机
    docker-machine create -d virtualbox swarm-manager

    # 登录到manager节点
    docker-machine ssh swarm-manager

    # 初始化Swarm集群
    docker swarm init –advertise-addr 192.168.99.107

    初始化成功后会输出加入集群的token,类似:

    docker swarm join –token SWMTKN-1-4oogo9qziq768dma0uh3j0z0m5twlm10iynvz7ixza96k6jh9p-ajkb6w7qd06y1e33yrgko64sk 192.168.99.107:2377

    3.3 添加工作节点

    # 创建worker节点
    docker-machine create -d virtualbox swarm-worker1
    docker-machine create -d virtualbox swarm-worker2

    # 分别登录到worker节点并加入集群
    docker swarm join –token <TOKEN> <MANAGER-IP>:2377

    3.4 验证集群状态

    # 在manager节点执行
    docker node ls

    输出示例:

    ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
    d3cw2s31q4q7z1q6y6z9j6z1w * swarm-manager Ready Active Leader
    k9z3p6z2q4q7z1q6y6z9j6z1w swarm-worker1 Ready Active
    m0z3p6z2q4q7z1q6y6z9j6z1w swarm-worker2 Ready Active

    四、服务管理

    4.1 服务生命周期流程图

    #mermaid-svg-JI8Ct1vL9MNzndpM {font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-JI8Ct1vL9MNzndpM .error-icon{fill:#552222;}#mermaid-svg-JI8Ct1vL9MNzndpM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-JI8Ct1vL9MNzndpM .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-JI8Ct1vL9MNzndpM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-JI8Ct1vL9MNzndpM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-JI8Ct1vL9MNzndpM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-JI8Ct1vL9MNzndpM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-JI8Ct1vL9MNzndpM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-JI8Ct1vL9MNzndpM .marker.cross{stroke:#333333;}#mermaid-svg-JI8Ct1vL9MNzndpM svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-JI8Ct1vL9MNzndpM .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-JI8Ct1vL9MNzndpM .cluster-label text{fill:#333;}#mermaid-svg-JI8Ct1vL9MNzndpM .cluster-label span{color:#333;}#mermaid-svg-JI8Ct1vL9MNzndpM .label text,#mermaid-svg-JI8Ct1vL9MNzndpM span{fill:#333;color:#333;}#mermaid-svg-JI8Ct1vL9MNzndpM .node rect,#mermaid-svg-JI8Ct1vL9MNzndpM .node circle,#mermaid-svg-JI8Ct1vL9MNzndpM .node ellipse,#mermaid-svg-JI8Ct1vL9MNzndpM .node polygon,#mermaid-svg-JI8Ct1vL9MNzndpM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-JI8Ct1vL9MNzndpM .node .label{text-align:center;}#mermaid-svg-JI8Ct1vL9MNzndpM .node.clickable{cursor:pointer;}#mermaid-svg-JI8Ct1vL9MNzndpM .arrowheadPath{fill:#333333;}#mermaid-svg-JI8Ct1vL9MNzndpM .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-JI8Ct1vL9MNzndpM .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-JI8Ct1vL9MNzndpM .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-JI8Ct1vL9MNzndpM .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-JI8Ct1vL9MNzndpM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-JI8Ct1vL9MNzndpM .cluster text{fill:#333;}#mermaid-svg-JI8Ct1vL9MNzndpM .cluster span{color:#333;}#mermaid-svg-JI8Ct1vL9MNzndpM div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-JI8Ct1vL9MNzndpM :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    异常

    正常

    创建服务

    调度任务

    分配节点

    启动容器

    监控状态

    重新调度

    维持运行

    4.2 基础服务操作

    创建服务

    docker service create –name web –replicas 3 -p 80:80 nginx

    查看服务

    docker service ls
    docker service ps web

    扩展服务

    docker service scale web=5

    更新服务

    docker service update –image nginx:1.19 web

    删除服务

    docker service rm web

    4.3 滚动更新策略

    #mermaid-svg-HrmOhBAcK0AejFTe {font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-HrmOhBAcK0AejFTe .error-icon{fill:#552222;}#mermaid-svg-HrmOhBAcK0AejFTe .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-HrmOhBAcK0AejFTe .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-HrmOhBAcK0AejFTe .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-HrmOhBAcK0AejFTe .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-HrmOhBAcK0AejFTe .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-HrmOhBAcK0AejFTe .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-HrmOhBAcK0AejFTe .marker{fill:#333333;stroke:#333333;}#mermaid-svg-HrmOhBAcK0AejFTe .marker.cross{stroke:#333333;}#mermaid-svg-HrmOhBAcK0AejFTe svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-HrmOhBAcK0AejFTe .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-HrmOhBAcK0AejFTe .cluster-label text{fill:#333;}#mermaid-svg-HrmOhBAcK0AejFTe .cluster-label span{color:#333;}#mermaid-svg-HrmOhBAcK0AejFTe .label text,#mermaid-svg-HrmOhBAcK0AejFTe span{fill:#333;color:#333;}#mermaid-svg-HrmOhBAcK0AejFTe .node rect,#mermaid-svg-HrmOhBAcK0AejFTe .node circle,#mermaid-svg-HrmOhBAcK0AejFTe .node ellipse,#mermaid-svg-HrmOhBAcK0AejFTe .node polygon,#mermaid-svg-HrmOhBAcK0AejFTe .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-HrmOhBAcK0AejFTe .node .label{text-align:center;}#mermaid-svg-HrmOhBAcK0AejFTe .node.clickable{cursor:pointer;}#mermaid-svg-HrmOhBAcK0AejFTe .arrowheadPath{fill:#333333;}#mermaid-svg-HrmOhBAcK0AejFTe .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-HrmOhBAcK0AejFTe .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-HrmOhBAcK0AejFTe .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-HrmOhBAcK0AejFTe .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-HrmOhBAcK0AejFTe .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-HrmOhBAcK0AejFTe .cluster text{fill:#333;}#mermaid-svg-HrmOhBAcK0AejFTe .cluster span{color:#333;}#mermaid-svg-HrmOhBAcK0AejFTe div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-HrmOhBAcK0AejFTe :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    批量停止

    启动版本2

    完成批次

    版本1

    版本1部分运行

    版本1+版本2混合

    全部版本2

    示例命令:

    docker service create \\
    –name redis \\
    –replicas 6 \\
    –update-delay 10s \\
    –update-parallelism 2 \\
    redis:5.0.5

    五、高级特性

    5.1 节点管理

    节点排水(Drain)

    docker node update –availability drain swarm-worker1

    节点激活

    docker node update –availability active swarm-worker1

    5.2 服务约束

    docker service create \\
    –name db \\
    –constraint 'node.role == manager' \\
    –replicas 3 \\
    redis

    5.3 服务健康检查

    docker service create \\
    –name healthcheck \\
    –health-cmd "curl -f http://localhost || exit 1" \\
    –health-interval 5s \\
    –health-retries 3 \\
    nginx

    六、最佳实践

  • 生产环境建议:

    • 至少3个manager节点保证高可用
    • 使用–limit-cpu和–limit-memory限制资源
    • 配置日志驱动集中收集日志
  • 网络建议:

    • 使用overlay网络实现跨主机通信
    • 为不同服务配置独立网络
  • 存储建议:

    • 对于有状态服务使用volume
    • 考虑使用NFS等共享存储
  • 七、常见问题排查

  • 节点无法加入集群:

    • 检查防火墙设置
    • 验证token是否有效
    • 确保manager节点可达
  • 服务无法启动:

    • 检查资源限制
    • 查看服务日志 docker service logs <SERVICE>
    • 验证镜像是否在所有节点可用
  • 网络连接问题:

    • 检查overlay网络创建
    • 验证DNS解析
  • 八、总结

    Docker Swarm 作为Docker原生的集群管理工具,提供了简单易用的容器编排能力。相比Kubernetes,Swarm学习曲线更平缓,适合中小规模部署场景。通过本文介绍的核心概念和实战操作,读者应该能够快速搭建和管理自己的Swarm集群。


    在这里插入图片描述

    🌺The End🌺点点关注,收藏不迷路🌺

    赞(0)
    未经允许不得转载:171主机测评 » Docker Swarm 集群管理详解:从入门到实践
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址