Docker Swarm 集群管理详解:从入门到实践
Docker Swarm 集群管理详解:从入门到实践
一、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-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
六、最佳实践
-
生产环境建议:
- 至少3个manager节点保证高可用
- 使用–limit-cpu和–limit-memory限制资源
- 配置日志驱动集中收集日志
-
网络建议:
- 使用overlay网络实现跨主机通信
- 为不同服务配置独立网络
-
存储建议:
- 对于有状态服务使用volume
- 考虑使用NFS等共享存储
七、常见问题排查
-
节点无法加入集群:
- 检查防火墙设置
- 验证token是否有效
- 确保manager节点可达
-
服务无法启动:
- 检查资源限制
- 查看服务日志
docker service logs
- 验证镜像是否在所有节点可用
-
网络连接问题:
- 检查overlay网络创建
- 验证DNS解析
八、总结
Docker Swarm 作为Docker原生的集群管理工具,提供了简单易用的容器编排能力。相比Kubernetes,Swarm学习曲线更平缓,适合中小规模部署场景。通过本文介绍的核心概念和实战操作,读者应该能够快速搭建和管理自己的Swarm集群。