第五部分-DockerCompose——27. Swarm 基础
2026/5/11 1:58:34 网站建设 项目流程

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 一致性

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询