当前位置: 首页 > news >正文

中小型集群部署,Docker Swarm(集群)使用及部署应用介绍

1、Docker Swarm简介

说到集群,第一个想到的就是k8s,但docker官方也提供了集群和编排解决方案,它允许你将多个 Docker 主机连接在一起,形成一个“群集”(Swarm),并可以在这个 Swarm 上运行和管理你的服务。

与Kubernetes相比,Docker Swarm的群集管理功能相对简单,Swarm更适合于小型到中型的容器部署,并且通常用于简单的应用程序部署和管理。

如果经常用docker-compose 的人员来说,可以这样容易理解。

  • docker-compose:可以在一台机器上使用docker-compose.yml轻松部署多个服务(如nginx,php,mysql)
  • docker swarm:将一个服务部署至多台机器(如nginx,部署到机器1,机器2,机器3)

2、部署准备工作

这里用swarm部署一个简单的应用nginx,测试并熟悉swarm。
两台机器,系统ubuntu。
192.168.203.129,192.168.203.130,1台作为manage主服务器,1台作为worker节点。

注:生产环境建议是 3个manager 以上,如果只有2台
manager,当主manager挂掉之后,另一台从manager是不会升级为主manager的
,因为从manager升级为主manager的条件是存活的从manager节点个数必须大于1。

安装docker最新版本默认安装有docker swarm。

防火墙,如果是云服务器,请开放端口2377,允许与工作节点服务器通讯。
一般而言,如果是在多台物理机上搭建swarm集群,那么port就是2377,如果是在docker虚拟机上搭建的,那么port就是2376。

3、初始化swarm集群,创建主管理节点

我这里测试129为manager服务器,直接用命令初始化。这将在当前主机上创建一个 Swarm,并将其设置为 Swarm 的管理节点。在此过程中,Docker 会生成一个用于其他节点加入的 token,务必妥善保管这个 token。

sudo docker swarm init --advertise-addr 192.168.203.129

运行结果:

ubuntu@ubuntu:~$ sudo docker swarm init --advertise-addr 192.168.203.129
Swarm initialized: current node (xcpn4el8vvs2hymojpbay8m6q) is now a manager.To add a worker to this swarm, run the following command:docker swarm join --token SWMTKN-1-08hc7u7ed38xnli6ikqzq8flfrr7kzn0bi7d2qiekdsxnstqlm-ed7h0bzk2dno6dmn8luzssj84 192.168.203.129:2377To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

输出文字的意思是此地址已经加入到了这个swarm,你可以使用 docker swarm join --token xxxxx 命令将其它节点加入到这个swarm中来成为工作节点。

查看节点信息:sudo docker node ls,管理节点已经起来了。

ubuntu@ubuntu:~$ sudo docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
xcpn4el8vvs2hymojpbay8m6q *   ubuntu     Ready     Active         Leader           26.0.0

4、添加工作节点

在工作节点服务器,执行上面提示的token即可加入。

sudo docker swarm join --token SWMTKN-1-08hc7u7ed38xnli6ikqzq8flfrr7kzn0bi7d2qiekdsxnstqlm-ed7h0bzk2dno6dmn8luzssj84 192.168.203.129:2377

提示This node joined a swarm as a worker,没有报错说明已经加入管理节点。

住管理节点服务器,再次运行sudo docker node ls,查看节点,已经成功添加。

ubuntu@ubuntu:~$ sudo docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
iha4vzuoyihcblayk08v7mya4     ubuntu     Ready     Active                          26.0.0
xcpn4el8vvs2hymojpbay8m6q *   ubuntu     Ready     Active         Leader           26.0.0

这里swarm集群就已经搭建完了,是不是很简单。

节点类型转换,如果想将worker节点转换为manager节点,可以运行如下命令。

sudo docker node promote worker-nodename

worker-nodename为自己节点的名称,我这里也可以用ID操作,显示如下,切换成功,状态为Reachable。如果另外一台管理节点挂掉,则新加入的manager节点状态由reachable变为leader, 之前的manager节点状态为unreachable.

ubuntu@ubuntu:~$ sudo docker node promote iha4vzuoyihcblayk08v7mya4
Node iha4vzuoyihcblayk08v7mya4 promoted to a manager in the swarm.
ubuntu@ubuntu:~$ sudo docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
iha4vzuoyihcblayk08v7mya4     ubuntu     Ready     Active         Reachable        26.0.0
xcpn4el8vvs2hymojpbay8m6q *   ubuntu     Ready     Active         Leader           26.0.0

如果想要节点降级,可以用以下命令:

docker node demote worker-nodename

如果工作节点脱离swarm集群,切换到工作节点服务器,执行命令,

sudo dokcer swarm leave

如果管理器节点脱离swarm集群,增加参数–force即可

sudo docker swarm leave --force

5、用swarm部署服务(nginx为例)

集群搭建完成,现在用集群部署nginx服务,以下全部在管理节点操作。

创建网络

在 managmer 上创建一个 overlay 为驱动的网络(默认使用的网络连接为ingress),查看集群环境下的网络列表:docker network ls

sudo docker network create -d overlay nginx_net

