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

Docker图形化界面工具Portainer最佳实践

  • 前言

  • 安装Portainer

  • 实践-基于Portainer安装redis-sentinel部署

  • Spring Boot集成Redis Sentinel


前言

本篇文章笔者推荐一个笔者最常用的docker图形化管理工具——Portainer。

安装Portainer

编写docker-compose文件

Portainer部署的步骤比较简单,我们还是以docker-compose文件的形式完成Portainer的安装,首先我们需要需要编写的名为portainer.yml的文件,内容如下:

version: "3"
services:portainer:image: portainer/portainer:latestcontainer_name: portainerports:- "9000:9000"volumes:- /app/portainer/data:/data- /var/run/docker.sock:/var/run/docker.sock

完成后,我们将这个文件上传到我们的服务器即。

初始化并配置容器

将配置文件上传之后我们就可以尝试启动了,为了方便查看服务是否可以正常启动,我们还先以前台运行的方式启动,到达portainer.yml文件位置,键入前台启动命令

docker-compose -f portainer.yml up

当控制台没有输出错误,并显示正常启动后,我们分开服务器的9000端口,浏览器输入服务器ip:9000,即可进入Portainer初始化界面,它会要求我们配置用户名密码:

图片

完成账户密码初始化之后,我们点击local进行服务器本地容器管理

图片

图片

此时我们就会看到local中docker的基本信息了

图片

图片

在步入local,我们就可以按需管理容器、镜像、网络等配置信息。我们不妨点击containers查看我们服务器中当前运行的docker容器。

图片

图片

可以看到我们docker中容器的运行情况,由于portainer涉及操作很多,笔者这里就不一一演示了,感兴趣的读者可以自行查阅portainer官方文档

https://www.portainer.io/take-5

图片

图片

到上述步骤我们已经可以确定portainer安装基本成功了,我们可以回到服务器将portainer后台启动,正式使用portainer了。

docker-compose -f portainer.yml up -d

实践-基于Portainer安装redis-sentinel部署

介绍

读完上述的介绍可能读者们对Portainer还没有一个比较清晰的了解,所以笔者在这里就基于一个redis-sentinel的部署介绍一下Portainer的日常操作步骤。

首先我们来介绍一下本次部署架构,我们会基于一台服务器完成一主二从+三个哨兵的部署架构,最终效果是:

  • 当主节点更新数据之后,从节点数据也会进行同步。

  • 当我们将主节点手动停止之后,哨兵就会选举出新的master继续进行工作。

图片

图片

安装步骤
主从复制部署

首先我们先进性主从结构的部署,我们还是基于docker-compose创建一个名为redis-cluster.yml的文件配置一下主从信息,配置内容如下,笔者已将配置的含义都一一注释,读者可自行参考修改。需要注意以下两点:

安全起见,建议读者尽可能不要使用6379作为对外暴露的端口号,就算使用6379也尽可能设置一个安全的密码,避免被人下挖矿程序。

当读者复制下面的文件在服务器启动时可能会报各种语法错误,所以笔者推荐的yaml格式化在地址,读者完成配置后可以将配置粘贴到这个网站完成自动格式化。这样可以避免启动时报一些没必要的错误

version: '3'
services:# 主节点master:image: redis# 主节点名称container_name: redis-master# 设置redis登录密码、从节点连接主节点的密码command: redis-server --requirepass xxxx--masterauth xxxxports:# 对外暴露端口号为16379- 16379:6379# 从节点slave1:image: rediscontainer_name: redis-slave-1ports:# 对外暴露端口号为16380- 16380:6379# 启动redis 从属于容器名为 redis-master的redis,端口号为容器端口号而不是对外映射端口号,设置连接密码,连接主节点的密码command:  redis-server --slaveof redis-master 6379 --requirepass xxxx--masterauth xxxxx# 从节点2slave2:image: rediscontainer_name: redis-slave-2ports:- 16381:6379command: redis-server --slaveof redis-master 6379 --requirepass xxxxx --masterauth xxxxx

完成后我们即可将配置上传到服务器并启动:

docker-compose -f redis-cluster.yml up

启动完成后就可以在portainer中看到一主二从出现在containers列表中

图片

以master为例,我们不妨点击log查看master节点的运行情况

图片

从输出可以看到master没有输出任何错误,说明master正常运行了。

图片

在确认每个容器都能正常启动之后,我们不妨尝试在master节点写入一些数据测试一下主从节点同步功能是否正常。

