Docker之Swarm集群管理
Swarm简介
1、Swarm是一个集群化任务编排工具,使用声明式的配置,配置文件接近docker-compose
2、Swarm是Docker引擎内置(原生)的集群管理和编排工具,Docker Swarm是Docker官方三剑客项目之一(但现在用的不是特别多了)
Docker swarm的特点:
1、集群化任务编排工具
2、声明式配置方式
3、支持扩缩容
4、支持故障自愈
Docker swarm的概念图:
·task:最小部署单元(一个task代表一个实例)
·services:一个运行中的服务可以有多个task(副本)
·stack:Services服务的集合
Swarm运行机制
Swarm集群需要至少一个manager节点,manager将任务分配个woker节点,manager节点本身也可以处理任务
Swarm节点类型:
manager节点:管理集群
worker节点:运行容器任务
Swarm运行原理:
·manager节点收到任务会将任务调度到work节点
·work节点收到命令后启动任务
·如果任务数量少于期望值,会自动重建任务
Swarm应用部署模式:
Swarm有两种应用部署模式,副本应用和全局副本应用,下图显示三个副本服务(黄色)和全局服务(灰色)
副本服务:任何节点都可以部署满足期望值即可
全局副本:不需要指定期望值每一个节点自动会启用全局副本
Swarm集群搭建
准备环境
服务器准备
我的三台测试机
IP地址 | 角色 | 主机名 |
---|---|---|
IP1 | manager | node1 |
IP2 | worker | node2 |
IP3 | worker | node3 |
1、服务器端口开放:
在创建集群前,如果开启了防火墙,需要确认三台主机的防火墙能让swarm需求的端口开放,需要打开主机之间的端口,以下端口必须可用。在某些系统上,这些端口默认为打开。
2377:TCP端口2377用于集群管理通信
7946:TCP和UDP端口7946用于节点之间的通信
4789:TCP和UDP端口4789用于覆盖网络流量
2、测试环境直接禁用防火墙
systemctl stop firewalld(立即生效)
systemctl disable firewalld(重启生效)
3、初始化Swarm集群
#初始化Swarm集群
docker swarm init --advertise-addr 【本机IP地址】
#查看swarm节点
docker node ls
因为hostName不好区分,修改hostName
#修改主机名
hostnamectl set-hostname master
# 查看主机名
hostnamectl status
4、将其他节点加入master节点
docker swarm join --token SWMTKN-1-53p5t2rt9ud5j0owkl14boj2z8im6r60ddlzotgc4a8y93u1c2-8f6crxgyc9umayhxva1jv9t1w 【master节点IP】:2377
5、查看Swarm节点
docker node ls
AVAILABILITY状态说明
Active 意味着调度程序可以将任务分配给节点。
Pause 意味着调度程序不会将新任务分配给节点,但现有任务仍在运行。
Drain 意味着调度程序不会向节点分配新任务,调度程序关闭所有现有任务并在可用节点上调度它们。
MANAGER STATUS状态说明
显示节点是属于manager或者worker
没有值 :表示不参与群管理的工作节点。
Leader :意味着该节点是使得群的所有群管理和编排决策的主要管理器节点。
Reachable: 意味着节点是管理者节点正在参与Raft共识,如果领导节点不可用,则该节点有资格被选为新领导者。
Unavailable :意味着节点是不能与其他管理器通信的管理器,如果管理器节点不可用,您应该将新的管理器节点加入群集,或者将工作器节点升级为管理器。
5、添加节点标签
因为用到了节点约束,所以在启动服务之前需要添加节点标签
使用节点约束的意义:
比如某个节点下部署了mysql,当这个mysql容器异常时,Swarm会自动启动一个新的但是如果节点的位置从node1到了node2会造成数据丢失这种问题
所以需要添加节点约束,确保重新启动的节点只在有指点标签的节点上部署。这样mysql就跟节点进行了绑定确保不会出现异常问题
#添加标签
docker node update --label-add role=data node1
#查看节点标签信息
docker node inspect node1|grep role
Swarm部署服务
方式一 手动部署
Swarm支持手动部署,就类似于手动命令运行Docker服务
所有操作在master节点下执行
1、创建overlay网络
需要在多个服务器中运行Docker容器集群,并使用overlay网络。
overlay网络用于连接不同机器上的docker容器,允许不同机器上的容器相互通信,同时支持对消息进行加密。
创建overlay网络
docker network create --driver overlay learn-docker-overlay-network
查看网络
docker node ls
2、
创建MYSQL配置文件:
mkdir -p /tmp/etc/mysql
编辑配置文件
vi /tmp/etc/mysql/my.cnf
配置内容:
[mysqld]
lower case table names=1
创建MYSQL挂载路径(数据目录):
mkdir -p /tmp/data/mysql
3、创建服务docker service create
创建MySQL服务
docker service create \
-e MYSQL_ROOT_PASSWORD=root \ #-e指定环境变量参数
-p 3306:3306
--mount type=bind,source=/tmp/etc/mysql,destination=/etc/mysql/mysql.conf.d/ \ #mount type=宿主机路径,容器路径
--mount type=bind,source=/tmp/data/mysql,destination=/var/lib/mysql \
--replicas 1 \ #副本数
--constraint 'node.labels.role == data' \ #绑定角色data 数据库只能在该角色下运行
--name mysql \
--network learn-docker-overlay-network \
mysql:5.7.42 #镜像地址
4、创建nacos服务
nacos也是需要创建一个,但是节点是可以漂移的,不需要固定在某一台机器
docker service create \
-e MODE=standalone \
-p 8848:8848
--replicas 1 \
--name nacos \
--network learn-docker-overlay-network \
nacos/nacos-server:2.0.1
5、查看swarm的进程
docker service ls
docker service ps mysql
docker service ps nacos
查看日志
docker service logs 【服务名】
Swarm扩缩容
可以通过集群操作对集群进行扩缩容
扩容操作:将learn-docker-storage由两个容器变为三个容器
docker service scale learn-docker-storage=3
缩容操作:同样,使用该命令对learn-docker-storage进行缩容
docker service scale learn-docker-storage=2
补充:
删除服务:
docekr service rm 【服务名】
方式二使用申明方式进行部署(一般用该方式)
虽然Swarm可以通过手动部署,但是一般都是通过任务编排的方式部署服务的
1、创建资源清单
创建资源清单了实际上就是编写docker-compose.yml,只是需要3.X的版本
version: '3.9' #配置文件版本
services: #代表多个服务的集合
mysql:
image: mysql:5.7.42 #镜像地址
ports:
- "3306:3306"
networks:
- learn-docker-network
volumes:
- "/tmp/etc/mysql:/etc/mysql/mysql.conf.d/"
- "/tmp/data/mysql:/var/lib/mysql"
environment:
MYSQL_ROOT_PASSWORD: 'root'
deploy: #代表需要进行集群部署
mode: replicated #使用副本模式进行部署
replicas: 1 #副本期望值为1(代表只启动1个容器就可以)
placement:
constraints: #节点约束,代表该容器只能部署在有node.labels.role == data标签的节点里面
- 'node.labels.role == data'
restart_policy: #指定重启策略
condition: on-failure
delay: 5s
nacos:
image: nacos/nacos-server:2.0.1
ports:
- "8848:8848"
networks:
- learn-docker-network
environment:
MODE: 'standalone'
JVM_XMS: '128m'
JVM_XMX: '128m'
deploy:
mode: replicated
replicas: 1
restart_policy:
condition: on-failure
delay: 5s
learn-docker-web:
image: itcast.harbor.com/librarylearn-docker-web:1.0-SNAPSHOT
networks:
- learn-docker-network
depends_on: #配置依赖关系,启动会让nacos、mysql优先
- nacos
- mysql
deploy:
mode: replicated
replicas: 2
restart_policy:
condition: on-failure
delay: 5s
learn-docker-storage:
image: itcast.harbor.com/librarylearn-docker-storage:1.0-SNAPSHOT
networks:
- learn-docker-network
depends_on:
- nacos
- mysql
deploy:
mode: replicated
replicas: 2
restart_policy:
condition: on-failure
delay: 5s
learn-docker-gateway:
image: itcast.harbor.com/library/learn-docker-gateway:1.0-SNAPSHOT
ports:
- "8888:8888"
networks:
- learn-docker-network
depends_on:
- nacos
- mysql
deploy:
mode: replicated
replicas: 1
restart_policy:
condition: on-failure
delay: 5s
visualizer: #支持可视化
image: dockersamples/visualizer
ports:
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
mode: replicated
replicas: 1
restart_policy:
condition: on-failure
delay: 5s
networks:
learn-docker-network:
driver: overlay
2、部署应用
使用docker stack deploy命令部署:
docker stack deploy -c docker-compose.yml 【stack命名】
参数:
-c 指定配置文件的名称
查看部署情况:
docker service ls
使用配置的方式进行扩缩容:(推荐)
修改docker-compose.yml文件:
将服务下的deply-repilcated的参数进行修改减少相当于缩容 ,增加相当于扩容
修改完成后重新部署:(stack名要与原来一致 要不相当于配置一个新的应用)
docker stack deploy -c docker-compose.yml 【stack命名】
删除stack服务:
查询stack服务
docker stack ls
将stack服务删除,stack下的所有应用都会被删除
docker stack rm 【stack名称】
Swarm总结
Swarm的节点类型:
manager节点:Swarm集群需要至少一个manager节点用于管理集群,如果当前节点挂掉,会从工作节点选举
worker节点:实际运行服务的节点,实际上一个manager节点也能同时成为worker节点,承载任务运行
Swarm的功能:
1、管理集群微服务
2、服务自愈,如果集群的服务不满足期望值会启动新服务
3、支持集群的扩缩容
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?