> 技术文档 > Docker Swarm 集群管理详解:从入门到实践

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 架构组件说明

  1. Manager Node

    • 维护集群状态
    • 调度服务
    • 提供集群API端点
    • 实现Raft一致性算法保证高可用
  2. 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-worker1docker-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 STATUSd3cw2s31q4q7z1q6y6z9j6z1w * swarm-manager Ready Active Leaderk9z3p6z2q4q7z1q6y6z9j6z1w 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 lsdocker 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

六、最佳实践

  1. 生产环境建议

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

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

    • 对于有状态服务使用volume
    • 考虑使用NFS等共享存储

七、常见问题排查

  1. 节点无法加入集群

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

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

    • 检查overlay网络创建
    • 验证DNS解析

八、总结

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


在这里插入图片描述

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