Docker Swarm实现容器的复制均衡及动态管理:详细过程版

Swarm简介

Swarm是一套较为简单的工具,用以管理Docker集群,使得Docker集群暴露给用户时相当于一个虚拟的整体。Swarm使用标准的Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(dockerclient in go, docker_py, docker等)均可以直接与Swarm通信。
Swarm的设计和其他Docker项目一样,遵循“batteries included but removable”原则

笔者对该原则的理解是:batteries included代表设计Swarm时,为了完全体现分布式容器集群部署、运行与管理功能的完整性,Swarm和Docker协同工作,Swarm内部包含了一个较为简易的调度模块,以达到对Docker集群调度管理的效果;“but removable”意味着Swarm与Docker并非紧耦合,同时Swarm中的调度模块同样可以定制化,用户可以按照自己的需求,将其替换为更为强大的调度模块,如Mesos等。另外,这套管理引擎并未侵入Docker的使用,这套机制也为其他容器技术的集群部署、运行与管理方式提供了思路。

Swarm 特点

对外以Docker API接口呈现,这样带来的好处是,如果现有系统使用Docker Engine,则可以平滑将Docker Engine切到Swarm上,无需改动现有系统。

Swarm对用户来说,之前使用Docker的经验可以继承过来。非常易上手,学习成本和二次开发成本都比较低。同时Swarm本身专注于Docker集群管理,非常轻量,占用资源也非常少。
“Batteries included but swappable”,简单说,就是插件化机制,swarm中的各个模块都抽象出了api,可以根据自己一些特点进行定制实现。

Swarm自身对docker命令参数支持的比较完善,Swarm目前与Docker是同步发布的。Docker的新功能,都会第一时间在Swarm中体现。

实验开始

实验环境

主机 IP 系统 角色

153 192.168.121.153 centos7 manager

154 192.168.121.154 centos7 worker

155 192.168.121.155 centos7 worker

命令介绍:

-d 后台运行
–name 指定server 名,不是容器名(容器命令默认 服务名.编号.随机id串)
-p 指定service映射的端口
–network 指定网络
–mode 指定容器分配的模式(replicated: 随机分配,可由 constraint约束分配到哪些节点 global:全局,确保每个节点都会有该服务的容器)
–constraint 约束容器分配到哪些节点
–replicas 指定当前services 下创建的 容器的数量
–replicas-max-per-node 指定每个节点可创建给service的容器的最大数
–restart-condition 重启条件,类似于 容器run的 --restart
–user 指定运行用户身份
–endpoint-mode 负载均衡模式 vip dns
nginx:latest 创建容器使用的镜像

首先准备好三台机子 ,我是用153、154 、155

每台主机都配置A记录相互解析

cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.121.153 server153
192.168.121.154 server154
192.168.121.155 server155

dcoker的安装

先卸载本机原来的docker,如果主机是干净的就不用执行这步,我是还原的机子,所以这步不执行也没什么

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

然后去官方下载docker的yum源

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

然后下载docker

sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

启动docker

sudo systemctl start docker

swarm集群的创建

然后我们指定一台153主机构建一个集群并成为管理节点

[root@server153 ~]# docker swarm init
Swarm initialized: current node (cul5m5m456oq9wwrbw91i5vsu) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-15p6qvh2u2znrrcslz53inkdhleubl8x9m5xlcm27f9q2eimyl-enul5wbhb6qepej1nod6jdrq2 192.168.121.153:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

集群构建好以后我们去154和155主机加入这个集群

[root@server154 ~]# docker swarm join --token SWMTKN-1-15p6qvh2u2znrrcslz53inkdhleubl8x9m5xlcm27f9q2eimyl-enul5wbhb6qepej1nod6jdrq2 192.168.121.153:2377
This node joined a swarm as a worker.
[root@server154 ~]# docker swarm join --token SWMTKN-1-15p6qvh2u2znrrcslz53inkdhleubl8x9m5xlcm27f9q2eimyl-enul5wbhb6qepej1nod6jdrq2 192.168.121.153:2377
This node joined a swarm as a worker.

然后去153管理主机查看集群情况

[root@server153 ~]# docker node   ls
ID                            HOSTNAME    STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
cul5m5m456oq9wwrbw91i5vsu *   server153   Ready     Active         Leader           24.0.7
fh23wcmmfmt7vyayh7bzx28ls     server154   Ready     Active                          24.0.7
5y468v8pk98ei79frycmz9fww     server155   Ready     Active  

可以看到集群情况都是健康的

然后开始我们项目的部署

首先在管理节点创建一个overlay网络给这个集群通信使用

