Docker Swarm安装部署应用

一、Docker Swarm核心概念

1、什么是Docker Swarm

GitHub地址
Docker Swarm 是 Docker 官方推出的容器集群管理工具,基于 Go 语言实现。使用它可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,快速打造一套容器云平台。

Docker Swarm 是生产环境中运行 Docker 应用程序最简单的方法。作为容器集群管理器,Swarm 最大的优势之一就是 100% 支持标准的 Docker API。各种基于标准 API 的工具比如 Compose、docker-py、各种管理软件,甚至 Docker 本身等都可以很容易的与 Swarm 进行集成。大大方便了用户将原先基于单节点的系统移植到 Swarm 上,同时 Swarm 内置了对 Docker 网络插件的支持,用户可以很容易地部署跨主机的容器集群服务。

Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排工具,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。

2、Swarm 核心概念

Docker Engine 1.12 引入了 Swarm 模式,一个 Swarm 由多个 Docker 主机组成,它们以 Swarm 集群模式运行。Swarm 集群由 Manager 节点(管理者角色,管理成员和委托任务)和 Worker 节点(工作者角色,运行 Swarm 服务)组成。这些 Docker 主机有些是 Manager 节点,有些是 Worker 节点,或者同时扮演这两种角色。

Swarm 创建服务时,需要指定要使用的镜像、在运行的容器中执行的命令、定义其副本的数量、可用的网络和数据卷、将服务公开给外部的端口等等。与独立容器相比,集群服务的主要优势之一是,你可以修改服务的配置,包括它所连接的网络和数据卷等,而不需要手动重启服务。还有就是,如果一个 Worker Node 不可用了,Docker 会调度不可用 Node 的 Task 任务到其他 Nodes 上。

3、Node概念

Swarm 集群由 Manager 节点(管理者角色,管理成员和委托任务)和 Worker 节点(工作者角色,运行 Swarm 服务)组成。一个节点就是 Swarm 集群中的一个实例,也就是一个 Docker 主机。你可以运行一个或多个节点在单台物理机或云服务器上,但是生产环境上,典型的部署方式是:Docker 节点交叉分布式部署在多台物理机或云主机上。节点名称默认为机器的 hostname。

  • Manager:负责整个集群的管理工作包括集群配置、服务管理、容器编排等所有跟集群有关的工作,它会选举出一个 leader 来指挥编排任务;

  • Worker:工作节点接收和执行从管理节点分派的任务(Tasks)运行在相应的服务(Services)上。

4、Services and Tasks

服务(Service)是一个抽象的概念,是对要在管理节点或工作节点上执行的任务的定义。它是集群系统的中心结构,是用户与集群交互的主要根源。Swarm 创建服务时,可以为服务定义以下信息:

  • 服务名称;
  • 使用哪个镜像来创建容器;
  • 要运行多少个副本;
  • 服务的容器要连接到哪个网络上;
  • 要映射哪些端口。

任务(Task)包括一个 Docker 容器和在容器中运行的命令。任务是一个集群的最小单元,任务与容器是一对一的关系。管理节点根据服务规模中设置的副本数量将任务分配给工作节点。一旦任务被分配到一个节点,便无法移动到另一个节点。它只能在分配的节点上运行或失败。

5、Replicated and global services

Swarm 不只是提供了优秀的高可用性,同时也提供了节点的弹性扩容和缩容的功能。可以通过以下两种类型的 Services 部署实现:

  • Replicated Services:当服务需要动态扩缩容时,只需通过 scale 参数或者 --replicas n 参数指定运行相同任务的数量,即可复制出新的副本,将一系列复制任务分发至各节点当中,这种操作便称之为副本服务(Replicate)。

  • Global Services:我们也可以通过 --mode global 参数将服务分发至全部节点之上,这种操作我们称之为全局服务(Global)。在每个节点上运行一个相同的任务,不需要预先指定任务的数量,每增加一个节点到 Swarm 中,协调器就会创建一个任务,然后调度器把任务分配给新节点。

二、Docker Swarm工作流程

在这里插入图片描述
在这里插入图片描述

Swarm Manager:

1、API:接受命令并创建 service 对象(创建对象)
2、orchestrator:为 service 对象创建的 task 进行编排工作(服务编排)
3、allocater:为各个 task 分配 IP 地址(分配 IP)
4、dispatcher:将 task 分发到 nodes(分发任务)
5、scheduler:安排一个 worker 节点运行 task(运行任务)

Worker Node:

1、worker:连接到调度器,检查分配的 task(检查任务)
2、executor:执行分配给 worker 节点的 task(执行任务)

