当前位置: 首页 > news >正文

第五部分-DockerCompose——27. Swarm 基础

27. Swarm 基础

1. Docker Swarm 概述

Docker Swarm 是 Docker 原生的容器编排工具,可以将多个 Docker 主机组成一个集群,统一管理和调度容器服务。

┌─────────────────────────────────────────────────────────────┐ │ Docker Swarm 架构 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────┐ │ │ │ Manager │ │ │ │ (Leader) │ │ │ └──────┬──────┘ │ │ │ │ │ ┌─────────────────┼─────────────────┐ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │ │ Manager │ │ Worker │ │ Worker │ │ │ │ (Follower)│ │ │ │ │ │ │ └───────────┘ └───────────┘ └───────────┘ │ │ │ │ 角色说明: │ │ - Manager(管理节点):集群管理、调度决策 │ │ - Worker(工作节点):运行容器 │ │ - Leader(领导节点):Manager 中的单领导者 │ │ │ └─────────────────────────────────────────────────────────────┘

2. Swarm 核心概念

概念说明
NodeSwarm 集群中的节点
Service定义容器运行方式(镜像、端口、副本数)
Task服务的运行实例(容器)
Stack一组相关服务的组合(类似 Compose)

3. 初始化 Swarm 集群

3.1 初始化 Manager 节点

# 初始化 Swarm(当前节点成为 Manager)dockerswarm init --advertise-addr192.168.1.10# 输出示例# Swarm initialized: current node (node1) is now a manager.# To add a worker to this swarm, run the following command:# docker swarm join --token SWMTKN-1-xxx 192.168.1.10:2377# To add a manager to this swarm, run 'docker swarm join-token manager' and follow the output.# 指定网卡dockerswarm init --advertise-addr eth0# 指定监听端口(默认 2377)dockerswarm init --advertise-addr192.168.1.10:2377 --listen-addr0.0.0.0:2377

3.2 查看集群状态

# 查看节点信息dockernodels# 查看 Swarm 信息dockerinfo|grep-A10Swarm# 查看 Swarm 状态dockersystem info|grepSwarm# 查看当前节点角色dockernodeinspect self--format'{{.Spec.Role}}'

4. 加入节点

4.1 Worker 节点加入

# 在 Worker 节点执行(从 Manager 获取的 token)dockerswarmjoin--tokenSWMTKN-1-xxx192.168.1.10:2377# 手动获取 Worker token(在 Manager 上)dockerswarm join-token worker# 验证节点已加入(在 Manager 上)dockernodels

4.2 Manager 节点加入

# 获取 Manager token(在现有 Manager 上)dockerswarm join-token manager# 在新节点执行dockerswarmjoin--tokenSWMTKN-2-xxx192.168.1.10:2377

5. 节点管理

5.1 节点操作

# 列出所有节点dockernodels# 查看节点详情dockernodeinspect node1# 查看节点任务dockernodepsnode1# 更新节点状态(设置为停用)dockernodeupdate--availabilitydrain node1# 更新节点状态(设置为激活)dockernodeupdate--availabilityactive node1# 更换节点角色(Worker → Manager)dockernodepromote node2# 更换节点角色(Manager → Worker)dockernodedemote node2# 删除节点dockernodermnode2

5.2 节点标签

# 添加标签dockernodeupdate --label-addenv=production node1dockernodeupdate --label-addstorage=ssd node2# 查看标签dockernodeinspect node1--format'{{.Spec.Labels}}'# 删除标签dockernodeupdate --label-rmenvnode1

6. 服务管理

6.1 创建服务

# 创建简单服务dockerservicecreate--nameweb--replicas3nginx# 创建服务并映射端口dockerservicecreate--nameweb\--publish8080:80\--replicas3\nginx# 创建服务并指定网络dockernetwork create--driveroverlay app-netdockerservicecreate--nameweb\--networkapp-net\--publish80:80\--replicas3\nginx# 创建服务并指定资源限制dockerservicecreate--nameapp\--limit-cpu0.5\--limit-memory 512M\--replicas3\myapp:latest

6.2 查看服务

# 列出服务dockerservicels# 查看服务详情dockerserviceinspect web# 查看服务任务(容器)dockerservicepsweb# 查看服务日志dockerservicelogs webdockerservicelogs-fwebdockerservicelogs--tail50web

6.3 扩缩容

# 扩容到 5 个副本dockerservicescaleweb=5# 使用 update 命令dockerserviceupdate--replicas5web# 查看扩缩容结果dockerservicepsweb

6.4 更新服务

# 更新镜像dockerserviceupdate--imagenginx:alpine web# 更新端口配置dockerserviceupdate --publish-add8080:80 webdockerserviceupdate --publish-rm8080:80 web# 更新环境变量dockerserviceupdate --env-addNODE_ENV=production webdockerserviceupdate --env-rm NODE_ENV web# 更新资源限制dockerserviceupdate --limit-cpu1webdockerserviceupdate --limit-memory 1G web# 更新重启策略dockerserviceupdate --restart-condition on-failure webdockerserviceupdate --restart-delay 10s web

6.5 删除服务

# 删除服务dockerservicermweb# 强制删除dockerservicerm--forceweb

7. 滚动更新