在没有portainer之前,我们进入docker容器内容用的都是使用docker exec -it 容器id bash/sh命令,有了portainer之后,我们进入容器的操作就变得非常简单了。

回到容器列表,点击redis-master进入容器管理界面

图片

点击console,进入容器终端连接界面

图片

点击connect连接进入容器

图片

然后我们就进入的容器内部,尝试使用redis-cli认证并设置一个kv值。

图片

完成上述步骤后,我们到达从节点的容器内部查阅数据可以发现,主节点数据确实同步过来了,自此我们主从复制部署基本完成。

图片

创建redis-sentinel专用网络驱动

为了确保redis-sentinel可以统一管理且和其他容器隔离,我们在部署sentinel之前需要基于Portainer创建一个自定义的brige网络。

什么是brige网络呢?其实docker容器中有以下几种网络驱动类型,不同的网络驱动类型可以使得容器和宿主机有着不同的网络关联:

  1. host: 使用docker宿主机网络

  2. bridge: 该网络支持在同一个宿主机上的各个容器实例之间的通信。bridge网络是一个独立的网络空间,在网络空间内部的各个容器实例能够直接通信。

  3. none: 是一个完全隔离的自治网络,甚至与Docker宿主机的网络都不通,必须手工配置网卡后才能够使用。加入到该网络的容器实例,往往要在后续设置中加入到其他的第三方网络。

  4. overlay: 该类型的网络适用于Docker宿主机集群中的各个独立的容器实例之间通信。

  5. macvlan: 该类型的网络适用于容器实例需要与宿主机的MAC地址直接通信,无需端口映射,也无需NAT,容器实例的eth0直接与宿主机的物理网卡通信。容器实例可以被赋予公共IP,并从宿主机外部直接访问。

所以我们这里就希望创建一个名为redis-sentinel的bridge网络将主从和哨兵节点关联起来,并且和docker中的其他容器隔离开:

图片

所以我们按照点击network,选择add network进行自定义网络创建

图片

输入名称为redis-sentinel,其余默认,然后直接点击

图片

然后直接点击create the network

图片

然后我们就可以在network列表中看到我们配置的network,自此网络redis专用桥接网络配置完成。

图片

重点来了,我们的redis主从节点现在都处于默认的网络驱动中,我们必须手动将其配置到redis-sentinel网络中,当然有了portainer,这种操作也不会很难。

我们只需要点击容器列表,找到我们的主动节点容器,然后分别进入他们的管理列表最下方,找到network选项,在network列表中找到redis-sentinel选择join network即可。

图片

创建哨兵

接下来就可以配置哨兵节点了,首先自然是创建一个名为redis-sentinel.yml的docker-compose文件配置3个哨兵:

version: '3'
services:sentinel1:image: redis# 容器名称container_name: redis-sentinel-1ports:# 端口映射- 26379:26379# 启动redis哨兵command: redis-sentinel /usr/local/etc/redis/sentinel.confvolumes:# 哨兵1的sentinel.conf和宿主文件位置映射- /app/cloud/redis/sentinel/sentinel1.conf:/usr/local/etc/redis/sentinel.confsentinel2:image: rediscontainer_name: redis-sentinel-2ports:- 26380:26379command: redis-sentinel /usr/local/etc/redis/sentinel.confvolumes:- /app/cloud/redis/sentinel/sentinel2.conf:/usr/local/etc/redis/sentinel.confsentinel3:image: rediscontainer_name: redis-sentinel-3ports:- 26381:26379command: redis-sentinel /usr/local/etc/redis/sentinel.confvolumes:- /app/cloud/redis/sentinel/sentinel3.conf:/usr/local/etc/redis/sentinel.conf
# 重点,将3个哨兵加入到redis-sentinel和主从节点建立联系
networks:default:external:name: redis-sentinel

从配置文件中可以看出笔者将哨兵文件和宿主文件进行关联,所以我们需要按照上面配置在app/cloud/redis/sentinel/文件夹下创建3个哨兵的配置文件sentinel.conf。

哨兵1的配置文件如下,其余哨兵配置同理,只需按需修改ip和端口号即可:

port 26379
dir /tmp
# master节点在bridge网络中的ip值
sentinel monitor redis-master 172.20.0.2 6379 2
# master节点密码
sentinel auth-pass redis-master xxxxx
sentinel down-after-milliseconds redis-master 30000
sentinel parallel-syncs redis-master 1
sentinel failover-timeout redis-master 180000
sentinel deny-scripts-reconfig yes

可以看到笔者将master节点命名为redis-master,然后网络配置为172.20.0.2这个值是从哪里来的呢?很简单,我们点击redis-master即redis主节点那个容器管理界面,到达最下方,就可以在ip address一栏看到master节点的容器ip地址,因为哨兵节点和主从节点都处于redis-sentinel这个网络中,所以170.20.0.x这个网络是互通的,在bridge模式下配置这个ip地址是完全没有问题的。

图片

完成上述步骤后我们就可以将哨兵启动

docker-compose -f  redis-sentinel.yml up

此时我们点击任意一个哨兵节点都可以看到,哨兵的状态信息,自此哨兵也部署完成了

图片

测试可用性

此时我们就可以测试哨兵是否正常工作了,我们的测试用例很简单,我们将master关闭掉,查看哨兵是否会选举出新的master顶上。

在测试前我们首先进入master容器输入info replication查看master容器中的redis是否为主节点

图片

再查看另外两个几点是否身份是否确属从节点。

从节点1:

图片

从节点2:

图片

我们通过portainer图形界面将redis-master关闭。

图片

点入任意一个哨兵日志,可以看到它监控到主节点下线,并快速选举出一个新的节点作为master上线

图片

我们根据ip地址172.20.0.3定位到是slave2这个redis,我们进入容器查看其身份,确实变为master。

图片

自此我们的redis-sentinel部署完成了。

相关文章:

Docker图形化界面工具Portainer最佳实践

前言 安装Portainer 实践-基于Portainer安装redis-sentinel部署 Spring Boot集成Redis Sentinel 前言 本篇文章笔者推荐一个笔者最常用的docker图形化管理工具——Portainer。 安装Portainer 编写docker-compose文件 Portainer部署的步骤比较简单,我们还是以…...

借助 FinClip 跨端技术探索鸿蒙原生应用开发之旅

在当今数字化浪潮汹涌澎湃的时代,移动应用开发领域正经历着深刻的变革与创新。鸿蒙操作系统的崛起,以其独特的分布式架构和强大的性能表现,吸引了众多开发者的目光。而FinClip 跨端技术的出现,为开发者涉足鸿蒙原生应用开发提供了…...

【网络】ARP表、MAC表、路由表

ARP表 网络设备存储IP-MAC映射关系的表项,便于快速查找和转发数据包 ARP协议工作原理 ARP(Address Resolution Protocol),地址解析协议,能够将网络层的IP地址解析为数据链路层的MAC地址。 1.主机在自己的ARP缓冲区中建…...

Linux驱动开发学习准备(Linux内核源码添加到工程-Workspace)

Linux内核源码添加到VsCode工程 下载Linux-4.9.88源码: 没有处理同名文件的压缩包: https://pan.baidu.com/s/1yjIBXmxG9pwP0aOhW8VAVQ?pwde9cv 已把同名文件中以大写命名的文件加上_2后缀的压缩包: https://pan.baidu.com/s/1RIRRUllYFn2…...

25.1.3

java数组: dataType[] arrayRefVar //推荐写法 //int[] mylist //或 dataType arrayRefVar[] //int mylist[]创建数组对象: arrayRefVar new dataType[arraySize]; dataType[] arrayRefVar new dataType[arraySize];for-each循环: jav…...

Leecode刷题C语言之我的日程安排表②

执行结果:通过 执行用时和内存消耗如下: typedef struct {int start;int end; }BOOKING;#define MAX_BOOK_NUM (1000) typedef struct MyCalendar_ {BOOKING book[MAX_BOOK_NUM];int bnum;BOOKING *sorted[MAX_BOOK_NUM];int num;int conflict[MAX_BOOK_NUM];int c…...

十二、Vue 路由

文章目录 一、简介二、安装与基本配置安装 Vue Router创建路由实例在应用中使用路由实例三、路由组件与视图路由组件的定义与使用四、动态路由动态路由参数的定义与获取动态路由的应用场景五、嵌套路由嵌套路由的概念与配置嵌套路由的应用场景六、路由导航<router - link>…...

smell---Paddle-DI

跨模态文档智能大模型–Ernie-Layout 目标&#xff1a;提取文档中无结构或半结构化的知识 github项目地址 Paddle NLP ERNIE-Layout基于Transformer Encode架构&#xff0c;并提出以下trick&#xff1a; 1、OCR工具提取信息 借助OCR工具提取图片中的文字及文字对应的坐标信息…...

PCL点云库入门——PCL库点云特征之点云法向量(NormalEstimation)及其可视化

1、PCL点云库中点云特征综述 1.1、点云特征综述 点云特征描述在三维数据处理领域扮演着至关重要的角色&#xff0c;它直接决定了后续的识别、分类以及重建等关键任务的执行效果。在众多的特征描述方法中&#xff0c;我们可以看到基于几何形状的特征、基于统计信息的特征以及…...

25.Java JUC 引入(进程与线程、线程的状态、并发与并行、管程、用户线程与守护线程)

一、JUC 简介 JUC 是 java.util.concurrent 工具包的简称&#xff0c;这是一个处理线程的工具包&#xff0c;从 JDK1.5 开始出现 二、进程与线程 1、基本介绍 &#xff08;1&#xff09;进程 进程是计算机中的程序关于某数据集合上的一次运行活动&#xff0c;是系统进行资源…...

Linux 异步 I/O 框架 io_uring:基本原理、程序示例与性能压测

大家觉得有意义和帮助记得关注和点赞&#xff01;&#xff01;&#xff01; io_uring 是 2019 年 Linux 5.1 内核首次引入的高性能 异步 I/O 框架&#xff0c;能显著加速 I/O 密集型应用的性能。 但如果你的应用已经在使用 传统 Linux AIO 了&#xff0c;并且使用方式恰当&…...

Uniapp中使用`wxml-to-canvas`开发DOM生成图片功能

Uniapp中使用wxml-to-canvas开发DOM生成图片功能 在移动端开发中&#xff0c;生成图片是一个常见需求&#xff0c;例如用于分享海报、生成动态二维码等。在Uniapp框架中&#xff0c;我们可以通过wxml-to-canvas插件轻松实现将DOM转化为图片的功能。本文将详细介绍如何在Uniapp…...

Linux之ARM(MX6U)裸机篇----5.仿stm32的LED驱动实验

一&#xff0c;启动文件 .global _start .global _bss_start /* 类似宏定义把__bss_start定义为_bss_start */ _bss_start:.word __bss_start.global _bss_end _bss_end:.word __bss_end_start:#设置处理器进入SVC模式mrs r0, cpsr /* 读取cpsr到r0 */bic r0, r0, …...

DVWA靶场Open HTTP Redirect (重定向) 漏洞所有级别通关教程及源码审计

目录标题 Open HTTP Redirectlow源码审计 medium源码审计 high源码审计 impossible源码审计 Open HTTP Redirect HTTP 重定向&#xff08;HTTP Redirect Attack&#xff09;是一种网络&#xff0c;利用 HTTP 协议中的重定向机制&#xff0c;将用户引导至恶意网站或非法页面&am…...

探索 JMeter While Controller:循环测试的奇妙世界

嘿&#xff0c;宝子们&#xff01;今天咱们就来聊聊 JMeter 里超级厉害的 While 控制器&#xff0c;它就像是一把神奇的钥匙&#xff0c;能帮我们打开循环测试的大门&#xff0c;模拟出各种各样复杂又有趣的场景哦&#xff01; 一、While 控制器初印象 想象一下&#xff0c;你…...

Flutter踩坑记-第三方SDK不兼容Gradle 8.0,需适配namespace

最近需要集成Flutter作为Module&#xff0c;Flutter依赖了第三方库&#xff0c;Gradle是8.0版本。 编译报错&#xff1a; 解决办法是在.android根目录下的build.gradle下新增一行代码&#xff1a; buildscript {ext.kotlin_version "1.8.22"repositories {google()…...

ubuntu支持ssh

Ubuntu 默认是支持 SSH 的&#xff0c;但通常并不会在安装时启用 SSH 服务。为了能够远程连接到 Ubuntu 系统&#xff0c;需要安装并启动 SSH 服务器&#xff08;即 OpenSSH&#xff09;。以下是如何在 Ubuntu 系统中启用和配置 SSH 服务的步骤&#xff1a; 检查 SSH 是否已安…...

浏览器书签智能分类

浏览器书签智能分类工具 最近发现浏览器的书签越来越乱了&#xff0c;主要是因为自己太懒&#xff0c;其次之前建的分类太多又乱&#xff0c;重新手动整理确实比较烦。因此有了这个小项目。借助智谱AI的力量对书签进行重新分类。 项目简介 本工具用于自动整理浏览器书签&…...

通俗易懂的讲一下Vue的双向绑定和React的单向绑定

1.Vue 的双向绑定&#xff1a; <template><!-- 输入框和数据自动绑定&#xff0c;就像连体婴儿&#xff0c;一个动另一个也动 --><input v-model"message"><p>{{ message }}</p><!-- 完整表单示例 --><form><!-- 所有…...

Redis 深度解析:从入门到精通

引言 Redis 是一个开源的、高性能的键值存储系统&#xff0c;它支持多种数据结构&#xff0c;并且提供了丰富的功能和接口。作为内存数据库&#xff0c;Redis 以其快速的数据访问速度、灵活的数据模型以及持久化选项而闻名。本文将详细介绍 Redis 的核心概念、工作原理及其应用…...

基于物联网的冻保鲜运输智能控制系统

基于物联网的冻保鲜运输智能控制系统设计文档 1. 项目开发背景 随着全球化贸易的发展&#xff0c;冷链物流在现代运输行业中扮演着日益重要的角色。尤其是冻品、食品、药品等对运输环境有着严格要求的货物&#xff0c;其运输过程中温度、湿度等环境参数必须严格控制&#xff…...

【深度学习基础之多尺度特征提取】多尺度卷积神经网络(MS-CNN)是如何在深度学习网络中提取多尺度特征的?附代码(二)

【深度学习基础之多尺度特征提取】多尺度卷积神经网络&#xff08;MS-CNN&#xff09;是如何在深度学习网络中提取多尺度特征的&#xff1f;附代码&#xff08;二&#xff09; 【深度学习基础之多尺度特征提取】多尺度卷积神经网络&#xff08;MS-CNN&#xff09;是如何在深度…...

论文解读之learning to summarize with human feedback

最近在看大模型训练相关的论文&#xff0c;预计会追溯经典的和最新的训练策略以及微调原理等 本次解读经典论文learning to summarize with human feedback 一、简介 部分生成任务需要对齐人类偏好&#xff0c;但是根据最大化可能性&#xff08;对数似然&#xff09;进行微调…...

STM32学习(六 )

串口初始化IO引脚 串口的引脚在哪里 串口可以利用GPIO_InitTypeDef结构体和GPIO_Init&#xff08;&#xff09;函数进行初始化 USART_InitTypeDef USART_InitStruct;//建立串口结构体USART_InitStruct.USART_BaudRate 115200;//波特率115200USART_InitStruct.USART_Mode US…...

基于 GitHub API 的 Issue 和 PR 自动化解决方案

文章目录 摘要引言优化 Issue 和 PR 管理的方法工具选择流程优化 自动化 Issue 和 PR 管理代码逻辑详解获取 Issue 数据为 Issue 添加标签将 Issue 分配给开发者主逻辑 实际运行效果进一步扩展QA 环节总结参考资料 摘要 在开源项目中&#xff0c;Issue 和 Pull Request&#x…...

56.在 Vue 3 中使用 OpenLayers 通过 moveend 事件获取地图左上和右下的坐标信息

前言 在现代 Web 开发中&#xff0c;地图应用越来越成为重要的组成部分。OpenLayers 是一个功能强大的 JavaScript 地图库&#xff0c;它提供了丰富的地图交互和操作功能&#xff0c;而 Vue 3 是当前流行的前端框架之一。在本篇文章中&#xff0c;我们将介绍如何在 Vue 3 中集…...

文件本地和OSS上传

这里写目录标题 前端传出文件后端本地存储阿里云OSS存储上传Demo实现上传ConfigurationProperties 前端传出文件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>上传文件</title> </head&g…...

elementui table 表格 分页多选,保持选中状态

elementui多选时分页&#xff0c;解决选中状态无法保留选中项问题&#xff1a; 在el-table标签中加入row-key&#xff0c;row-key的值取当前数据里的唯一key在el-table-column selection 项中加入以下:reserve-selection“true” 完成后&#xff0c;将需要清空的地方 ( 如返回…...

MSE+Range案例

MSE的demo实现思路&#xff1a;首先准备fmp4格式的视频地址或者切片&#xff0c;接着将MSE挂载到video上&#xff0c;创建createObjectURL转二进制数据&#xff0c;fetch请求在线地址&#xff0c;分段请求&#xff0c;监听这个数据流的获取状态&#xff0c;当这个ReadyState为o…...

C# 设计模式(结构型模式):代理模式

C# 设计模式&#xff08;结构型模式&#xff09;&#xff1a;代理模式 在软件开发中&#xff0c;有时我们需要通过某种方式间接地访问一个对象&#xff0c;这时就可以使用代理模式&#xff08;Proxy Pattern&#xff09;。代理模式通过引入一个代理对象来控制对目标对象的访问…...