第五部分-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一组相关服务的组合类似 Compose3. 初始化 Swarm 集群3.1 初始化 Manager 节点# 初始化 Swarm当前节点成为 Managerdockerswarm 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# 指定监听端口默认 2377dockerswarm init --advertise-addr192.168.1.10:2377 --listen-addr0.0.0.0:23773.2 查看集群状态# 查看节点信息dockernodels# 查看 Swarm 信息dockerinfo|grep-A10Swarm# 查看 Swarm 状态dockersystem info|grepSwarm# 查看当前节点角色dockernodeinspect self--format{{.Spec.Role}}4. 加入节点4.1 Worker 节点加入# 在 Worker 节点执行从 Manager 获取的 tokendockerswarmjoin--tokenSWMTKN-1-xxx192.168.1.10:2377# 手动获取 Worker token在 Manager 上dockerswarm join-token worker# 验证节点已加入在 Manager 上dockernodels4.2 Manager 节点加入# 获取 Manager token在现有 Manager 上dockerswarm join-token manager# 在新节点执行dockerswarmjoin--tokenSWMTKN-2-xxx192.168.1.10:23775. 节点管理5.1 节点操作# 列出所有节点dockernodels# 查看节点详情dockernodeinspect node1# 查看节点任务dockernodepsnode1# 更新节点状态设置为停用dockernodeupdate--availabilitydrain node1# 更新节点状态设置为激活dockernodeupdate--availabilityactive node1# 更换节点角色Worker → Managerdockernodepromote node2# 更换节点角色Manager → Workerdockernodedemote node2# 删除节点dockernodermnode25.2 节点标签# 添加标签dockernodeupdate --label-addenvproduction node1dockernodeupdate --label-addstoragessd node2# 查看标签dockernodeinspect node1--format{{.Spec.Labels}}# 删除标签dockernodeupdate --label-rmenvnode16. 服务管理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:latest6.2 查看服务# 列出服务dockerservicels# 查看服务详情dockerserviceinspect web# 查看服务任务容器dockerservicepsweb# 查看服务日志dockerservicelogs webdockerservicelogs-fwebdockerservicelogs--tail50web6.3 扩缩容# 扩容到 5 个副本dockerservicescaleweb5# 使用 update 命令dockerserviceupdate--replicas5web# 查看扩缩容结果dockerservicepsweb6.4 更新服务# 更新镜像dockerserviceupdate--imagenginx:alpine web# 更新端口配置dockerserviceupdate --publish-add8080:80 webdockerserviceupdate --publish-rm8080:80 web# 更新环境变量dockerserviceupdate --env-addNODE_ENVproduction webdockerserviceupdate --env-rm NODE_ENV web# 更新资源限制dockerserviceupdate --limit-cpu1webdockerserviceupdate --limit-memory 1G web# 更新重启策略dockerserviceupdate --restart-condition on-failure webdockerserviceupdate --restart-delay 10s web6.5 删除服务# 删除服务dockerservicermweb# 强制删除dockerservicerm--forceweb7. 滚动更新# 创建带更新配置的服务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-staterunning8. 网络管理8.1 Overlay 网络# 创建 Overlay 网络dockernetwork create--driveroverlay--attachablemy-overlay# 创建服务并使用 Overlay 网络dockerservicecreate--nameweb--networkmy-overlay nginx# 查看 Overlay 网络dockernetwork inspect my-overlay8.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|grepswarm# 检查节点状态dockernodeinspect self# 离开集群Workerdockerswarm leave# 离开集群Manager强制dockerswarm leave--force# 重新加入# 需要先离开然后重新 join12. 常见问题Q1: Manager 节点故障怎么办有多个 Manager 节点时自动选举单节点需要恢复。Q2: 如何备份 Swarm 配置备份/var/lib/docker/swarm目录。Q3: 服务无法调度检查节点资源、标签约束、节点状态。13. 小结Swarm是 Docker 原生容器编排工具节点角色Manager管理、Worker运行服务定义容器的运行方式任务服务的运行实例滚动更新零停机更新服务Overlay 网络跨主机容器通信内置负载均衡自动分发请求Raft 协议保证 Manager 一致性