第十三篇:《Docker Swarm 集群基础》

单机 Docker 已经很强大了,但生产环境需要高可用、弹性伸缩、滚动更新。Docker Swarm 是 Docker 原生的集群和编排工具,它将一组 Docker 主机变成一个虚拟的单一主机,让你可以像操作单机一样管理集群。本文将带你从零搭建 Swarm 集群,理解 Manager 与 Worker 角色,部署第一个服务,并体验滚动更新和负载均衡。

一、什么是 Docker Swarm?

Docker Swarm 是 Docker 引擎内置的集群管理和编排功能。它将多个 Docker 主机(节点)组成一个集群,并提供以下核心能力:

集群管理:节点加入、角色划分(Manager / Worker)。

服务编排:以"服务"为单位部署,声明副本数、网络、存储。

负载均衡:内置 routing mesh,自动将请求分发到多个副本。

滚动更新:零停机更新服务,支持回滚。

服务发现:通过服务名访问,自动 DNS 轮询。

与 Kubernetes 相比,Swarm 更轻量、更易上手,与 Docker API 完全兼容,适合中小规模集群。

二、Swarm 核心概念

三、搭建 Swarm 集群

3.1 环境准备

准备三台 Linux 主机(物理机或虚拟机),均安装 Docker Engine(≥ 18.09)。假设 IP:

manager1: 192.168.1.10

worker1: 192.168.1.11

worker2: 192.168.1.12

所有节点之间网络互通,开放端口:

2377/tcp:集群管理通信

7946/tcp+udp:节点间通信

4789/udp:overlay 网络流量

3.2 初始化 Swarm(在 manager1 上)

bash 复制代码
docker swarm init --advertise-addr 192.168.1.10

输出类似:

text

Swarm initialized: current node (xxxx) is now a manager.

To add a worker to this swarm, run 'docker swarm join --token SWMTKN-1-xxx 192.168.1.10:2377'

--advertise-addr 指定其他节点可访问的 IP。

3.3 添加 Worker 节点

在 worker1 和 worker2 上执行上面输出的 docker swarm join 命令:

bash 复制代码
docker swarm join --token SWMTKN-1-xxx 192.168.1.10:2377

在 manager 上验证节点:

bash 复制代码
docker node ls

输出:

text

ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION

xxx * manager1 Ready Active Leader 20.10.21

yyy worker1 Ready Active 20.10.21

zzz worker2 Ready Active 20.10.21

3.4 添加 Manager 节点(高可用)

生产环境建议至少 3 个 Manager 节点。在其他机器上执行 docker swarm join --token (先获取 token:docker swarm join-token manager)。

四、部署第一个服务

4.1 创建服务

bash 复制代码
docker service create --name web --replicas 3 -p 8080:80 nginx:alpine

--name web:服务名

--replicas 3:3 个副本

-p 8080:80:发布端口到集群的每个节点的 8080 端口(Routing Mesh 特性)

4.2 查看服务状态

bash 复制代码
docker service ls
docker service ps web

输出显示 3 个任务分布在不同节点上。

4.3 访问服务

访问任一节点的 IP:8080(例如 http://192.168.1.10:8080),都能看到 Nginx 欢迎页。即使访问的是 worker 节点,Swarm 的 routing mesh 也会将请求转发到运行任务的节点。

五、服务伸缩与更新

5.1 扩容副本数

bash 复制代码
docker service scale web=5

5.2 滚动更新

bash 复制代码
docker service update --image nginx:1.25 --update-parallelism 2 --update-delay 10s web

--update-parallelism 2:每次更新 2 个副本

--update-delay 10s:每批间隔 10 秒

Swarm 会逐步替换旧版本容器,实现零停机更新。

5.3 回滚

bash 复制代码
docker service rollback web

六、服务发现与负载均衡

Swarm 内置 DNS 服务。在集群内,任何容器可以通过服务名访问其他服务。

例如,创建一个 api 服务,副本 2,内部端口 3000。另一个 web 服务可以通过 http://api:3000 访问。

测试方法:docker run --rm -it alpine sh,然后 apk add curl,curl http://api:3000

七、管理节点和 drain 模式

如果需要对节点进行维护,可以将其置为 drain 状态,Swarm 会将其上的任务迁移到其他 Active 节点。

bash 复制代码
docker node update --availability drain worker1

之后 docker node inspect worker1 可看到状态。

恢复:

bash 复制代码
docker node update --availability active worker1

八、常用命令速查

命令 作用

docker swarm init 初始化集群

docker swarm join-token worker 获取 worker 加入令牌

docker node ls 列出节点

docker node promote 将 worker 提升为 manager

docker service create 创建服务

docker service ls 列出服务

docker service ps 查看任务分布

docker service scale 扩缩容

docker service update 更新服务(镜像、环境变量等)

docker service rm 删除服务

docker swarm leave 节点退出集群

九、实践:部署一个高可用 WordPress

虽然 Swarm 不直接支持 Docker Compose v3 的全部特性,但可以使用 docker stack deploy(下一章详述)。简单起见,这里用 docker service 创建:

bash 复制代码
# 创建 overlay 网络
docker network create -d overlay appnet

# MySQL 服务(单副本,需持久存储)
docker service create --name mysql \
  --network appnet \
  --secret mysql_password \
  -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql_password \
  -e MYSQL_DATABASE=wordpress \
  --mount type=volume,source=mysql-data,target=/var/lib/mysql \
  mysql:8.0

# WordPress 服务(多副本)
docker service create --name wordpress \
  --network appnet \
  -p 80:80 \
  -e WORDPRESS_DB_HOST=mysql \
  -e WORDPRESS_DB_USER=root \
  -e WORDPRESS_DB_PASSWORD_FILE=/run/secrets/mysql_password \
  --secret mysql_password \
  wordpress:latest

十、小结

Docker Swarm 为那些不想引入复杂 Kubernetes 的团队提供了原生、易用的集群方案。通过本文,你学会了:

初始化 Swarm 并添加节点

部署、扩缩容、更新服务

理解 routing mesh 和服务发现

相关推荐
biter down2 小时前
6:参数化
运维·服务器
海域云-罗鹏2 小时前
企业服务器遭到网络攻击该如何解决?应急处理与长效防护方案
运维·服务器·安全
取经蜗牛3 小时前
docker环境中redis连接三种场景配置指南,物理机、wsl、docker
redis·docker·容器
YOU OU3 小时前
Linux基本使用和程序部署
linux·运维·服务器
尼莫点nemo3 小时前
docker-builder:把 .devcontainer/ 从手写变成一句话生成
docker
AI行业学习3 小时前
PuTTY 工具下载部署、基础配置及 SSH 远程服务器连接完整操作指南Windows 平台 【2026.6.1】
运维·windows·ssh
jiayong233 小时前
CI/CD深度解析01-核心概念与原理
运维·git·ci/cd
fred_kang3 小时前
如何找到 Linux 服务器上某个 URL 路径对应的实际部署位置
linux·运维·服务器
zandy10114 小时前
Hermes Agent 2026年6月最新安装教程
docker·github·agent