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:2377To 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的基本用法就是这样了
希望对大家有帮助
相关文章:
Docker Swarm实现容器的复制均衡及动态管理:详细过程版
Swarm简介 Swarm是一套较为简单的工具,用以管理Docker集群,使得Docker集群暴露给用户时相当于一个虚拟的整体。Swarm使用标准的Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(dockerclient in go, docker_py…...
Proteus仿真--1602LCD显示仿手机键盘按键字符(仿真文件+程序)
本文主要介绍基于51单片机的1602LCD显示仿手机键盘按键字符(完整仿真源文件及代码见文末链接) 仿真图如下 其中左下角12个按键模拟仿真手机键盘,使用方法同手机键一样,长按自动跳动切换键值,松手后确认选择ÿ…...
Rust语言和curl库编写程序
这是一个使用Rust语言和curl库编写的爬虫程序,用于爬取视频。 use std::env; use std::net::TcpStream; use std::io::{BufReader, BufWriter}; fn main() {// 获取命令行参数let args: Vec<String> env::args().collect();let proxy_host args[1].clon…...
FSDiffReg:心脏图像的特征和分数扩散引导无监督形变图像配准
论文标题: FSDiffReg: Feature-wise and Score-wise Diffusion-guided Unsupervised Deformable Image Registration for Cardiac Images 翻译: FSDiffReg:心脏图像的特征和分数扩散引导无监督形变图像配准 摘要 无监督可变形图像配准是医学…...
音视频技术开发周刊 | 318
每周一期,纵览音视频技术领域的干货。 新闻投稿:contributelivevideostack.com。 日程揭晓!速览深圳站大会专题议程详解 LiveVideoStackCon 2023 音视频技术大会深圳站,保持着往届强大的讲师阵容以及高水准的演讲质量。两天的参会…...
asp.net docker-compose添加sql server
打开docker-compose.yml 添加 sqldata:image: mysql:8.1.0 打开docker-compose.override.yml 添加 sqldata:environment:- MYSQL_ROOT_PASSWORDPasswordports:- "8080:8080"volumes:- killsb-one-sqldata:/etc/mysql/conf.d 在docker里面就有了sql server容器镜像…...
uniapp 微信小程序 uni-file-picker上传图片报错 chooseAndUploadFile
这个问题真的很搞, 原因是微信开发者工具更新了,导致图片上传问题。 解决方法: 将微信开发者工具的基础库改为2.33.0一下即可。 在微信开发者工具详情 - 本地设置中(记得点击‘推送’按钮):...
《向量数据库指南》——用 Milvus Cloud和 NVIDIA Merlin 搭建高效推荐系统结论
如何搭建一个高效的推荐系统? 简单来说,现代推荐系统由训练/推理流水线(pipeline)组成,涉及数据获取、数据预处理、模型训练和调整检索、过滤、排名和评分相关的超参数等多个阶段。走遍这些流程之后,推荐系统能够给出高度个性化的推荐结果,从而提升产品的用户体验。 为…...
致:CSGO游戏搬砖人的一封信
最近大家还在坚持操作CSGO游戏搬砖项目不? 这个项目虽是稳赚项目,但也有行情好和行情不好的时候,平台的大中小各种活动的举办,都会对我们的项目造成一定影响。行情的上下波动势必然会影响卡价的波动,影响选品的快慢&a…...
MuLogin浏览器如何在一台设备上安全登录和管理多个LinkedIn账户?
一、LinkedIn多个账户的用处 LinkedIn作为世界上最大的专业人士社交平台,具有许多有用的功能,对于个人和企业来说都非常重要。以下是多个LinkedIn账户的一些典型用途: 1. 分行业账户:如果您在不同的行业从事职业活动,…...
STM32_project:led_beep
代码: 主要部分: #include "stm32f10x.h" // Device header #include "delay.h"// 给蜂鸣器IO口输出低电平,响,高,不向。 //int main (void) //{ // // 开启时钟 // RC…...
[go 反射] 入门
[go 反射] 入门 首先认识go 反射的两大概念,反射之路少不了他们 reflect.Type(接口)获取类型,和列名就找它reflect.Value(结构体)获取值,设置值找它 [tips] 通常是用这两者手底下的方法,reflect.Value结构体中有什么自行查看 …...
【计算机网络】数据链路层-MAC和ARP协议
文章目录 1. 认识以太网2. MAC协议MAC帧的格式MAC地址和IP地址的区别MTU 3. 局域网通信原理碰撞检测和避免 4. ARP协议ARP数据报的格式ARP缓存 1. 认识以太网 网络层解决的是跨网络点到点传输的问题,数据链路层解决的是同一网络中的通信。 数据链路层负责在同一局域…...
本周三商店更新:多款套装下线,四款升级武器带异色皮肤返厂
本周三将迎来26.2版本更新与11商店大更新,版本更新可点击26.2版本更新公告进行查看,这里不一一赘述了,下面大概罗列一下商店更新,有皮肤下架,大家还能趁最后时间入手,最重要的是四款升级武器返厂咯。 危险玩…...
WindowsServer2019-搭建FTP服务器
这里写自定义目录标题 一、基础配置IP地址安装FTP服务检查连通性Windows10连接FTP服务 二、了解和使用FTP具体模块及其配置1、FTP IP地址和域限制2、FTP SSL设置3、FTP当前会话4、FTP防火墙5、FTP目录浏览6、FTP请求筛选7、FTP日志8、FTP身份验证9、FTP授权规则10、FTP消息11、…...
国际阿里云服务器买哪种好用点?
在当时数字化年代,云核算已经成为了企业进行事务运营和数据存储的重要东西。而阿里云作为我国最大的云核算服务供给商,其服务器产品线也适当丰厚。那么,对于用户来说,阿里云服务器买哪种好用点呢?这需求依据个人和企业…...
2023NOIP A层联测25 总结
T1 让你构造 40 40 40\times40 4040 的只含 r,y,x 的矩阵,含有 r y x ryx ryx 的个数恰好为 n n n, n ≤ 2222 n\le2222 n≤2222。看完题后就开始想构造,一开始想构造 3 ∗ 3 3*3 3∗3, 5 ∗ 5 5*5 5∗5 的单位矩阵的,但是始…...
Thread类的基本操作(JAVA多线程)
线程是操作系统中的概念,操作系统内核实现了线程这样的机制,并提供了一些API供外部使用。 JAVA中 Thread类 将系统提供的API又近一步进行了抽象和封装,所以如果想要使用多线程就离不开 Thread 这个类。 线程的创建(Thread类) 在JAVA中 创建…...
Redis 的三种部署模式
提前叠个 buff:这个文章不涉及图(画起来比较麻烦),只是记录我的胡思乱想。 redis 从单点 -> 集群总共有三个部署模式:单机模式,主从模式,哨兵模式,集群模式 单机模式 新手入门模…...
【ArcGIS Pro二次开发】(73):使用NPOI库操作Excel
NPOI是一个开源的C#读写Excel、WORD等微软OLE2组件文档的项目。 NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作。 相较于之前使用的Microsoft.Office.Interop.Excel,已经感觉到的优势,一是读写速度较快,虽然小数据量的读…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
