在 Ubuntu 上部署 Docker Swarm 集群(完整指南)
本文适用于 Ubuntu 20.04 / 22.04 LTS,手把手教你搭建一个高可用的 Docker Swarm 集群,包含 1 个管理节点和 2 个工作节点。
Docker Swarm 集群解析
核心概念与架构
Docker Swarm 是 Docker 官方提供的原生容器编排工具,可将多个 Docker 主机(物理服务器、虚拟机、云实例等)抽象为一个统一的虚拟主机,实现集群化管理和服务编排。其架构采用经典的“管理节点(Manager)-工作节点(Worker)”模式:
- 管理节点(Manager)
- 职责:维护集群状态、调度任务、管理配置、负载均衡、故障检测与恢复。
- 高可用性:支持多管理节点(建议奇数个,如3-5个),通过 Raft 共识算法保持状态同步,避免“脑裂”问题。
- 安全性:内置 TLS 加密通信、节点认证、角色授权,支持自动密钥轮换。
- 工作节点(Worker)
- 职责:执行管理节点分配的任务(如运行容器),通过代理(Agent)汇报任务状态。
- 设计哲学:简单可靠,无需感知全局状态,专注于任务执行。
核心优势
- 极简操作体验
- 原生支持:无需额外安装软件,Docker 1.12+ 版本内置 Swarm 功能,直接使用标准 Docker 命令管理集群。
- 声明式服务模型:通过 Docker Compose 文件格式定义服务,支持滚动更新、扩缩容、健康检查等高级特性。
- 服务发现:服务间通过服务名直接通信,无需关心节点位置。
- 高可用性与容错性
- 自动故障转移:节点或容器故障时,自动在其他健康节点重启服务,确保业务连续性。
- 多副本机制:通过设置服务副本数量(
--replicas),确保服务在节点故障时快速恢复。
- 负载均衡与资源优化
- 内置负载均衡:自动分配容器到不同节点,支持轮询、最小连接等策略。
- 智能调度:综合考虑节点资源利用率、网络位置等因素,选择最佳节点运行容器。
- 安全性
- 加密通信:所有节点间通信通过 TLS 加密,防止中间人攻击。
- 网络隔离:支持 Overlay 网络,实现跨节点容器通信,同时隔离不同服务。
适用场景
- 中小规模集群
- 适合需要快速搭建、简单管理的容器化应用,如 Web 服务、微服务架构。
- 对比 Kubernetes(K8s),Swarm 更轻量,学习成本低,适合资源有限或团队熟悉 Docker 的场景。
- 边缘计算与物联网
- 支持资源受限的设备(如树莓派),适合边缘节点分散、需要统一管理的场景。
- 开发与测试环境
- 快速模拟生产环境,验证服务高可用性和负载均衡能力。
一、环境准备
1. 节点规划
| 角色 | 主机名 | IP 地址 |
|---|---|---|
| 管理节点 | manager | 192.168.22.103 |
| 工作节点1 | worker1 | 192.168.22.131 |
| 工作节点2 | worker2 | 192.168.22.215 |
2. 基础配置(所有节点执行)
(1)设置主机名
sudo hostnamectl set-hostname manager # 在 manager 节点
sudo hostnamectl set-hostname worker1 # 在 worker1 节点
sudo hostnamectl set-hostname worker2 # 在 worker2 节点
(2)配置 hosts 解析(所有节点)
cat << EOF | sudo tee /etc/hosts
127.0.0.1 localhost
192.168.22.103 manager
192.168.22.131 worker1
192.168.22.215 worker2
EOF
(3)关闭交换分区(Swarm 推荐)
sudo swapoff -a
# 永久关闭:注释掉 /etc/fstab 中的 swap 行
sudo sed -i '/ swap / s/^/#/' /etc/fstab
(4)允许转发(Docker 网络需要)
cat <<EOF | sudo tee /etc/sysctl.d/99-docker-swarm.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOFsudo sysctl --system
二、安装 Docker Engine(所有节点)
点击安装docker文章
三、初始化 Docker Swarm 集群(仅在 manager 节点)
# 初始化 Swarm,指定本机 IP 用于集群通信
docker swarm init --advertise-addr 192.168.22.135
成功后会输出类似:
🔑 请复制好这个 join 命令,下一步要用。
验证集群状态:
docker info | grep -A 5 "Swarm"
# 或
docker node ls

四、添加工作节点(在 worker1 和 worker2 上执行)
在每个工作节点上运行上一步中生成的 docker swarm join 命令,例如:
docker swarm join --token SWMTKN-1-1r8pzafwz111nuuadiny7c9svywve6sll7w8yahrgt3szlyzgl-aiqy7vj7gd1j0oaibj2zeb6gt 192.168.22.103:2377
成功提示:
This node joined a swarm as a worker.
回到 manager 节点,查看节点状态:
docker node ls
输出(状态应为 Ready):

五、部署测试服务
1. 创建 Overlay 网络(跨主机通信)
docker network create --driver overlay my-overlay
2. 部署 Nginx 服务(3 副本)
docker service create \--name web \--publish published=8080,target=80 \--network my-overlay \--replicas 3 \nginx:latest
3. 验证服务
docker service ls # 查看服务列表
docker service ps web # 查看副本分布

4. 访问服务
在任意节点(包括 manager、worker1、worker2)上访问:
http://<任意节点IP>:8080


看到 Nginx 欢迎页。
💡 Docker Swarm 的路由网格(Routing Mesh)会自动将请求转发到任意副本。
✅ 至此,你已在 Ubuntu 上成功搭建了一个功能完整的 Docker Swarm 集群!
