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🌺点点关注,收藏不迷路🌺 |




