第七章-DockerSwarm:容器集群的‘指挥官‘

7.1 为什么要用容器集群?

单台服务器的计算能力总是有限的,当应用访问量增大时,就需要多台服务器协同工作。容器集群就是把多台服务器组成一个整体,统一调度和管理容器。

7.1.1 单机与集群的区别

  • 单机模式:所有容器运行在一台服务器上,存在单点故障风险;
  • 集群模式:容器分布运行在多台服务器上,具有高可用性和弹性伸缩能力。

7.1.2 Swarm vs Kubernetes

目前主流的容器编排工具有两个:

  • Docker Swarm:Docker原生支持,配置简单,学习成本低;
  • Kubernetes(K8s):功能强大,生态丰富,但学习曲线陡峭。

对于中小型项目,Swarm是个不错的选择;大型项目可以考虑K8s。

7.2 Swarm核心概念

7.2.1 节点(Node)

节点是参与集群的Docker主机:

  • 管理节点(Manager):负责集群管理和任务调度;
  • 工作节点(Worker):负责运行容器任务。

7.2.2 服务(Service)

服务是集群中运行的容器,可以指定副本数量、更新策略等。

7.2.3 任务(Task)

任务是服务的具体实例,每个任务对应一个容器。

7.3 搭建Swarm集群

7.3.1 初始化管理节点

在第一台服务器上执行:

bash 复制代码
# 初始化Swarm集群,指定本机IP
docker swarm init --advertise-addr 192.168.1.100

# 输出类似以下信息:
# Swarm initialized: current node (abc123) is now a manager.
# To add a worker to this swarm, run the following command:
# docker swarm join --token SWMTKN-1-xxx 192.168.1.100:2377

7.3.2 添加工作节点

在其他服务器上执行上述join命令:

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

7.3.3 查看集群状态

在管理节点上执行:

bash 复制代码
# 查看节点列表
docker node ls

# 查看集群信息
docker info

7.4 部署服务

7.4.1 创建服务

bash 复制代码
# 创建一个包含3个副本的nginx服务
docker service create --name my-nginx --replicas 3 -p 80:80 nginx:alpine

7.4.2 管理服务

bash 复制代码
# 查看服务列表
docker service ls

# 查看服务详情
docker service ps my-nginx

# 扩缩容(调整副本数量)
docker service scale my-nginx=5

# 更新服务(比如升级镜像版本)
docker service update --image nginx:1.21-alpine my-nginx

# 删除服务
docker service rm my-nginx

7.5 滚动更新与回滚

7.5.1 滚动更新

Swarm支持平滑的滚动更新,无需停机:

bash 复制代码
# 设置更新策略:每次更新1个副本,间隔10秒
docker service update --image nginx:1.21-alpine \
  --update-parallelism 1 \
  --update-delay 10s \
  my-nginx

7.5.2 回滚操作

如果更新后发现问题,可以快速回滚:

bash 复制代码
# 回滚到上一个版本
docker service rollback my-nginx

7.6 实战:部署高可用WordPress集群

bash 复制代码
# 创建自定义网络
docker network create --driver overlay my-overlay-network

# 创建MySQL服务
docker service create --name mysql \
  --network my-overlay-network \
  --env MYSQL_ROOT_PASSWORD=rootpass \
  --env MYSQL_DATABASE=wordpress \
  --env MYSQL_USER=wpuser \
  --env MYSQL_PASSWORD=wppass \
  --mount type=volume,source=mysql_data,destination=/var/lib/mysql \
  mysql:5.7

# 创建WordPress服务
docker service create --name wordpress \
  --network my-overlay-network \
  --publish 8080:80 \
  --env WORDPRESS_DB_HOST=mysql \
  --env WORDPRESS_DB_USER=wpuser \
  --env WORDPRESS_DB_PASSWORD=wppass \
  --env WORDPRESS_DB_NAME=wordpress \
  --mount type=volume,source=wordpress_data,destination=/var/www/html \
  wordpress:latest

通过Swarm,我们可以轻松实现应用的高可用部署和弹性伸缩。

下一章,我们将探讨生产环境中的最佳实践和避坑指南。

相关推荐
二哈赛车手5 小时前
新人笔记---ApiFox的一些常见使用出错
java·笔记·spring
为何创造硅基生物5 小时前
C语言 结构体内存对齐规则(通俗易懂版)
c语言·开发语言
吃好睡好便好5 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
栗子~~5 小时前
JAVA - 二层缓存设计(本地缓冲+redis缓冲+广播所有本地缓冲失效) demo
java·redis·缓存
星寂樱易李5 小时前
iperf3 + Python-- 网络带宽、网速、网络稳定性
开发语言·网络·python
YDS8296 小时前
DeepSeek RAG&MCP + Agent智能体项目 —— RAG知识库的搭建和接口实现
java·ai·springboot·agent·rag·deepseek
仰泳之鹅6 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
之歆6 小时前
DAY_12JavaScript DOM 完全指南(二):实战与性能篇
开发语言·前端·javascript·ecmascript
未若君雅裁7 小时前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
cen__y7 小时前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git