Docker Swarm 容器编排集群搭建
Docker Swarm 是 Docker 内置的容器编排引擎,无需安装额外组件即可将多台 Docker 主机组成集群,实现服务的高可用部署和负载均衡。相比 Kubernetes,Swarm 学习曲线更平缓、配置更简单,非常适合中小规模的容器化部署场景。本文将介绍如何在搬瓦工 VPS 上搭建 Docker Swarm 集群。
一、环境要求
- Docker:所有节点需安装 Docker(20.10+)。
- 网络:各节点间需开放端口 2377/tcp(管理)、7946/tcp+udp(通信)、4789/udp(覆盖网络)。
- 节点数量:最少 1 个 Manager 节点。生产环境推荐 3 个 Manager + N 个 Worker。
- 内存:每个节点至少 1GB。
搬瓦工 VPS 购买地址:bwh81.net,使用优惠码 NODESEEK2026 享受 6.77% 折扣。
二、初始化 Swarm 集群
2.1 在 Manager 节点上初始化
docker swarm init --advertise-addr MANAGER_IP
将 MANAGER_IP 替换为 Manager 节点的公网或内网 IP。命令执行后会输出加入集群的 token。
2.2 添加 Worker 节点
在每个 Worker 节点上执行 init 输出的命令:
docker swarm join --token SWMTKN-1-xxxxx MANAGER_IP:2377
2.3 添加 Manager 节点
获取 Manager 加入令牌:
docker swarm join-token manager
2.4 查看集群状态
docker node ls
三、防火墙配置
# 管理端口
ufw allow 2377/tcp
# 节点通信
ufw allow 7946/tcp
ufw allow 7946/udp
# Overlay 网络
ufw allow 4789/udp
四、部署服务
4.1 创建简单服务
docker service create \
--name web \
--replicas 3 \
--publish 80:80 \
nginx:alpine
4.2 查看服务状态
docker service ls
docker service ps web
docker service logs web
4.3 扩缩容
# 扩容到 5 个副本
docker service scale web=5
# 缩容到 2 个副本
docker service scale web=2
五、使用 Stack 部署(推荐)
使用 Docker Compose 文件格式部署 Swarm Stack。创建 stack.yml:
version: '3.8'
services:
web:
image: nginx:alpine
deploy:
replicas: 3
update_config:
parallelism: 1
delay: 10s
order: start-first
rollback_config:
parallelism: 1
delay: 5s
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
resources:
limits:
cpus: '0.5'
memory: 128M
reservations:
cpus: '0.1'
memory: 64M
ports:
- "80:80"
networks:
- webnet
redis:
image: redis:7-alpine
deploy:
replicas: 1
placement:
constraints:
- node.role == manager
networks:
- webnet
networks:
webnet:
driver: overlay
# 部署 Stack
docker stack deploy -c stack.yml myapp
# 查看 Stack 状态
docker stack ls
docker stack services myapp
docker stack ps myapp
# 删除 Stack
docker stack rm myapp
六、Overlay 网络
Swarm 的 Overlay 网络允许跨节点的容器相互通信:
# 创建 Overlay 网络
docker network create --driver overlay --attachable my-overlay
# 在服务中使用
docker service create \
--name api \
--network my-overlay \
myapp-api:latest
七、滚动更新
# 更新服务镜像
docker service update --image nginx:1.25-alpine web
# 指定更新策略
docker service update \
--update-parallelism 1 \
--update-delay 10s \
--update-order start-first \
--image nginx:1.25-alpine web
# 回滚到上一个版本
docker service rollback web
八、配置和密钥管理
8.1 Docker Config
# 创建配置
echo "server { listen 80; }" | docker config create nginx-conf -
# 在服务中使用
docker service create \
--name web \
--config source=nginx-conf,target=/etc/nginx/conf.d/default.conf \
nginx:alpine
8.2 Docker Secret
# 创建密钥
echo "my_secure_password" | docker secret create db_password -
# 在服务中使用
docker service create \
--name db \
--secret db_password \
-e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/db_password \
mysql:8.0
九、节点管理
# 设置节点为维护模式
docker node update --availability drain NODE_NAME
# 恢复节点
docker node update --availability active NODE_NAME
# 添加标签
docker node update --label-add zone=us-west NODE_NAME
# 移除节点
docker node rm NODE_NAME
# 节点离开集群(在节点上执行)
docker swarm leave --force
十、常见问题
服务无法跨节点通信
检查防火墙是否开放了必要端口(2377、7946、4789),以及 Overlay 网络是否正常:
docker network inspect my-overlay
服务副本一直 Pending
docker service ps --no-trunc web
常见原因是节点资源不足或镜像拉取失败。
Manager 节点故障
生产环境应配置 3 个 Manager 节点以保证高可用。单 Manager 节点故障将导致整个集群无法管理。
总结
Docker Swarm 是入门容器编排的最佳选择,无需额外组件即可实现集群管理、服务发现和负载均衡。对于需要更强大功能的场景,可以考虑迁移到 Kubernetes 或 K3S。选购搬瓦工 VPS 请参考 全部方案,使用优惠码 NODESEEK2026 享受 6.77% 折扣。