[root@server153 ~]# docker  network create  --driver overlay  nginx-net
zwvmf0upuledjh2uarupfnzgt
[root@server153 ~]# docker network ls
NETWORK ID     NAME              DRIVER    SCOPE
db5d2975dd04   bridge            bridge    local
31eb2f0c4e92   docker_gwbridge   bridge    local
52a372541a65   host              host      local
ag7i6g1sb542   ingress           overlay   swarm
zwvmf0upuled   nginx-net         overlay   swarm
b95fd0863462   none              null      local

service的构建

然后在每个节点都拉取一个nginx的最新镜像

当然只在管理节点拉也行,管理节点会将镜像分发给其它节点来保证镜像的一致性

不过分发镜像需要时间,所以还是先拉取一样的镜像比较好

为了验证我故意在155节点不拉取镜像

[root@server153 ~]# docker pull nginx:latest
[root@server153 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
nginx        latest    c20060033e06   3 days ago   187MB

然后开始构建service,其中参数不懂得可以对照上面写的,上面开头介绍了用到的参数

[root@server153 ~]# docker  service  create  -d  --name web -p80:80  --network nginx-net --replicas 3  --replicas-max-per-node 10  --restart-condition  any  --user root  --mode  replicated  nginx:latest

然后查看service web下容器的情况

因为我们指定创建三个容器,刚好每个节点一台

然后这里注意看155节点容器的运行时间比其它两个节点少一分钟

那就是因为分发镜像要花时间,他启动的就比其它两个节点晚一分钟,镜像越大分发的时间越长

[root@server153 ~]# docker service ps web 
ID             NAME      IMAGE          NODE        DESIRED STATE   CURRENT STATE           ERROR     PORTS
u4cxfrcd2t4q   web.1     nginx:latest   server153   Running         Running 9 minutes ago             
w22cnbrdjo24   web.2     nginx:latest   server154   Running         Running 9 minutes ago             
n2g4nma52mtg   web.3     nginx:latest   server155   Running         Running 8 minutes ago   

起来了以后我们访问去浏览器访问试试

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

可以看到访问每台机子都是可以的,而且还实现了负载均衡,因为内容一样看不出来,下面我来实验一下

给三台机子里的文件index.html编辑不同的内容

[root@server153 ~]# echo 33333333333333333 > ./index.html
[root@server153 ~]# docker cp ./index.html web.1.qydzc04d6vt4q2ux4uzokir6z:/usr/share/nginx/html/index.html
Successfully copied 2.05kB to web.1.qydzc04d6vt4q2ux4uzokir6z:/usr/share/nginx/html/index.html
[root@server154 ~]# echo 44444444444444 > ./index.html
[root@server154 ~]# docker cp ./index.html web.2.d2qto723yk3hqlb76leaps3u5:/usr/share/nginx/html/index.html
Successfully copied 2.05kB to web.2.d2qto723yk3hqlb76leaps3u5:/usr/share/nginx/html/index.html
[root@server155 ~]# echo 55555555555 > index.php
[root@server155 ~]# docker cp ./index.php web.3.b41rsxvjxw7br5vxk5d6i74ve:/usr/share/nginx/html/index.html
Successfully copied 2.05kB to web.3.b41rsxvjxw7br5vxk5d6i74ve:/usr/share/nginx/html/index.html

因为浏览器有缓存,测试不了,我直接用curl测试

[root@server153 ~]# curl 192.168.121.153
44444444444444
[root@server153 ~]# curl 192.168.121.153
55555555555
[root@server153 ~]# curl 192.168.121.153
33333333333333333
[root@server153 ~]# curl 192.168.121.153
44444444444444
[root@server153 ~]# curl 192.168.121.153
55555555555
[root@server153 ~]# curl 192.168.121.153
33333333333333333

可以看到我只是访问了153节点,但是却能访问到其它节点的docker的内容

所以这就是负载均衡的实现,swarm集群会自动实现负载均衡

docker service scale 的扩展

docker swarm还可以扩展或缩小容器服务

下面也展示一下,一开始我们不是指定三个容器而已吗,现在我们扩展为5个,并查看容器情况

[root@server153 ~]# docker service scale web=5
web scaled to 5
overall progress: 5 out of 5 tasks 
1/5: running   
2/5: running   
3/5: running   
4/5: running   
5/5: running   
verify: Service converged 
[root@server153 ~]# docker service ps web 
ID             NAME      IMAGE          NODE        DESIRED STATE   CURRENT STATE                ERROR     PORTS
qydzc04d6vt4   web.1     nginx:latest   server153   Running         Running 46 minutes ago                 
d2qto723yk3h   web.2     nginx:latest   server154   Running         Running 46 minutes ago                 
b41rsxvjxw7b   web.3     nginx:latest   server155   Running         Running 46 minutes ago                 
6tfah9y7hsvi   web.4     nginx:latest   server153   Running         Running about a minute ago             
a4jxhcyn33ui   web.5     nginx:latest   server155   Running         Running about a minute ago   

可以看到我们多出了两个容器,并且由swarm随机分配到其它节点上

我们去访问试试

[root@server153 ~]# curl 192.168.121.154
55555555555
[root@server153 ~]# curl 192.168.121.154
33333333333333333
[root@server153 ~]# curl 192.168.121.154
44444444444444
[root@server153 ~]# curl 192.168.121.154
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

可以看到不仅访问到了原来我们修改的信息,还访问到了其它信息

那是因为我们扩展容器节点是创建新的容器,容器里的内容就是原本镜像生成的,所以内容就会变为原来的页面信息,后面真实生产环境中挂volume载数据券就可以保持数据一致了

docker service scale 的缩小

当然还有缩小docker服务,这个在高峰访问流量下来以后还是很有用的

[root@server153 ~]# docker service scale web=2
web scaled to 2
overall progress: 2 out of 2 tasks 
1/2: running   [==================================================>] 
2/2: running   [==================================================>] 
verify: Service converged 
[root@server153 ~]# docker service ps web 
ID             NAME      IMAGE          NODE        DESIRED STATE   CURRENT STATE               ERROR     PORTS
qydzc04d6vt4   web.1     nginx:latest   server153   Running         Running about an hour ago             
d2qto723yk3h   web.2     nginx:latest   server154   Running         Running about an hour ago             

可以看到将5个docker服务缩小为2个以后,155节点上的就没有了,这样就减少了资源的消耗

docker swarm的基本用法就是这样了

希望对大家有帮助

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ps:PSDT 模板文件

自 Photoshop CC 2015.5 版以后&#xff0c;Ps 中新增了一种文件格式&#xff1a;.PSDT。 说明&#xff1a; PSD、PDD、PSDT 都是 Ps 的专用文件格式&#xff0c;需要继续在 Ps 中进行编辑的文件可存为此类格式。 PSD Photoshop document Photoshop 默认文档格式&#xff0c;支…

【ArcGIS模型构建器】06:ArcGIS中DOM批量分幅教程

ArcGIS中利用模型构建器实现DOM批量分幅裁剪。 文章目录 1. 加载数据2. 批量分幅1. 加载数据 批量分幅通常是基于数字正射影像来实现。 数字正射影像(DOM.tif)CASS标准图幅(shp) 2. 批量分幅 单个图幅可以通过裁剪或者按掩膜提取工具来进行,批量分幅采用模型构建器进行。…

django REST框架- Django-ninja

Django 是我学习的最早的web框架&#xff0c;大概在2014年&#xff0c;当时选他原因也很简单就是网上资料比较丰富&#xff0c;自然是遇到问题更容易找答案&#xff0c;直到 2018年真正开始拿django做项目&#xff0c;才对他有了更全面的了解。他是一个入门有门槛&#xff0c;学…

【t5 pytorch版源码学习】t5-pegasus-pytorch源码学习

0. 项目来源 中文生成式预训练模型&#xff0c;以mT5为基础架构和初始权重&#xff0c;通过类似PEGASUS的方式进行预训练。 bert4keras版&#xff1a;t5-pegasus pytorch版&#xff1a;t5-pegasus-pytorch 本次主要学习pytorch版的代码解读。 项目结构&#xff1a; train…

Python详细教程,如何使用Python进行数据可视化?

文章目录 前言一、导入必要的库二、加载数据三、创建基本图表四、添加更多细节五、使用Seaborn库创建更复杂的图表关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③…

卡尔曼家族从零解剖-(04)贝叶斯滤波→细节讨论,逻辑梳理,批量优化

讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解的 卡尔曼家族从零解剖 链接 :卡尔曼家族从零解剖-(00)目录最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/133846882 文末正下方中心提供了本人 联系…

【C++】类与对象 上

前言 感觉自己的基础还是不够好 最近打算在学新知识的同时 把之前的一些知识点再复习一下 引入 在C语言的学习中 我们学习过结构体 我们用结构体来描述复杂的对象 在结构体中只能定义变量 而在C的结构体中 我们可以在C中 定义函数 下面给出一个简单的例子 创建一个结构体 并…

ZZ038 物联网应用与服务赛题第I套

2023年全国职业院校技能大赛 中职组 物联网应用与服务 任 务 书 &#xff08;I卷&#xff09; 赛位号&#xff1a;______________ 竞赛须知 一、注意事项 1.检查硬件设备、电脑设备是否正常。检查竞赛所需的各项设备、软件和竞赛材料等; 2.竞赛任务中所使用的各类软件工…

解决美颜SDK集成:技术最佳实践和故障排除

美颜SDK已成为许多应用的核心功能&#xff0c;因为它可以增强用户体验&#xff0c;提高图像质量&#xff0c;吸引更多的用户。然而&#xff0c;集成美颜SDK并不总是一帆风顺。本文将为您介绍一些关键的技术最佳实践&#xff0c;以及如何排除集成过程中可能遇到的故障。 一、技…

YoloV8目标检测与实例分割——目标检测onnx模型推理

一、模型转换 1.onnxruntime ONNX Runtime&#xff08;ONNX Runtime或ORT&#xff09;是一个开源的高性能推理引擎&#xff0c;用于部署和运行机器学习模型。它的设计目标是优化执行使用Open Neural Network Exchange&#xff08;ONNX&#xff09;格式定义的模型&#xff0c;…

MapReduce WordCount程序实践(IDEA版)

环境 Linux&#xff1a;Hadoop2.x Windows&#xff1a;jdk1.8、Maven3、IDEA2021 步骤 编程分析 编程分析包括&#xff1a; 1.数据过程分析&#xff1a;数据从输入到输出的过程分析。 2.数据类型分析&#xff1a;Map的输入输出类型&#xff0c;Reduce的输入输出类型&#x…

【服务器使用】vscode winscp进行服务器容器连接(含修改初始密码)

1&#xff1a;获取docker的登陆信息 例如节点&#xff08;host&#xff09;、端口&#xff08;port&#xff09;、密码&#xff08;passwd&#xff09;等信息&#xff0c;这个自己找组内的前辈获取即可 2&#xff1a;配置config文件 找到vscode里面ssh处的config文件 人工找…

【Linux】 基础命令 第一篇

目录 ls​编辑 ls -l ls -a ls -i ls ./* cd指令&&pwd cd . && cd .. 绝对路径&#xff1a; dir/Linux/2023/10 相对路径&#xff1a; 跳转至另一路径​编辑 cd~ cd - touch指令(创建文件) stat指令&#xff1a; mkdir 指令(创建文件夹) tree指…

【Unity】2D角色跳跃控制器

最近加了学校的Nova独游社&#xff0c;本文是社团出的二面题&#xff0c;后续有时间优化下可能会做成一个二维冒险小游戏。本文主要涉及相关代码&#xff0c;参考教程&#xff1a;《勇士传说》横版动作类游戏开发教程 效果演示 【Unity】2D角色跳跃模拟器 主要实现功能&#xf…

虚幻C+++基础 day2

角色移动与视角控制 Character类与相关API 创建Character子类MainPlayer.h // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include "GameFramework/Character.h" #include &q…

element的表单校验证件号规则以及输入“无”的情况校验通过

element的表单校验证件号规则以及输入“无”的情况校验通过 <el-col :span"6"><el-form-item label"证件号码" prop"Idnumber" class"grid-content bg-purple"><el-input v-model"testForm.Idnumber" placeh…

S4.2.4.5 Fast Training Sequence (FTS)

一 本章节主讲知识点 1.1 FTS的用途和实现注意 二 本章节原文翻译 Fast Training Sequence (FTS) 主要用于在L0s->L0跳转的过程中&#xff0c;让Receiver 检测到电气空闲退出&#xff0c;以及实现bit 和 symbol lock。 2.1 Gen1 and Gen2 速率 对于Gen1/2 FTS的组成如下…

OpenGL_Learn07(变换)

1. 向量 向量有一个方向和一个大小。如果一个向量有2个维度&#xff0c;它表示一个平面的方向(想象一下2D的图像)&#xff0c;当它有3个维度的时候它可以表达一个3D世界的方向。 可以把这些2D向量当做z坐标为0的3D向量。 2. 向量内积和外积 向量的点乘&#xff08;内积&#x…

打开运行ps提示找不到msvcp140.dll的解决方法分享

最近&#xff0c;我在安装Adobe Photoshop&#xff08;简称PS&#xff09;和Adobe Premiere Pro&#xff08;简称PR&#xff09;时遇到了一个困扰我很久的问题&#xff0c;即提示找不到msvcp140.dll文件。msvcp140.dll是Microsoft Visual C 2015 Redistributable的一个组件&…

Crypto(7)BUUCTF-RSA4

BUUCTF RSA4 下载题目&#xff0c;可见文件给出了3组n和c N 331310324212000030020214312244232222400142410423413104441140203003243002104333214202031202212403400220031202142322434104143104244241214204444443323000244130122022422310201104411044030113302323014101…
最新文章