三、Docker Swarm中的网络模式介绍

不过,Docker Swarm 集群模式下却默认使用的是 Overlay 网络(覆盖网络),这里简单介绍一下什么是 Overlay 网络。

Overlay 网络其实并不是一门新技术,它是指构建在另一个网络上的计算机网络,这是一种网络虚拟化技术的形式,近年来云计算虚拟化技术的演进促进了网络虚拟化技术的应用。所以 Overlay 网络就是建立在另一个计算机网络之上的虚拟网络,它是不能独立出现的,Overlay 底层依赖的网络就是 Underlay 网络。

Underlay 网络是专门用来承载用户 IP 流量的基础架构层,它与 Overlay 网络之间的关系有点类似物理机和虚拟机。Underlay 网络和物理机都是真正存在的实体,它们分别对应着真实存在的网络设备和计算设备,而 Overlay 网络和虚拟机都是依托在下层实体的基础之上,使用软件虚拟出来的层级

在 Docker 版本 1.12 以后 Swarm 模式原生已支持覆盖网络(Overlay Network),只要是这个覆盖网络内的容器,不管在不在同一个宿主机上都能相互通信,即跨主机通信。不同覆盖网络内的容器之间是相互隔离的(相互 ping 不通)。

Overlay 网络是目前主流的容器跨节点数据传输和路由方案。当然,容器在跨主机进行通信的时候,除了可以使用 overlay 网络模式进行通信之外,还可以使用 host 网络模式,直接使用物理机的 IP 地址就可以进行通信

四、Docker Swarm实践之服务部署

1、机器分布

主机名IP
swarm-1192.168.1.204
swarm-2192.168.1.205
swarm-3192.168.1.206
swarm-4192.168.1.207

2、环境准备

1、修改主机名

hostnamectl  set-hostname  swarm-1 ; bash
hostnamectl  set-hostname  swarm-2 ; bash
hostnamectl  set-hostname  swarm-3 ; bash
hostnamectl  set-hostname  swarm-4 ; bash

3、 关闭防火墙

systemctl stop firewalld ; systemctl  disable firewalld 

