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

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

四、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 共享主机网络栈
相关推荐
牛马工作号2 小时前
Mosquitto + ACME:从 Docker Compose 部署到 TLS 证书自动续期与加载
运维·docker·容器
Initialize-le5 小时前
Nginx 504 超时、499 一堆?网关排查法
运维·nginx
Android系统攻城狮7 小时前
Linux Gstreamer深度解析之gst_audio_ring_buffer_delay调用流程与实战(七十二)
linux·运维·服务器·gstreamer音视频·音视频进阶
快乐的韭菜根根8 小时前
ubuntu 安装slurm并配置
linux·运维·ubuntu
U-Mail邮件系统9 小时前
自建邮箱服务器有哪些软件?三款主流邮件服务器软件推荐
运维·服务器
空空dream9 小时前
03 | 离线部署 FastAPI + Ollama(qwen2:0.5b):从 Docker 联调到 Kubernetes 验收
docker·ai·kubernetes·fastapi
天远数科10 小时前
零信任架构实战:基于天远贷前风险报告构建自动化消金信贷风控与多头共债排查网关
运维·人工智能·架构·自动化
别动我齐刘海11 小时前
Linux 系统调试学习2
linux·运维·c++·人工智能·学习·机器学习·机器人
honsor12 小时前
机房IP化改造首选:以太网温湿度传感器,PoE供电+Modbus TCP一网搞定
linux·运维·服务器
星创易联12 小时前
PLC数据采集与远程运维平台:从边缘计算到集中监控
大数据·运维·边缘计算