部署服务

部署nginx服务命令

sudo docker service create
//指定了使用网络,如上面创建的nginx_net网络
--network nginx_net \//创建的容器名
--name my-nginx \
//端口映射
--p 8080:80 \
//创建副本的数量,这里两台机器,就两个副本即可
--replicas 2 \
//镜像
nginx  

在管理节点执行

sudo docker service create --network nginx_net --name my-nginx -p 8080:80 --replicas 2 nginx

运行完后,可以用以下命令查看相关信息。

//查看服务列表命令
sudo docker service ls
//服务运行节点命令
sudo docker service ps
//查看my-nginx服务的详细信息:
docker service inspect my-nginx

运行结果如下,nginx已经在两台机器成功运行。

ubuntu@ubuntu:~$ sudo docker service create --network nginx_net --name my-nginx -p 8080:80 --replicas 2 nginx
s07fiokkcgka28tfmwxozouj3
overall progress: 2 out of 2 tasks 
1/2: running   [==================================================>] 
2/2: running   [==================================================>] 
verify: Service s07fiokkcgka28tfmwxozouj3 converged 
ubuntu@ubuntu:~$ sudo docker service ls
ID             NAME       MODE         REPLICAS   IMAGE          PORTS
s07fiokkcgka   my-nginx   replicated   2/2        nginx:latest   *:8080->80/tcp
ubuntu@ubuntu:~$ sudo docker service ps my-nginx
ID             NAME         IMAGE          NODE      DESIRED STATE   CURRENT STATE                ERROR     PORTS
l8aiihhyy6sb   my-nginx.1   nginx:latest   ubuntu    Running         Running about a minute ago             
rx77s1hpyg62   my-nginx.2   nginx:latest   ubuntu    Running         Running about a minute ago             
ubuntu@ubuntu:~$ 

浏览器测试,分别输入两台机器IP访问,可以看到已经搭建成功。

在这里插入图片描述

6、 扩容和缩容

如上,现在只有两台机器,所以只创建了两个副本,如果增加机器或者减少机器,就需要扩容和缩容。
扩容:将my-nginx服务副本数量扩容至6个,命令如下:

sudo docker service update --replicas 6 my-nginx
或者
sudo docker service scale my-nginx=6

扩容完成后,会平均分配副本数量到其他服务器中。

缩容:将副本数从6个缩容至3个,也是使用 docker service update --replicas 或 docker service scale 命令:

sudo docker service update --replicas 3 my-nginx
或者
sudo docker service scale my-nginx=3

移除my-nginx服务:

sudo docker service rm my-nginx

docker swarm虽然可以部署集群,但是只能单个服务,有没有同时部署多服务的集群?
当然有,可以参考下面文章介绍docker stack(堆栈)服务编排。

相关文章:

中小型集群部署,Docker Swarm(集群)使用及部署应用介绍

1、Docker Swarm简介 说到集群,第一个想到的就是k8s,但docker官方也提供了集群和编排解决方案,它允许你将多个 Docker 主机连接在一起,形成一个“群集”(Swarm),并可以在这个 Swarm 上运行和管…...

gateway做负载均衡

在Spring Cloud中,Gateway可以通过配置文件来实现负载均衡。以下是一个简单的配置示例,它演示了如何将请求代理到名为service-instance的服务的两个不同实例。 spring:cloud:gateway:routes:- id: service-instance-routeuri: lb://service-instancepre…...

pytorch中的torch.hub.load()

pytorch提供了torch.hub.load()函数加载模型,该方法可以从网上直接下载模型或是从本地加载模型。官方文档 torch.hub.load(repo_or_dir, model, *args, sourcegithub, trust_repoNone, force_reloadFalse, verboseTrue, skip_validationFalse, **kwargs)参数说明&a…...

R语言学习——Rstudio软件

R语言免费但有点难上手,是数据挖掘的入门级别语言,拥有顶级的可视化功能。 优点: 1统计分析(可以实现各种分析方法)和计算(有很多函数) 2强大的绘图功能 3扩展包多,适合领域多 …...

触发器的工艺结构原理及选型参数总结

🏡《总目录》 目录 1,概述2,工作原理3,结构特点4,工艺流程4.1,掩膜制作4.2,晶片生长4.3,晶片切割4.4,晶片清洗4.5,掩膜光刻4.6,金属沉积5,选型参数5.1,触发类型5.2,触发频率...

Hana数据库 No columns were bound prior to calling SQLFetch or SQLFetchScroll

在php调用hana数据库的一个sql时报错了&#xff0c;查表结构的sql&#xff1a; select * from sys.table_columns where table_name VBAP SQLSTATE[SL009]: <<Unknown error>>: 0 [unixODBC][Driver Manager]No columns were bound prior to calling SQLFetch …...

DevOps是什么

DevOps 是一种将软件开发 (Dev) 和 IT运维 (Ops) 结合起来的实践、文化和哲学&#xff0c;旨在缩短系统开发生命周期&#xff0c;提供高质量的软件持续交付。它涉及多个关键实践和工具&#xff0c;其核心目的是加强开发和运维团队之间的协作和通信。以下是构成DevOps的一些重要…...

windows下的vscode + opencv4.8.0(C++) 配置

1.添加环境变量 D:\mingw64\bin 2.安装vscode 3.下载opencv 4.8.0 4.程序引用第三方库(opencv为例) 打开CMakeLists.txt&#xff0c;引入头文件&#xff0c;使用include_directories 加入头文件所在目录。静态链接库link_directories # 头文件 include_directories(D:/ope…...

微信小程序之多视频暂停播放,超出可视区域停止播放视频在自定义组件中实现案例

项目页面存在多个视频时&#xff0c;只播放视频可见范围内单个视频播放的解决方案 QQ录屏20240326175303 在自定义组件中无onPageScroll(e)监听页面滚动的函数所以在自定义组件中用<scroll-view>标签包裹所有组件&#xff08;以下为WXML页面源码&#xff09; <scroll…...

Java 加载外部 Jar 中的类并通过反射调用类中的方法

目录 问题 类加载器 获取外部 jar 包中的类以及方法 调用外部 jar 包中的方法 问题 工作中遇到一个需求&#xff0c;客户端将第三方的 jar 包上传到服务器中&#xff0c;系统需要解析出上传的 jar 中所有类以及类下的方法&#xff08;方法名&#xff0c;方法输入参数类型&…...

Arduino+ESP8266+华为云物联网平台实现智能开关

前言 最近在做一个物联网项目&#xff0c;涉及到智能开关的开发。目前已经实现简单的TCP通信远程控制&#xff0c;但是考虑到后期的设备管理以及设备通信所需要的技术和服务器的维护成本&#xff0c;我决定将设备接入云平台。本文将详细阐述如何利用华为云的物联网平台&#x…...

使用 python 拆分 excel 文件

文章目录 1、安装虚拟环境&#xff08;在特定文件夹内&#xff09;2、脚本 split.sh3、运行脚本&#xff08;在特定文件夹内&#xff09;4、结果 1、安装虚拟环境&#xff08;在特定文件夹内&#xff09; brew install python3 xcode-select --install python3 -m venv my_pan…...

uniapp小程序中onShareAppMessage(OBJECT)实现带参数的分享功能

一、引言 小程序中用户点击分享后&#xff0c;在 js 中定义 onShareAppMessage 处理函数&#xff08;和 onLoad 等生命周期函数同级&#xff09;&#xff0c;设置该页面的分享信息。 用户点击分享按钮的时候会调用。这个分享按钮可能是小程序右上角原生菜单自带的分享按钮&…...

5个免费的3D钣金CAD软件

如果你正在设计简单的折叠钣金零件&#xff0c;则只需设计一些具有圆角半径的法兰&#xff1a;一个简单的钣金模块。 首先&#xff0c;你可以采用老式方式绘图并以 2D 方式完成所有操作。 许多传统制造商仍在使用 2D DWG 和 DXF 图纸。 因此&#xff0c;你很有可能只需快速起草…...

3.26学习总结

java 实例变量和局部变量 实例变量是记录这个类中对象的特点的每一个对象的实例变量都可以不同(例如名字,性别等),其中一个对象的实例变量改变不会影响其他的变量. 类变量是一种特殊的实例变量,他的特殊在于所有的对象的类变量都是相同的,当一个对象改变了类变量那么所有对象…...

Cisco Catalyst3850交换机RTU license使用方法

1 情况说明 客户处采购了4台3850-14T交换机&#xff0c;在配置的时候发现OSPF不支持&#xff0c; 查询原因为当前license不支持 (lanbase, 只能支持2层功能&#xff09; 报错如下&#xff1a; Access-3850-1(config)#router ospf 100 Protocol not in this image2 如何处理&a…...

简明 Python 教程(第5章 函数)

本章介绍了函数的基本概念和使用方法&#xff0c;包括定义函数、传递参数、局部变量、全局变量、默认参数、关键字参数、返回值和文档字符串。 掌握这些概念对于编写结构化和可维护的Python代码至关重要。 定义函数 使用def关键字 定义函数始于def关键字&#xff0c;它告诉P…...

flutter 保存一堆多语言翻译词条,由key和value组成

原理&#xff1a; 1.从String列表里面获取某个value&#xff1a; List<String> jsonStrings [{"name": "John", "age": 30},{"name": "Jane", "age": 25},{"name": "Bob", "age…...

3月25日,每日信息差

&#x1f396; 素材来源官方媒体/网络新闻 &#x1f384; 京东汽车将和小米汽车进行深度合作 &#x1f30d; 百度将为苹果国行iPhone16提供AI功能&#xff1f;百度方面称暂无回应 &#x1f30b; 国产结核病新型mRNA疫苗即将问世 &#x1f381; 美国发布严重地磁暴预警&#xff…...

Git常用指令使用

摘要&#xff1a;之前代码管理都是借助于fork、sourceTree等图形工具&#xff0c;最近发现直接用命令也好用&#xff0c;就总结Git常用的指令 1、Git的介绍 1.1 git官网 安装: Git - Downloading Packagehttps://git-scm.com/download/mac Mac上安装&#xff0c;直接使…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...