4、安装dokcer

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repoyum makecache 
yum -y install  yum-utils
yum -y install docker-ce docker-cli containerd.io
##配置镜像下载加速器:
cat > /etc/docker/daemon.json << EOF
{"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
systemctl  start  docker ; systemctl  enable  docker
docker info## docker 网络环境查看
docker network ls

3、创建集群

docker swarm  init --advertise-addr 192.168.1.204

4、加入集群

在这里插入图片描述

5、Manager加入集群

  • 1、先在Leader 生成token docker swarm join-token manager
  • 2、 在swarm-2 swarm-3 执行命令,变成Manager
  • 3、查看集群 docker node ls
    在这里插入图片描述
    在这里插入图片描述
    如果在次启动机器,leader会发生变化
    在这里插入图片描述

在Docker Swarm中,如果主机上的leader节点发生变化,这可能是由于以下几种原因引起的:

Leader节点失效: 如果当前的leader节点由于某种原因(例如网络问题、节点故障等)不可用了,Swarm会自动选举一个新的leader节点来替代。这可能会导致Leader节点发生变化。

手动干预: 如果管理员手动干预并进行了重新配置、重新启动等操作,也可能导致Leader节点的变化。

重新加入集群: 如果一个节点从Swarm集群中断开,然后重新加入,它可能会影响Leader节点的状态。

无论是什么原因导致了Leader节点的变化,Swarm通常都会在发生故障时自动处理,并确保集群的正常运行。你可以通过监控Swarm集群的日志或事件来了解Leader节点变化的原因,并确保集群的健康状态。

6、Worker加入集群

在swarm-4 作为work节点
在这里插入图片描述

  • 假如集群不够用,需要新增节点
## 在manager 节点生成token
docker swarm join-token worker
## 在需要加入集群的机器下执行下面命令
docker swarm join --token SWMTKN-1-68j8viyrdhzsqcjfdspm9is0l9ig7aacznky96fgxreefixyrt-8yqa5nhp7620b2t4peuimh76q 192.168.1.205:2377
## 查看集群明显
docker node ls 

在这里插入图片描述
在这里插入图片描述

work节点升级为Manager节点

docker node promote 节点名称|节点ID

在这里插入图片描述

7、查看集群信息

在这里插入图片描述

8、查看集群节点

在这里插入图片描述

9、删除Manager节点

删除节点之前需要先将该节点的 AVAILABILITY 改为 Drain。其目的是为了将该节点的服务迁移到其他可用节点上,确保服务正常。最好检查一下容器迁移情况,确保这一步已经处理完成再继续往下。

docker node update --availability drain 节点名称|节点ID
docker node demote 节点名称|节点ID

在这里插入图片描述
在这里插入图片描述

  • 移除节点,出现的报错的解决方法
    在这里插入图片描述
  • 登陆被移动节点
docker swarm leave
## 如果不能清除,则需要删除空闲的容器
docker container prune
## 重启docker服务
systemctl  restart docker 
  • 再登陆Manager节点
docker node  rm 节点名称
docker node ls 

在这里插入图片描述

  • 将驱赶的节点,变为可用性
docker node update --availability active 节点名称

在这里插入图片描述

10、删除Worker节点

驱赶服务
docker node update --availability drain 节点名称|节点ID
然后,在准备删除的 Worker 节点中运行以下命令,离开集群
docker swarm leave
最后,在管理节点中对刚才离开的节点进行删除。
docker node rm 节点名称|节点ID

在这里插入图片描述
在这里插入图片描述

11、查看节点标签,给节点打标签

要给 Docker Swarm 节点打标签,您可以使用 docker node update 命令,并通过 --label-add 参数指定要添加的标签。以下是具体的步骤:

确定节点名称或 ID:首先,您需要确定要给哪个节点添加标签。您可以使用以下命令列出 Swarm 集群中的所有节点:

docker node ls

添加标签:一旦确定了要给哪个节点添加标签,您可以使用 docker node update 命令添加标签。例如,假设要给节点 node1 添加 env=production 和 role=web 两个标签,可以使用以下命令:

docker node update --label-add env=production --label-add role=web node1

这个命令将向节点 node1 添加两个标签,一个是 env,值为 production,另一个是 role,值为 web。

验证标签:您可以再次运行 docker node inspect 命令来验证节点的标签是否已添加成功。

docker node inspect node1

这将显示有关节点 node1 的详细信息,其中应该包含了您添加的标签信息。
在这里插入图片描述

五、Docker Swarm部署应用服务

1、服务部署

在这里插入图片描述

2、创建服务

## 创建Nginx服务
docker service  create --name my-nginx -p 81:80 --replicas=4 nginx
## 查看服务
docker service ls 
## 查看服务分别
docker service ps my-nginx 

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3、查看服务

在这里插入图片描述

  • 查看服务详情
docker service inspect my-nginx

在这里插入图片描述

4、调用服务

  • 集群的任意节点IP都可以进行访问

在这里插入图片描述

5、弹性服务

使用 updata 和scale 都可以进行容器扩缩容

docker service  update  --replicas=2 my-nginx 
docker service  scale  my-nginx=5

在这里插入图片描述
在这里插入图片描述
缩减为两个副本,依旧可以在任何节点进行访问
在这里插入图片描述
在这里插入图片描述

6、删除服务

在这里插入图片描述

六、Docker Swarm实践之滚动更新

以下案例将演示 Redis 版本如何滚动升级至更高版本再回滚至上一次的操作。

首先,创建 5 个 Redis 服务副本,版本为 5,详细命令如下:

# 创建 5 个副本,每次更新 2 个,更新间隔 10s,20% 任务失败继续执行,超出 20% 执行回滚,每次回滚 2 个
docker service create --replicas 5 --name redis \
--update-delay 10s \
--update-parallelism 2 \
--update-failure-action continue \
--rollback-monitor 20s \
--rollback-parallelism 2 \
--rollback-max-failure-ratio 0.2 \
redis:5

–update-delay:定义滚动更新的时间间隔;
–update-parallelism:定义并行更新的副本数量,默认为 1;
–update-failure-action:定义容器启动失败之后所执行的动作;
–rollback-monitor:定义回滚的监控时间;
–rollback-parallelism:定义并行回滚的副本数量;
–rollback-max-failure-ratio:任务失败回滚比率,超过该比率执行回滚操作,0.2 表示 20%。

在这里插入图片描述

然后通过以下命令实现服务的滚动更新

docker service update --image redis:6 redis

在这里插入图片描述
回滚服务,只能回滚到上一次操作的状态,并不能连续回滚到指定操作。

docker service update --rollback redis

在这里插入图片描述

七、Docker Swarm常用命令

1、 docker swarm常用命令

命令说明
docker swarm init初始化集群
docker swarm join-token worker查看工作节点的 token
docker swarm join-token manager查看管理节点的 token
docker swarm join加入集群

2、docker node常用命令

命令说明
docker node ls查看集群所有节点
docker node ps查看当前节点所有任务
docker node rm节点名称节点 删除节点(-f强制删除)
docker node inspect 节点名称节点ID 查看节点详情
docker node demote 节点名称节点ID 节点降级,由管理节点降级为工作节点
docker node promote 节点名称节点ID 节点升级,由工作节点升级为管理节点
docker node update 节点名称节点ID 更新节点

3、docker service常用命令

命令说明
docker service create创建服务
docker service ls查看所有服务
docker service inspect 服务名称服务ID 查看服务详情
docker service logs 服务名称服务ID 查看服务日志
docker service rm 服务名称服务ID 删除服务(-f强制删除)
docker service scale 服务名称服务ID=n 设置服务数量
docker service update 服务名称服务ID 更新服务

八、docker stack 部署docker-compose集群

docker-compose官网文档
stack deploy命令
工具文档

1.Stack 是基于 Docker Swarm 之上来完成应用的部署。
2.步骤很简单。在 Compose 文件中定义应用,然后通过 docker stack deploy 命令完成部署和管理。

1、docker stack 命令

  • yaml资源清单
version: '3.8'services:web:image: nginx:latestports:- "80:80"deploy:replicas: 3restart_policy:condition: anyplacement:constraints:- node.role == workerdb:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: exampleMYSQL_DATABASE: myappdeploy:replicas: 1restart_policy:condition: on-failureplacement:constraints:- node.role == manager

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/781619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# winform校验文件版本差异及版本号

界面 代码 using System.Diagnostics;namespace VersionTool {public partial class Form1 : Form{List<string> fileNmaes new List<string>() { "PhotoMes.Base.dll", "PhotoMes.App.exe", "PhotoMes.Cameras.dll" };public F…

分治实现快速排序和归并排序

本文用于记录个人算法竞赛学习&#xff0c;仅供参考 一.快速排序&#xff08;升序为例&#xff09; 思想&#xff1a;确定分界点x&#xff0c;将小于分界点的值放在分界点的左边&#xff0c;将大于分界定的值放在分界点的右边&#xff0c;再递归处理两边的左右区间。 步骤&am…

如何注册Claude3?解决Claude3无海外手机号接收验证码的问题以及如何订阅Claude Pro

原文链接&#xff1a;如何注册 Claude3&#xff1f;解决 Claude3 无海外手机号接收验证码的问题以及如何订阅 Claude Pro 前言 Claude3已经出来有一段时间了&#xff0c;大家有没有体验过呢&#xff1f;不过从目前来看&#xff0c;Anthropic公司总共推出了3个模型&#xff1…

使用 golang 以及 Gin 框架,将上传的图片在不保存至本地的情况下添加水印,并上传至阿里云 OSS

正如标题所述&#xff0c;使用golang对上传图片添加水印&#xff0c;以及将图片上传到阿里云OSS&#xff0c;网上一搜索&#xff0c;便有你想要的结果了&#xff0c;可是&#xff0c;他们却先将上传图片添加水印后保存在本地&#xff0c;而后再将添加了水印的图片上传到阿里云O…

当iPhone中的Wi-Fi变灰时别担心,可以尝试这些解决办法

这篇文章解释了当iPhone上的Wi-Fi变灰时,你应该检查并修复的所有事情。 确保飞行模式关闭 这听起来可能很傻,但在执行任何其他操作之前,请确保未打开飞机模式。此功能禁用Wi-Fi(和蜂窝网络),因为它旨在允许你在通常不允许传出无线通信的飞机上使用手机。 查看飞行模式…

Linux 动静态库的制作,使用和加载

Linux 动静态库的制作,使用和加载 一.前置说明1.mylib.h2.mylib.c3.mymath.h mymath.c4.如何制作库 二.动静态库的制作1.静态库的制作1.制作2.使用一下静态库,验证是否成功打包 2.动态库的制作1.编译.c源文件文件生成.o目标文件2.打包生成动态库3.编写makefile文件,自动化制作动…

从0开始打架基于VUE的前端项目

准备与版本 安装nodejs(v20.11.1)安装vue脚手架(@vue/cli 5.0.8) ,参考(https://cli.vuejs.org/zh/)vue版本(2.7.16),vue2的最后一个版本初始化项目 创建一个git项目(可以去gitee/github上创建),注意创建一个空项目创建项目vue create mvp-admin-vue-ui删除自己创建的gi…

OpenHarmony实战:烧录Hi3516DV300开发板

前言 烧录开发板是每个开发者的必修课&#xff0c;每次对系统的修改务必进行烧录测试&#xff0c;确保修改正确和不会引入新问题。 本文基于 Windows10&#xff0c;以 Hi3516DV300 开发板为例&#xff0c;指导如何烧录 OpenHarmony 镜像&#xff0c;镜像也叫固件。 这块开发…

C++ :STL中deque的原理

deque的结构类似于哈希表&#xff0c;使用一个指针数组存储固定大小的数组首地址&#xff0c;当数据分布不均匀时将指针数组内的数据进行偏移&#xff0c;桶不够用的时候会像vector一样扩容然后将之前数组中存储的指针拷贝过来&#xff0c;从原理可以看出deque的性能是非常高的…

ISP-VPN实验

文章目录 ISP-VPN实验一&#xff0c;实验拓扑二、实验要求三、IP规划四、实验配置1、IP配置R1的配置R2的配置R3的配置R4的配置R5的配置 2、配置缺省路由3、认证与被认证配置4、HDLC封装5、构建MGRE和GRE6、整个私有网络基于RIP全网可达7、查看路由配置和PC端配置8、PC端pingR5的…

环境影响与碳排放生命周期评估应用及案例分析

生命周期分析 (Life Cycle Analysis, LCA) 是评价一个产品系统生命周期整个阶段——从原材料的提取和加工&#xff0c;到产品生产、包装、市场营销、使用、再使用和产品维护&#xff0c;直至再循环和最终废物处置——的环境影响的工具。这种方法被认为是一种“从摇篮到坟墓”的…

用JSch实现远程传输文件并打包成jar

本文将简单介绍一下 JSch 这个Java的第三方库的一个简单用法&#xff0c;并以此为实例&#xff0c;讲解 IntelliJ 中打包成 jar 包的2种方式。 实现目标 我们的目标是&#xff0c;做出一个jar包&#xff0c;它能够实现类似于 scp 命令的远程传输文件的功能。用法如下&#xf…

应急响应靶机训练-Linux2题解

前言 接上文&#xff0c;应急响应靶机训练Linux2 靶机地址&#xff1a;应急响应靶机-Linux(2) 题解 登录虚拟机&#xff1a; 修改面板密码 提交攻击者IP 答案&#xff1a;192.168.20.1 查看宝塔日志即可 用的net直接是网关 提交攻击者修改的管理员密码(明文) 答案&…

LeetCode---390周赛

题目列表 3090. 每个字符最多出现两次的最长子字符串 3091. 执行操作使数据元素之和大于等于 K 3092. 最高频率的 ID 3093. 最长公共后缀查询 一、每个字符最多出现两次的最长子字符串 非常经典的滑动窗口问题&#xff0c;即动态维护一段区间&#xff0c;使得这段区间满足…

JUC:park/unpark的用法与原理

park / unpark 用法 // 暂停当前线程 LockSupport.park(); // 恢复某个线程的运行 LockSupport.unpark(暂停线程对象)**先说结论&#xff1a;**无论unpark在park前还是后&#xff0c;都可以解除暂停状态。 先park在unpark可以成功运行&#xff1a; Thread t1 new Thread((…

全局UI方法-弹窗二-列表选择弹窗(ActionSheet)

1、描述 定义列表弹窗 2、接口 ActionSheet.show(value:{ title: string | Resource, message: string | Resource, autoCancel?: boolean, confrim?: {value: string | Resource, action: () > void }, cancel?: () > void, alignment?: DialogAlignment, …

kafka学习笔记02(小滴课堂)

Kafka命令行生产者发送消息和消费者消费消息实战 已存在的kafka不能重复创建。 broker设置的是1&#xff0c;factor大于broker了&#xff0c;所以报错。 生产者发送消息&#xff1a; kafka列表出现了新的kafka。 我们使用这个kafka。 我们启动消费者&#xff1a; 我们现在不从…

【Qt 学习笔记】Day1 | Qt 背景介绍

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Day1 | Qt 背景介绍 文章编号&#xff1a;Qt 学习笔记 / 01 文章目录…

C/C++语言实现简易通讯录 [含文件操作,循环双链表]

文章目录 C/C语言实现简易通讯录概要基本功能运行截图展示主要代码展示 &#x1f396; 博主的CSDN主页&#xff1a;Ryan.Alaskan Malamute &#x1f4dc; 博主的代码仓库主页 [ Gitee ]&#xff1a;ryanala [GitHub]&#xff1a; Ryan-Ala C/C语言实现简易通讯录 ⚠⚠⚠ …

话题通信的python实现

一、发布者Publisher的python实现 step1&#xff1a;在scripts文件夹中创建py节点 step2&#xff1a;第一行是为了指定解释器&#xff0c;Ubuntu20.04是python3&#xff0c;比他低的版本是python。第二行是为了指定编码方式。第五行中&#xff0c;引用index.ros.org中数据类型…