# 创建带更新配置的服务docker service create \--name app \--replicas 5 \--update-parallelism 2 \--update-delay 10s \--update-failure-action pause \--update-monitor 30s \--update-order start-first \ myapp:1.0# 更新镜像(触发滚动更新)docker service update--image myapp:2.0 app# 查看更新状态docker service ps app--filter "desired-state=running"

8. 网络管理

8.1 Overlay 网络

# 创建 Overlay 网络dockernetwork create--driveroverlay--attachablemy-overlay# 创建服务并使用 Overlay 网络dockerservicecreate--nameweb--networkmy-overlay nginx# 查看 Overlay 网络dockernetwork inspect my-overlay

8.2 服务发现

# 服务之间通过服务名通信# 创建两个服务dockerservicecreate--nameapi--networkmy-overlay myapidockerservicecreate--nameweb--networkmy-overlay nginx# web 服务可以通过 api 访问 api 服务# DNS 自动解析服务名到 VIP 或 IP 列表

9. 负载均衡

# Swarm 提供内置负载均衡# 创建服务dockerservicecreate\--nameweb\--publish8080:80\--replicas3\nginx# 请求会通过 Routing Mesh 分发到各副本# 访问任意节点的 8080 端口都会路由到服务实例# 查看服务 VIPdockerserviceinspect web--format'{{.Endpoint.VirtualIPs}}'

10. 常用命令速查

命令说明
docker swarm init初始化集群
docker swarm join加入集群
docker swarm leave离开集群
docker node ls列出节点
docker service create创建服务
docker service ls列出服务
docker service ps查看服务任务
docker service scale扩缩容
docker service update更新服务
docker service rm删除服务
docker service logs查看日志

11. 故障排查

# 查看 Swarm 状态dockerinfo|grep-A10Swarm# 查看 Manager 日志journalctl-udocker.service|grep"swarm"# 检查节点状态dockernodeinspect self# 离开集群(Worker)dockerswarm leave# 离开集群(Manager,强制)dockerswarm leave--force# 重新加入# 需要先离开,然后重新 join

12. 常见问题

Q1: Manager 节点故障怎么办?

有多个 Manager 节点时自动选举,单节点需要恢复。

Q2: 如何备份 Swarm 配置?

备份/var/lib/docker/swarm目录。

Q3: 服务无法调度?

检查节点资源、标签约束、节点状态。

13. 小结

  • Swarm是 Docker 原生容器编排工具
  • 节点角色:Manager(管理)、Worker(运行)
  • 服务:定义容器的运行方式
  • 任务:服务的运行实例
  • 滚动更新:零停机更新服务
  • Overlay 网络:跨主机容器通信
  • 内置负载均衡:自动分发请求
  • Raft 协议保证 Manager 一致性

http://www.jsqmd.com/news/792998/

相关文章:

  • 技术传播的困境与破局:如何让硬核创新在注意力经济中被看见
  • Flutter for OpenHarmony 代码片段收藏夹APP技术文章
  • VoIP技术解析:从协议架构到企业部署实战
  • 手把手教你为Slurm集群添加GTX 1080Ti GPU节点(附TensorFlow 1.14测试脚本)
  • 远程临场机器人:从微控制器到系统集成的工程实践
  • 工业控制系统安全:从网络分区到行为白名单的纵深防御实战
  • Sphinx + Read the Docs:构建你的开源项目文档自动化工作流
  • 基于Vite+React的企业级前端界面复刻实战:从QClaw模仿到项目模板
  • 基于Gemini多模态AI的自然语言命令行文件搜索工具开发实战
  • Godot游戏开发:模块化项目模板与事件总线架构实践
  • 超算联盟抗疫:430Petaflops算力如何加速病毒研究与药物发现
  • 从六七十年代科幻剧看电子工程演进:FPGA、EDA与硬件设计的怀旧漫谈
  • 多人在线会议怎么开?团队远程协作、设计审稿、IT运维三大场景完整攻略
  • Cursor编辑器AI编程规则引擎:定制化代码生成与团队协作规范
  • 电源设计全流程测量实战:从仿真到EMC的十大阶段与仪器技巧
  • Visual Studio AI助手实战:Visual chatGPT Studio提升.NET开发效率
  • 基于ESP32-S3的嵌入式AI语音交互设备全栈开发指南
  • TalkReplay:构建本地化AI编程对话时光机,实现知识持久化管理
  • Mermaid Live Editor终极指南:3分钟掌握免费在线图表编辑神器
  • 芯片功耗验证:从约束随机到系统级场景化测试的演进
  • Dify插件集成Mem0 AI:为LLM应用构建长期记忆系统的实践指南
  • 电子工程师的职业价值:从技术实现到系统责任
  • ARM架构TTBR0_EL2与TTBR1_EL1寄存器深度解析
  • 第五部分-DockerCompose——28. 服务管理
  • 移动支付早期体验:从技术到生态的断层与演进
  • 暗黑2角色编辑器终极指南:5分钟打造完美角色,告别刷装烦恼
  • 3个核心功能深度解析:Recaf字节码搜索的技术实践
  • 从零到一:在VS Code中高效配置MicroPython PYB开发环境与文件同步
  • 新手在 Ubuntu 上首次接入 Taotoken 并调用多模型 API 的完整指南
  • 从阿波罗返回舱到混沌工程:逆向思维如何破解工程僵局