第十三篇:《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 和服务发现

相关推荐
Avan_菜菜8 小时前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
程序员老赵9 小时前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程
WangMingHua11113 小时前
LM Studio Docker 部署——本地大模型一键启动
docker
SelectDB1 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
曲幽2 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
XIAOHEZIcode3 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220703 天前
如何搭建本地yum源(上)
运维
武子康3 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
大树886 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠6 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql