Docker_05_Docker Swarm

本文详细介绍了Docker Swarm的原理及管理工具,包括节点、服务和任务的概念,以及集群的创建、服务的创建和扩展。Swarm通过平铺、紧凑和随机策略进行容器调度,并提供了初始化、加入、离开节点等命令。创建Swarm集群的步骤包括初始化管理节点、生成令牌、加入worker和manager节点,以及监控和调整服务规模。强调了部署奇数个管理节点以防止脑裂情况,并提供了实际操作示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Docker_05_Docker Swarm

Docker Swarm

Docker Swarm:Docker原生的集群管理工具

1)将若干个Docker主机虚拟成一个Docker主机进行管理

2)集群中的所有Docker主机必须在1.4.0版本以上;

3)所有Docker节点必须运行同一版本的Docker;

4)Swarm 的配置和状态信息保存在一套位于所有manager节点上的分布式 etcd数据库中(该数据库运行于内存中,并保持数据的最新状态);

5)Swarm 默认占用 2337端口


Node(节点):加入到swarm集群中的一个docker引擎实体

1)Swarm本质就是由多个Node组成的集群;

2)一个宿主机上可运行多个Node;

3)分为worker节点和manager节点,manager节点可相互通信;

4)worker节点需将其分配的Task的当前状态通知manager节点,以便manager节点可以保持每个worker节点的所需状态


如:manager节点下管理的worker节点
在这里插入图片描述


Service(服务):节点上单个或多个容器(副本)组成对外的服务

1)服务是Swarm 中的最小调度单元;

2)在worker节点或manager节点上运行,但仅在worker节点上执行Task;

3)默认情况下,manager节点也可运行服务

//可配置为以独占方式运行,且仅作为manager节点


如:服务根据Task运行实际的container
在这里插入图片描述


所有的服务都会被 Swarm 持续监控,Swarm会在后台进行轮训检查,持续比较服务的实际状态和期望状态是否一致,以确保实际状态能够满足期望状态的要求,若一致,则无须任何额外操作;若不一致,Swarm 会使其一致


如:指定web服务需要5个web-fe副本的运行,若运行 web-fe副本的某个worker节点宕机了,则 web-fe 的实际状态从 5 个副本降为 4个,从而不能满足期望状态的要求,Swarm会在其他节点启动一个新的 web-fe副本,使实际状态与期望状态保持一致


Task(任务): 一个运行的容器和其需执行的命令

1)Task就是Service的执行实体;

2)manager节点根据调度策略分配Task给各个worker节点

3)Task一旦分配给一个节点,就不能移动到另一个节点,只能在指定的节点上运行,否则将失败


如:Task的调度
在这里插入图片描述


容器的调度策略分为:平铺策略、紧凑策略和随机策略

1)平铺策略(Spread):选择已运行容器数量最少的节点(默认策略);

2)紧凑策略(BinPacking):根据每个节点上CPU和内存资源为节点打分,选择使用最紧凑的节点,保证节点最大限度地被使用(避免碎片化);

3)随机策略(Random):随机选择一个节点运行容器

安装

安装命令:docker pull swarm


卸载命令:docker rmi swarm的镜像ID


如:在当前系统上安装Docker Swarm
在这里插入图片描述

命令

swarm命令:生成/管理集群

指令格式:docker swarm 选项

选项含义
init初始化节点
join加入节点
join-token生成令牌
leave离开节点
unlock锁定节点
unlock-key解锁节点
update更新节点

1)init选项:docker swarm init --advertise-addr Docker主机IP:端口号

2)join选项:docker swarm join --token 身份令牌

3)join-token选项:docker swarm join-token 参数

参数说明
worker生成worker节点令牌
manager生成manager节点令牌

//生成指定身份节点的令牌,用于让其他节点加入生成令牌的节点,且仅有manager节点可生成令牌


node命令:管理swarm的节点

指令格式:docker node 选项

选项含义
ls列出当前swarm中所有节点
inspect显示指定节点的详细信息
demote降级指定节点(成为worker)
promote升级指定节点(成为manager)
ps列出节点上正在运行的任务
update更新指定节点
rm删除指定节点

1)update选项:docker node update 参数

参数说明
-role更新节点的身份(worker或manger)
-availablity更新节点的可用性 (active、pause、drain)
-label-add添加/更新节点标签 (方式:key=value)
-label-rm删除节点标签

service命令:创建/管理服务

指令格式:docker service 选项

选项含义
create创建服务
ls列出所有正在运行的服务
ps查看指定服务的状态
inspect查看指定服务的详细信息
logs查看指定服务的日志信息
scale对指定服务进行扩缩容
rm删除指定服务

