Docker Swarm 容器编排实战指南

一、Docker Swarm 概述

Docker Swarm 是 Docker Engine 原生内置的轻量级容器编排引擎,自 Docker 1.12 版本起深度集成,无需额外安装 Consul、etcd 等第三方组件,即可实现集群管理、服务调度、故障自愈、负载均衡等编排能力。

相比 Kubernetes,Swarm 部署门槛低、操作简单、与 Docker 命令体系高度兼容,非常适合作为容器编排技术的入门方案,也适用于小规模生产环境、开发测试集群场景。

二、核心概念

2.1 Swarm 集群

由多台运行 Docker Engine 的主机通过网络组成的协同工作集合。集群对外表现为统一的资源池,用户只需声明应用的期望状态(副本数、资源、端口等),由集群自动完成调度、部署和运维,而非手动指定应用运行在哪台服务器。

集群能力核心价值:

  • 高可用:节点故障时自动迁移服务
  • 负载均衡:多副本分摊流量
  • 弹性伸缩:根据负载动态调整副本数量

2.2 节点(Node)

集群中的每一台 Docker 主机都是一个节点,分为两类角色:

  • Manager 节点:负责集群管理、编排调度、维护服务的期望状态。多 Manager 节点通过 Raft 共识算法选举 Leader,保证集群高可用。
  • Worker 节点:接收 Manager 派发的任务,运行服务容器,并定期向 Manager 上报自身状态与任务运行状态。

默认配置下 Manager 节点同时兼任 Worker 角色,也可配置为专职管理模式,不再运行业务容器。

2.3 服务(Service)

Swarm 编排的最小单位,定义了应用运行的期望状态,包括镜像、副本数量、端口映射、资源限制等。 Swarm 的核心编排逻辑就是持续调谐:不断对比实际状态与期望状态,自动修复偏差,保证服务始终符合定义。

2.4 副本(Replica)

服务的单个运行实例(对应一个容器)。一个服务可以有多个副本,分布式调度在不同 Worker 节点上。

三、Swarm 集群搭建

3.1 环境规划

节点角色 主机名 IP 地址
Manager swarm-manager 192.168.108.30
Worker swarm-worker1 192.168.108.31
Worker swarm-worker2 192.168.108.32
  • 操作系统:CentOS Stream 8
  • Docker 版本:≥ v1.12
  • 前置要求:所有节点网络互通

3.2 节点前置配置(所有节点执行)

配置防火墙为信任域,保证集群通信端口互通:

复制代码
firewall-cmd --set-default-zone=trusted

3.3 初始化集群(Manager 节点执行)

复制代码
docker swarm init --advertise-addr 192.168.108.30
  • --advertise-addr:指定集群内通信的本机地址

命令输出包含三类信息:

  1. 集群创建成功,当前节点成为 Manager Leader
  2. Worker 节点加入集群的完整命令
  3. Manager 节点加入集群的完整命令

查看当前节点状态:

复制代码
docker node ls

3.4 Worker 节点加入集群

如果丢失了加入命令,可在 Manager 节点重新获取:

复制代码
# 获取 Worker 加入令牌
docker swarm join-token worker

在两个 Worker 节点分别执行加入命令:

复制代码
docker swarm join --token SWMTKN-1-xxxx 192.168.108.30:2377

加入完成后,在 Manager 节点验证集群状态:

复制代码
docker node ls

三个节点状态均为 ReadyActive,代表集群搭建完成。

四、Service 服务部署

4.1 创建服务

复制代码
docker service create --name web_server httpd:latest
  • --name web_server:定义服务名称
  • httpd:latest:服务使用的镜像

4.2 查看服务状态

复制代码
# 查看服务列表
docker service ls

REPLICAS 列格式为 期望副本数/运行副本数,例如 1/1 代表 1 个副本全部正常运行。

查看副本的节点分布与运行状态:

复制代码
docker service ps web_server

4.3 本地验证

在副本所在的 Worker 节点查看运行中的容器:

复制代码
docker ps

五、服务伸缩(Scale)

5.1 扩容服务

将服务副本数扩容至 5 个:

复制代码
docker service scale web_server=5

Swarm 会自动根据各节点资源情况,将副本均匀调度到集群节点上。

5.2 缩容服务

将副本数缩减至 3 个:

复制代码
docker service scale web_server=3

5.3 Manager 节点业务排空

默认 Manager 节点也会运行业务副本。若希望 Manager 专职负责集群管理,可排空节点上的业务容器:

复制代码
docker node update --availability drain swarm-manager
  • drain 状态:节点不再接收新的调度任务,现有副本会逐步迁移到其他健康节点
  • 适用于 Manager 角色隔离、节点维护升级等场景

恢复节点调度能力:

复制代码
docker node update --availability active swarm-manager

六、故障转移(Failover)

Swarm 内置自愈机制:当节点发生故障,Manager 检测到节点离线后,会自动将故障节点上的服务副本调度到其他健康节点,始终维持服务的期望副本数。

6.1 模拟节点故障

在 swarm-worker1 上执行关机,模拟节点宕机:

复制代码
shutdown now

6.2 观察自愈效果

在 Manager 节点查看节点状态,swarm-worker1 状态变为 Down

复制代码
docker node ls

查看服务副本状态:

复制代码
docker service ps web_server

可以观察到:

  • 原故障节点上的副本状态标记为 Shutdown
  • 在其他健康节点上自动启动了新的副本
  • 服务总副本数始终维持在期望值

七、服务网络与外部访问

7.1 默认访问限制

默认创建的 Service 仅具备容器内部 IP,没有映射主机端口,只能在 Docker 主机本地通过容器 IP 访问,无法对外提供服务。

7.2 发布服务端口

创建服务时指定端口映射,将服务暴露到主机:

复制代码
# 新建服务时发布端口
docker service create --name web_server --publish 8080:80 --replicas=2 httpd:latest

# 为已有服务添加端口发布
docker service update --publish-add 8080:80 web_server

将容器内的 80 端口映射到主机的 8080 端口。

7.3 Routing Mesh(路由网格)

Swarm 的核心网络特性:访问集群中任意一个节点的发布端口,都可以正常访问到服务

原理:

  1. Swarm 自动创建 ingress overlay 跨主机网络,实现不同节点上的容器互通
  2. 所有节点都会监听已发布的端口
  3. 请求到达任意节点后,内置路由网格会自动转发到健康的服务副本
  4. 即使当前节点上没有运行该服务的副本,也能完成转发

验证效果:

复制代码
# 三个节点的 8080 端口均可访问服务
curl http://192.168.108.30:8080
curl http://192.168.108.31:8080
curl http://192.168.108.32:8080

7.4 集群网络说明

网络名称 类型 作用
ingress overlay 跨节点容器通信,支撑路由网格与服务发布
docker_gwbridge bridge 容器访问外网的网关桥
host host 共享主机网络栈
相关推荐
speop1 小时前
hell-gpu| TASK01-2
linux·运维·算法
再卷还是菜1 小时前
Cephfs总结及kubernetes+Cephfs的整合项目
云原生·容器·kubernetes
我科绝伦(Huanhuan Zhou)2 小时前
Linux rpm包损坏解决方案
运维
数据库小学妹2 小时前
MySQL死锁排查:锁机制原理、死锁日志与information_schema定位
运维·数据库·mysql
JoyCong19982 小时前
从iPhone Ultra到ToDesk:折叠大屏时代的效率革命,硬件只是开始
大数据·运维·ios·智能手机·iphone·远程工作·远程操作
力江2 小时前
GitLab 私有化部署实战 —— 从 Omnibus 到 Docker 的踩坑之旅
docker·容器·gitlab
山岚的运维笔记2 小时前
mysql 专业笔记 -- 第 1 章:MySQL 入门
运维·数据库·笔记·后端·学习·mysql·dba
邪修king2 小时前
Re:Linux 系统篇(十五):进程篇(四):进程切换深度解析 —— CPU 寄存器、进程上下文与切换全流程万字详解
linux·运维·服务器
深念Y2 小时前
Docker 镜像体积从 110MB 降到 13MB 后端服务的瘦身
运维·docker·容器