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

相关推荐
吹什么轩7 分钟前
linux系统复习:全景串联
linux·运维·服务器
Elastic 中国社区官方博客11 分钟前
5 分钟内将 56 页扫描文档转化为带引用的答案:面向搜索无法读取的文档的检索增强生成流水线
大数据·运维·人工智能·elasticsearch·搜索引擎·信息可视化·全文检索
John_Hui25 分钟前
第 1 篇:VMware 安装 Ubuntu 24.04.3 Server
linux·运维·ubuntu
长不大的杨瑞杰1 小时前
OpenCode v2 团队治理实战:多仓库 Policy、灰度发布与故障回滚
运维·人工智能·安全·软件工程·devops
海的透彻2 小时前
如何让docker容器启动时用自定义的用户
java·docker·dubbo
码完就睡2 小时前
Linux——以太网协议
运维·服务器·网络·1024程序员节
时间售卖铺2 小时前
MySQL 日志管理
运维·数据库·mysql·云原生
晴天的雨.9923 小时前
【Linux】make & Makefile 核心知识点
linux·运维·服务器
丘山望岳3 小时前
Linux基础指令入门篇
linux·运维·服务器
hhhjhl3 小时前
Zod 跨端三方库仓颉适配全流程
linux·运维·ubuntu