前言

在之前的文章RocketMQ容器化最佳实践我们完成的RocketMQ的容器化部署,为了方便管理docker容器,本片文章笔者就来推荐一个笔者最常用的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,j即可进入Portainer初始化界面,它会要求我们配置用户名密码:

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

此时我们就会看到localdocker的基本信息了

在步入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的日常操作步骤。

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

  1. 当主节点更新数据之后,从节点数据也会进行同步。
  2. 当我们将主节点手动停止之后,哨兵就会选举出新的master继续进行工作。

安装步骤

主从复制部署

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

  1. 安全起见,建议读者尽可能不要使用6379作为对外暴露的端口号,就算使用6379也尽可能设置一个安全的密码,避免被人下挖矿程序。
  2. 当读者复制下面的文件在服务器启动时可能会报各种语法错误,所以笔者推荐的yaml格式化在地址,读者完成配置后可以将配置粘贴到这个网站完成自动格式化。,这样可以避免启动时报一些没必要的错误YAML格式化/美化
version: '3'
services:# 主节点master:image: redis# 主节点名称container_name: redis-master# 设置redis登录密码、从节点连接主节点的密码command: redis-server --requirepass xxxx--masterauth xxxxports:# 对外暴露端口号为16380- 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-sentinelbridge网络将主从和哨兵节点关联起来,并且和docker中的其他容器隔离开:

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

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

然后直接点击create the network

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

重点来了,我们的redis主从节点现在都处于默认的网络驱动中,我们必须手动将其配置到redis-sentinel网络中,当然有了portainer,这种操作也不会很难。
我们只需要点击容器列表,找到我们的主动节点容器,然后分别进入他们的管理列表最下方,找到network选项,在network列表中找到redis-sentinel选择join network即可。

创建哨兵

接下来就可以配置哨兵节点了,首先自然是创建一个名为redis-sentinel.ymldocker-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个哨兵的配置文件。

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

port 26379
dir /tmp
# master节点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容器管理界面,到达最下方,就可以在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部署完成了。

(测试)Spring Boot集成Redis Sentinel

为了保证docker环境下部署的完整性,接下来我们就希望本地的web应用可以通过Redis Sentinel架构操作redis

Sentinel架构下我们操作redis集群可直接通过sentinel节点操作master,通过访问sentinel获取可用的master地址,然后就可以把操作提交到master中。

修改哨兵配置文件

由于操作master节点需要经历: 向sentinel询问master地址->根据sentinel返回信息操作master,这就意味的哨兵返回的master地址信息必须是可访问的。而我们上文中的sentinel.conf配置的都是docker容器的内网地址,我们的web服务是外网访问,是无法和内网容器连接的。

所以我们必须修改上文关于哨兵的配置文件sentinel1.confsentinel2.confsentinel3.conf

sentinel1.conf为例,将redis-masterip地址改为外网ip,确保返回的master地址信息,对我们本地服务是可以访问的。

port 26379
dir /tmp
# master节点ip
sentinel monitor redis-master 外网ip 16379 2
# master节点密码
sentinel auth-pass redis-master 密码
sentinel down-after-milliseconds redis-master 30000
sentinel parallel-syncs redis-master 1
sentinel failover-timeout redis-master 180000
sentinel deny-scripts-reconfig yes

完成后到portainer中重启哨兵

Spring Boot应用集成依赖

我们引入Spring Boot关于Redis的脚手架以及lettuce连接池
这里扩展一下我们为什么添加lettuce连接池的依赖,LettuceJedis 的都是连接Redis Server的客户端程序。但是Jedis在实现上是直连redis server,多线程环境下非线程安全,除非使用连接池,为每个Jedis实例增加物理连接。而Lettuce基于Netty的连接实例,可以在多个线程间并发访问,且线程安全,满足多线程环境下的并发访问,同时它是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。

   <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- lettuce pool 缓存连接池 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>2.5.0</version></dependency>

注册中心配置redis参数

引入redis-starter配置之后,我们就可以配置Redis了。大部分读者配置这些参数可能都是直接cv网上配置进行修改,其实在spring boot项目中,由于starter的自动装配机制,我们完全可以通过源码得出需要配置的内容。