//创建服务时,可用类似run命令一样的选项进行配置

Swarm集群

创建Swarm集群流程:

1)初始化第一个manager节点;

2)加入额外的manager节点;

3)加入worker节点

4)创建服务;


1)不包含在任何 Swarm 中的节点,称为运行于单引擎(Single-Engine)模式;

2)一旦被加入 Swarm 集群,则切换为 Swarm 模式;

3)在单引擎模式下的 Docker 主机上运行 docker swarm init会将其切换到 Swarm
模式,并创建一个新的 Swarm,将自身设置为Swarm的第一个管理节点;

4)更多的节点可以作为管理节点或工作节点加入进来,并且会将新加入的节点切换为
Swarm 模式


1)即使有多个manager节点,但仅有一个节点处于活动状态;

2)处于活动状态的manager节点被称为“主节点”(leader);

3)而主节点也是唯一一个会对 Swarm 发送控制命令的节点;

4)若备用(非活动)manager节点接收到Swarm 命令,则会将其转发给主节点
在这里插入图片描述


1)部署奇数个管理节点;

2)不要部署太多管理节点(建议 3 或 5 个);

3)绝对不要多于 7 个,因为需要花费更长的时间来达成共识;

4)部署奇数个管理节点有利于减少脑裂(Split-Brain)情况的出现机会;

5)虽然在脑裂情况下集群依然在运行,但是无法变更配置和管理应用负载了
在这里插入图片描述


如:搭建Swarm集群

(1)初始化

1)查看主机IP
在这里插入图片描述

2)根据主机IP,对其初始化(IP为192.168.184.130)
在这里插入图片描述


(2)生成worker节点和manager节点令牌
在这里插入图片描述


(3)其他节点加入

1)加入第二个管理节点(IP为192.168.184.128)
在这里插入图片描述

2)加入第三个管理节点(IP为192.168.184.131)
在这里插入图片描述

3)加入第一个worker节点(IP为192.168.184.129)
在这里插入图片描述

4)加入第二个worker节点(IP为192.168.184.132)
在这里插入图片描述


(4)查看节点状态
在这里插入图片描述


(5)创建服务(manager节点和worker节点均可创建服务)

1)在manager节点创建mynginx服务,并查看状态
在这里插入图片描述

2)该服务的nginx容器在第三个manager节点上运行
在这里插入图片描述


(6)指定服务扩缩容

1)对mynginx服务进行扩容,并查看状态
在这里插入图片描述

2)对mynginx服务进行缩容,并查看状态
在这里插入图片描述


(7)当Swarm集群中有manager节点宕机时

1)关闭主节点的docker服务(模拟宕机)
在这里插入图片描述

2)到其他manager节点,查看当前节点状况
在这里插入图片描述

3)再次启动docker服务
在这里插入图片描述


(8)删除指定节点

1)退出Swarm集群
在这里插入图片描述

2)从集群中删除该节点

在这里插入图片描述

要使用 `docker_sd_config` 监控 Docker 集群,需要在 Prometheus 的配置文件中设置相应的服务发现规则。以下是一个示例配置文件,用于监控运行在 Docker 集群中的 Node.js 应用程序: ```yaml global: scrape_interval: 15s scrape_configs: - job_name: 'nodejs-app' metrics_path: '/metrics' file_sd_configs: - files: - /etc/prometheus/targets.json refresh_interval: 5m relabel_configs: - source_labels: [__meta_docker_container_label_com_docker_swarm_service_name] regex: '(.+)' target_label: job replacement: '$1' - source_labels: [__meta_docker_container_label_com_docker_swarm_task_id] regex: '(.+)' target_label: instance replacement: '$1' - source_labels: [__address__, __meta_docker_container_label_com_docker_swarm_task_id] regex: '([^:]+)(?::\d+)?' target_label: __address__ replacement: '$1:3000' - source_labels: [__meta_docker_container_label_com_docker_swarm_service_name] regex: '(.+)' target_label: service replacement: '$1' ``` 在上面的配置文件中,`job_name` 是 Prometheus 的作业名称,`metrics_path` 是应用程序的指标路径。`file_sd_configs` 是文件服务发现配置,指定了用于存储应用程序地址信息的 JSON 文件路径。`relabel_configs` 是标签重写配置,用于将 Docker 元数据转换为 Prometheus 标签。 注意,上面的示例配置文件假设 Node.js 应用程序运行在容器的 3000 端口上。如果你的应用程序运行在不同的端口上,请相应地更改标签重写配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值