从上文依赖中已经表明笔者需要用到lettuce 操作Redis客户端,所以我们可以到spring boot自动配置包中找到关于lettuce pool的配置类LettuceConnectionConfiguration

LettuceConnectionConfiguration找到关于客户端连接配置的Bean方法,可以看到其配置获取顺序是:sentinel(哨兵)->cluster(集群)->Standalone(单机)

@Bean@ConditionalOnMissingBean(RedisConnectionFactory.class)public LettuceConnectionFactory redisConnectionFactory(ClientResources clientResources)throws UnknownHostException {....略//创建连接工厂return createLettuceConnectionFactory(clientConfig);}private LettuceConnectionFactory createLettuceConnectionFactory(LettuceClientConfiguration clientConfiguration) {//有sentinel则创建sentinel配置工厂if (getSentinelConfig() != null) {return new LettuceConnectionFactory(getSentinelConfig(), clientConfiguration);}//有cluster配置则取cluster创建cluster连接工厂if (getClusterConfiguration() != null) {return new LettuceConnectionFactory(getClusterConfiguration(), clientConfiguration);}//默认配置return new LettuceConnectionFactory(getStandaloneConfig(), clientConfiguration);}

我们不如getSentinelConfig()方法细节中即可定位到sentinel配置的对象RedisSentinelConfiguration,然后就可以根据每个成员变量的调用定位到该配置文件文件的配置格式:

master为例,通过对RedisSentinelConfiguration全局搜索master的引用处定位到了下面这段代码,由此可知redis配置中的master与配置文件中的spring.redis.sentinel.master相关联。

private static Map<String, Object> asMap(String master, Set<String> sentinelHostAndPorts) {........略Map<String, Object> map = new HashMap<>();//spring.redis.sentinel.master 决定master的值map.put(REDIS_SENTINEL_MASTER_CONFIG_PROPERTY, master);........略return map;}

经过分析总结得出下面这段配置,笔者这里为了测试方便就配置了一个哨兵,需要注意的是如果哨兵和主从节点有密码则配置中必须添加关于password的配置。

spring:redis:# master有密码则需要配置master认证面膜password: xxxxxsentinel:master: redis-master# 多个节点用,分开,例如节点1ip:26379,节点2ip:26379nodes: 节点ip:26379password: xxxx# lettuce连接池配置信息lettuce:pool:max-idle: 10max-active: 20min-idle: 5max-wait: 10000ms

编码测试

我们在Controller中注入RedisTemplate

 @Autowiredprivate RedisTemplate redisTemplate;

然后编写写入和读取的类,接下来就可以将服务启动测试了,这里笔者为了测试为了能够快速测试可用性,编写了一个简单的RedisStrDto 对象用于存储string类型。

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class RedisStrDto {String key;String value;
}

然后在controller中编写存取两个接口。

  @PostMapping("setKey")public ResultData<String> setKey(@RequestBody RedisStrDto redisStrDto) {redisTemplate.opsForValue().set(redisStrDto.getKey(),redisStrDto.getValue());return ResultData.success("success");}@GetMapping("getKey/{key}")public ResultData<Object> getKey(@PathVariable(value = "key") String key) {return ResultData.success(redisTemplate.opsForValue().get(key));}

然后我们就可以基于自己的测试工具进行请求测试了,首先先通过setKey插入数据到redis中。

为了查看数据是否成功插入,这里笔者直接通过接口查询,可以看到上一个接口插入的数据确实返回了,由此可知服务集成redis成功。

参考文献

使用Portainer部署Docker容器实践

Docker—Docker-compose部署安装Portainer

Day16(yapi搭建、docker图形化工具portainer、安装redis、redis客户端远程连接、与springboot整合、vue入门、vsCode入门介绍、nodejs介绍)

portainer下配置Redis sentinel

springboot+redis的sentinel实现哨兵模式(超详细)

Spring Boot 如何快速集成 Redis 哨兵?

Docker图形化界面工具Portainer最佳实践相关推荐

  1. MySQL学习笔记03【数据库表的CRUD操作、数据库表中记录的基本操作、客户端图形化界面工具SQLyog】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  2. 图形化界面工具 SQLyog

    图形化界面工具 SQLyog 新建连接 输入相关信息 连接成功 代码区 演练 编写sql语句并运行 刷新一下,建表的结果

  3. MySQL的几个图形化界面工具

    汇总了几个mysql图形化界面工具,下面是我所用过mysql工具 1.官方的MySQL Workbench,开源版本完全免费的 MySQL Workbench是一款专为MySQL设计的ER/数据库建模 ...

  4. 群晖(docker图形化界面)使用 SpeedTest 测速

    群晖(docker图形化界面)使用 SpeedTest 测速 博主博客 https://blog.uso6.com https://blog.csdn.net/dxk539687357 本文主要介绍在 ...

  5. MySQL基础(mysql下载,图形化界面工具,DDL)

    目录 1.Mysql下载安装启动 1.下载 2.安装 3.配置 4. 启动mysql 5.客户端连接 2.图形化界面工具 1.安装 2. 使用 3.SQL 1.SQL分类 1.DDL 1.数据库操作 ...

  6. Docker图形化管理工具之Portainer

    What is Portainer? Portainer是一款轻量级的图形化管理工具,通过它我们可以轻松管理不同的docker环境.Portainer部署和使用都非常的简单,它由一个可以运行在任何do ...

  7. Docker 图形化界面管理

    一.介绍 Docker 图形化管理提供了很多工具,有Portainer.Docker UI.Shipyard等等,本文主要介绍Portainer. Portainer是一个开源.轻量级Docker管理 ...

  8. docker(17):5 个好用的 Docker 图形化管理工具

    你平时是怎么管理 Docker 容器的?还在使用一大堆的窗口和命令吗? Docker 有不少好用的图形化管理客户端,可以简化我们的工作,提供效率. 下面介绍5个比较流行的 Docker 客户端工具. ...

  9. oracle10g可视化界面,GUI图形化界面工具

    KS3 Explorer使用说明 一.运行要求 本程序基于JDK 1.7 进行开发,需要安装JRE 1.6/1.7/1.8 才可以运行,如果你的电脑上没有java的运行环境,可以到oracle的官网进 ...

最新文章

  1. blast程序 介绍 简介
  2. 前端基础--javascript 基础
  3. 线上学python哪家好-0基础学python,打算找培训机构,是线上好还是线下好?
  4. .net core编写转发服务(三) 接入Polly
  5. 域名恶意指向的问题解决
  6. 笔记本电脑没有鼠标怎么右键_联想笔记本电脑没有声音怎么修复
  7. iptables配置详解
  8. 关于cp命令中拷贝所有的写法
  9. 第 8 章 TokyoCabinet/Tyrant
  10. 8848Android 版本,【8848钛金手机M5评测】拍照配置保持Android阵容顶配堆积_8848 钛金手机M5_手机评测-中关村在线...
  11. wifi协议-802
  12. 网页服务器阿帕奇怎么启动服务,阿帕奇服务器使用教程
  13. Failed to install ISKernel Files,make sure you have appropriate privileges on this machine
  14. 2021年9月国产数据库大事记-墨天轮
  15. 形容词,名词记忆(四):al后缀常用词
  16. Nginx正则表达式locationrewrite
  17. Proe5 修改默认模板单位为公制
  18. 强化学习:不用给AI一个支点,他也能想办法撬起地球
  19. Win10 如何将FAT32格式磁盘不用格式化无损转化为NFTS格式
  20. CDA Level2建模备考心得

热门文章

  1. 博客被阮一峰引流后,我对“大数据”的分析与思考
  2. PCB板表面处理工艺的优缺点分析
  3. php里的绝对值如何表示,python中绝对值怎么表示
  4. SQLServer优化-实践经验
  5. Solidworks GB型材库配置方法以及配置文件
  6. 记Oracle DG Gap解决方案
  7. 安装Python的新姿势——神器Anaconda的安装教程
  8. Apache下开启SSI配置使shtml支持include包含
  9. 胡渊鸣大神:import一个“太极”库,让Python代码提速100倍!
  10. iOS 【快速集成QQ表情键盘】