【Docker-Dev】Mac M2 搭建docker的redis环境
Redis的dev环境docker搭建
- 1、前言
- 2、官方文档重点信息提取
- 2.1、创建redis实例
- 2.2、使用自己的redis.conf文件。
- 3、单机版redis搭建
- 4、redis集群版
- 4.1、一些验证
- 4.2、一些问题
- 结语
1、前言
本文主要针对M2下,相应进行开发环境搭建,然后做一个文档记录,是第二弹文章,搭建是采用docker compose文件。
希望对相关人有帮助。如果只想要Docker-Compose文件,请转到第三节的单机模式和第四节的集群模式。
针对第四节集群模式,这里有个地方需要提前说明,目前redis cluster的搭建模式,存在一个问题无法解决,即无法通过Docker暴露出的端口进行宿主机的外部访问连接,后续只能看看是否研究开启tsl或者其他方式允许访问。从内部各种方式可以验证出,集群状态是正常的,而且数据能正常访问。
原本是打算使用redis-commander进行docker集群内访问redis cluster,但是很可惜,官方似乎在docker compose组建的运行环境下是存在问题的,Issue看这。
2、官方文档重点信息提取
redis的docker镜像官网地址在此处点击。
hub地址是需要翻墙访问
2.1、创建redis实例
docker run --name some-redis -d redis
如果想持久化,则是如下命令:
docker run --name some-redis -d redis redis-server --save 60 1 --loglevel warning
redis-server --save 60 1 --loglevel warning,这是传递给 Redis 服务器的参数,它告诉 Redis 服务器在后台每隔 60 秒检查一次数据库,如果有至少一个键被修改,则将其写入磁盘。后面的 1 表示如果至少有一个键被修改,则每秒进行一次检查。–loglevel warning 设置 Redis 服务器的日志级别为 “warning”,表示只记录警告级别的日志。
2.2、使用自己的redis.conf文件。
创建自己的Dockerfile文件,将上下文中的redis.conf添加到/data/中,如下所示
FROM redis
COPY redis.conf /usr/local/etc/redis/redis.conf
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
也可以使用docker命令
docker run -v /myredis/conf:/usr/local/etc/redis --name myredis redis redis-server /usr/local/etc/redis/redis.conf
其中/myredis/conf/是包含redis.conf文件的本地目录。使用这种方法意味着你不需要为你的redis容器创建Dockerfile。
映射的目录应该是可写的,因为根据配置和操作模式,Redis可能需要创建额外的配置文件或重写现有的配置文件。
3、单机版redis搭建
先创建redis单机版的目录。
mkdir redis-single
然后在redis-single目录下,创建两个目录,一个是conf,一个是data
mkdir conf data
在conf目录下创建redis.conf文件
# redis-single.conf
# 允许来自任何IP的连接
bind 0.0.0.0
# 设置启动保护模式
# protected-mode yes
# 设置密码
requirepass test123save 900 1 # 在900秒(15分钟)内,如果至少有1个键被修改,就创建一个RDB快照
save 300 10 # 在300秒(5分钟)内,如果至少有10个键被修改,就创建一个RDB快照
save 60 10000 # 在60秒内,如果至少有10000个键被修改,就创建一个RDB快照appendonly yes # 启用了 AOF 持久化
appendfsync everysec # 将写操作追加到AOF文件并在每秒同步一次
上述配置为aof持久化的时机,解释如下:
| 关键字 | 持久化时机 | 解释 |
|---|---|---|
| appendfsync | always | 每执行一次更新命令,持久化一次 |
| appendfsync | everysec | 每秒钟持久化一次 |
| appendfsync | no | 不会主动执行持久话,依赖于操作系统的空闲调用 |
然后回退到上一级目录,即redis-single目录下,创建docker-compose.yml文件,文件内容如下所示:
version: '3.1'services:redis-single:image: redis:latestrestart: alwaysports:- "6379:6379"volumes:- /Users/tanqiwei/docker-dev/redis-single/data:/data- /Users/tanqiwei/docker-dev/redis-single/conf/redis-single.conf:/etc/redis/redis.confcommand: ["redis-server", "/etc/redis/redis.conf"]
然后输入下面命令启动:
docker compose up

然后外部用一些redis的可视化客户端连接进行连接,然后进行key的创建和更新都是正常的。

4、redis集群版
redis集群版,最开始写的很顺利,而且成功运行,但是目前为止,我依旧没找到任何可以通过外部手段连接该集群的方式,等待后续更新,集群是正常创建的。
由于使用redis cluster,创建3节点主,3节点副本,所以一共是6个节点。
首先创建redis-cluster目录
mkdir redis-cluster
同样是在这个目录下,创建conf data两个文件夹。
mkdir conf data
然后进入conf目录,创建redis-master.conf文件,内容如下:
# redis-cluster.conf
# 启用集群模式
bind 0.0.0.0
cluster-enabled yes
cluster-node-timeout 5000
requirepass test123
cluster-config-file nodes.conf
masterauth test123# 在900秒(15分钟)内,如果至少有1个键被修改,就创建一个RDB快照
save 900 1
# 在300秒(5分钟)内,如果至少有10个键被修改,就创建一个RDB快照
save 300 10
# 在60秒内,如果至少有10000个键被修改,就创建一个RDB快照
save 60 10000 # 启用了 AOF 持久化
appendonly yes
# 将写操作追加到AOF文件并在每秒同步一次
appendfsync everysec
然后使用cp命令创建另外5个文件(文件内容一模一样)。
tanqiwei@tanqiweideMacBook-Pro conf % ls
redis-master.conf redis-node2.conf redis-slave1.conf
redis-node1.conf redis-node3.conf redis-slave2.conf
然后回到上一层下的data目录,分别创建如下六个文件夹(文件夹名分别为master、node1、node2、node3、slave1、slave2):
tanqiwei@tanqiweideMacBook-Pro data % ls
master node1 node2 node3 slave1 slave2
接着回到redis cluster,创建下面的docker-compose文件。
version: '3.1'services:redis-cluster:image: 'redis:latest'entrypoint: /bin/sh -ccommand: >"echo yes | redis-cli --cluster create198.20.0.31:6379198.20.0.32:6379198.20.0.33:6379198.20.0.34:6379198.20.0.35:6379198.20.0.36:6379--cluster-replicas 1 --pass test123"networks:redis_cluster_subnet:ipv4_address: 198.20.0.30depends_on:- redis-master- redis-slave1- redis-slave2- redis-node1- redis-node2- redis-node3redis-master:image: redis:latestrestart: alwaysports:- "7001:6379"volumes:- /Users/tanqiwei/docker-dev/redis-cluster/data/master:/data- /Users/tanqiwei/docker-dev/redis-cluster/conf/redis-master.conf:/etc/redis/redis.confcommand: ["redis-server", "/etc/redis/redis.conf"]networks:redis_cluster_subnet:ipv4_address: 198.20.0.31redis-slave1:image: redis:latestrestart: alwaysports:- "7002:6379"volumes:- /Users/tanqiwei/docker-dev/redis-cluster/data/slave1:/data- /Users/tanqiwei/docker-dev/redis-cluster/conf/redis-slave1.conf:/etc/redis/redis.confcommand: ["redis-server", "/etc/redis/redis.conf"]networks:redis_cluster_subnet:ipv4_address: 198.20.0.32redis-slave2:image: redis:latestrestart: alwaysports:- "7003:6379"volumes:- /Users/tanqiwei/docker-dev/redis-cluster/data/slave2:/data- /Users/tanqiwei/docker-dev/redis-cluster/conf/redis-slave2.conf:/etc/redis/redis.confcommand: ["redis-server", "/etc/redis/redis.conf"]networks:redis_cluster_subnet:ipv4_address: 198.20.0.33redis-node1:image: redis:latestrestart: alwaysports:- "7004:6379"volumes:- /Users/tanqiwei/docker-dev/redis-cluster/data/node1:/data- /Users/tanqiwei/docker-dev/redis-cluster/conf/redis-node1.conf:/etc/redis/redis.confcommand: ["redis-server", "/etc/redis/redis.conf"]networks:redis_cluster_subnet:ipv4_address: 198.20.0.34 redis-node2:image: redis:latestrestart: alwaysports:- "7005:6379"volumes:- /Users/tanqiwei/docker-dev/redis-cluster/data/node2:/data- /Users/tanqiwei/docker-dev/redis-cluster/conf/redis-node2.conf:/etc/redis/redis.confcommand: ["redis-server", "/etc/redis/redis.conf"]networks:redis_cluster_subnet:ipv4_address: 198.20.0.35 redis-node3:image: redis:latestrestart: alwaysports:- "7006:6379"volumes:- /Users/tanqiwei/docker-dev/redis-cluster/data/node3:/data- /Users/tanqiwei/docker-dev/redis-cluster/conf/redis-node3.conf:/etc/redis/redis.confcommand: ["redis-server", "/etc/redis/redis.conf"]networks:redis_cluster_subnet:ipv4_address: 198.20.0.36 networks:redis_cluster_subnet:driver: bridgeipam:config:- subnet: 198.20.0.0/24
在这个docker compose文件里面,为了能6个节点互联,且能够固定IP,所以我采用了子网的方式。
networks:redis_cluster_subnet:driver: bridgeipam:config:- subnet: 198.20.0.0/24
然后每个redis集群,其实按照单机版的方式处理,只是加了网络的选项,而且配置文件设置了以集群方式开启。
最后定义了一个名为 redis-cluster 的服务,使用最新版本的 Redis 镜像。entrypoint 和 command 部分包含了在容器启动时执行的命令,用于初始化 Redis 集群。
然后执行docker compose up的命令就能启动成功。


4.1、一些验证
docker exec -it redis-cluster-redis-master-1 /usr/local/bin/redis-cli -c -a test123 --cluster check 198.20.0.31:6379
输出如下所示:
tanqiwei@tanqiweideMacBook-Pro data % docker exec -it redis-cluster-redis-master-1 /usr/local/bin/redis-cli -c -a test123 --cluster check 198.20.0.31:6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
198.20.0.31:6379 (b244b72f...) -> 0 keys | 5461 slots | 1 slaves.
198.20.0.33:6379 (183e2e42...) -> 0 keys | 5461 slots | 1 slaves.
198.20.0.32:6379 (cfcf1409...) -> 1 keys | 5462 slots | 1 slaves.
[OK] 1 keys in 3 masters.
0.00 keys per slot on average.>>> Performing Cluster Check (using node 198.20.0.31:6379)
M: b244b72fc5375c7e559ccb02aff9992e0d1aa0d0 198.20.0.31:6379slots:[0-5460] (5461 slots) master1 additional replica(s)
M: 183e2e42276ab7a4dfdfb426cb3e01a65a038362 198.20.0.33:6379slots:[10923-16383] (5461 slots) master1 additional replica(s)
S: 91c8156bd7afd58c252d09ea416b68abbd3ddb49 198.20.0.35:6379slots: (0 slots) slavereplicates b244b72fc5375c7e559ccb02aff9992e0d1aa0d0
S: 7cf393d7371a927104ae861cdb8dc675f2a35281 198.20.0.36:6379slots: (0 slots) slavereplicates cfcf14091a752771d47e092321e3f4ade75f6de7
S: df71e5c164e2f99e41b1a951d7bc60c6e9daa7eb 198.20.0.34:6379slots: (0 slots) slavereplicates 183e2e42276ab7a4dfdfb426cb3e01a65a038362
M: cfcf14091a752771d47e092321e3f4ade75f6de7 198.20.0.32:6379slots:[5461-10922] (5462 slots) master1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
redis-cluster-redis-master-1是启动后的redis服务名,按docker ps查询得到。
输入下面命令进入对应的docker服务:
docker exec -it redis-cluster-redis-master-1 /usr/local/bin/redis-cli -c -a test123 -h 198.20.0.31 -p 6379

然后进行一些集群信息访问:


目前可以确认服务内部的ok的,至于最开始无法命令get是因为从节点一般做备份,不允许读取,所以得开readonly命令。
4.2、一些问题
在进行docker compose down或者docker compose stop命令后,再次重启会提示。
[ERR] Node XXX is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
在google查了许久没有头绪,只能每次重启前进行数据清理。
删除每个redis下的appendonly.aof、dump.rdb、xxx.conf文件。
例如我在redis-cluster目录下时执行这个命令。
rm -rf data/*/*
第二个问题是无法进行外部连接访问,任何redis的连接器包括原生的redis-cli,在docker宿主机的情况下,无法连接内部集群,只能通过容器内部访问。
这个问题找了半天都没有头绪,后续有时间研究出来了,再更新文档
结语
目前搭建redis单机是没问题的,按自己思路搭建集群也没问题,后面发现无法通过宿主机外部连接访问,进行了各种查询,也尝试过海外其他人的方案,都无法让外部宿主机进行访问。
我认为可能有其他方式,或者配置上的问题,目前研究时间有限,等后续抽时间研究好了,再更新文档。
相关文章:
【Docker-Dev】Mac M2 搭建docker的redis环境
Redis的dev环境docker搭建 1、前言2、官方文档重点信息提取2.1、创建redis实例2.2、使用自己的redis.conf文件。 3、单机版redis搭建4、redis集群版4.1、一些验证4.2、一些问题 结语 1、前言 本文主要针对M2下,相应进行开发环境搭建,然后做一个文档记录…...
docker +gitee+ jenkins +maven项目 (一)
jenkins环境和插件配置 文章目录 jenkins环境和插件配置前言一、环境版本二、jenkins插件三、环境安装总结 前言 现在基本都是走自动化运维,想到用docker 来部署jenkins ,然后jenkins来部署java代码,做到了开箱即用,自动发布代码…...
IDEA 开发中常用的快捷键
目录 Ctrl 的快捷键 Alt 的快捷键 Shift 的快捷键 Ctrl Alt 的快捷键 Ctrl Shift 的快捷键 其他的快捷键 Ctrl 的快捷键 Ctrl F 在当前文件进行文本查找 (必备) Ctrl R 在当前文件进行文本替换 (必备) Ctrl Z 撤…...
Ubuntu Desktop 死机处理
Ubuntu Desktop 死机处理 当 Ubuntu Desktop 死机时,除了长按电源键重启,还可以使用如下两种方式处理。 方式1:ctrlaltFn 使用 ctrl alt F3~F6: 切换到其他 tty 命令行。 执行 top 命令查看资源占用最多的进程,然后使用 kill…...
Hermite矩阵
Hermite矩阵 文章目录 Hermite矩阵一、正规矩阵【定义】A^H^矩阵【定理】 A^H^的运算性质【定义】正规矩阵、特殊的正规矩阵【定理】与正规矩阵酉相似的矩阵也是正规矩阵【定理】正规的上(下)三角矩阵必为对角矩阵【定义】复向量的内积【定理】Schmitt正交化 二、酉矩阵&#x…...
HTML 实操试题(二)
创建一个简单的HTML文档: 包含<!DOCTYPE html>声明。包含<html>标签,并设置lang属性为英语。包含<head>标签,其中包含<meta charset"UTF-8">和一个自定义的页面标题。包含<body>标签,其…...
MongoDB 面试题
MongoDB 面试题 1. 什么是MongoDB? MongoDB是一种非关系型数据库,被广泛用于大型数据存储和分布式系统的构建。MongoDB支持的数据模型比传统的关系型数据库更加灵活,支持动态查询和索引,也支持BSON格式的数据存储,这…...
LeetCode 1154. 一年中的第几天:2023年最后一道每日一题
【LetMeFly】1154.一年中的第几天:2023年最后一道每日一题 力扣题目链接:https://leetcode.cn/problems/day-of-the-year/ 给你一个字符串 date ,按 YYYY-MM-DD 格式表示一个 现行公元纪年法 日期。返回该日期是当年的第几天。 示例 1&…...
《深入理解JAVA虚拟机笔记》OutOfMemoryError 异常
在《Java 虚拟机规范》的规定里,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生 OutOfMemoryError (下文称 OOM)异常的可能。 Java堆溢出 Java 堆用于储存对象实例,我们只要不断地创建对象,并…...
R306指纹识别模块指令系统
一:指令集 1. GR_GetImage 指令代码:01H 功能:从传感器上读入图像存于图像缓冲区 2. GR_GenChar 指令代码:02H 功能:根据原始图像生成指纹特征存于 CharBuffer1 或 CharBuffer2 3. GR_Match 指令代码ÿ…...
redis的搭建及应用(三)-Redis主从配置
Redis主从配置 为提升Redis的高可用性,需要搭建多个Redis集群以保证高可用性。常见搭建方式有:主从,哨兵集群等,本节我们搭建一主二从的多Redis架构。 redis主从安装1主2从的方式配置,以端口号为redis的主从文件夹。 主…...
Java学习,一文掌握Java之SpringBoot框架学习文集(1)
🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…...
javaWeb学生信息管理系统2
一、学生信息管理系统SIMS 一款基于纯Servlet技术开发的学生信息管理系统(SIMS),在设计中没有采用SpringMVC和Spring Boot等框架。系统完全依赖于Servlet来处理HTTP请求和管理学生信息,实现了信息的有效存储、检索和更新…...
Linux Shell 019-文本行处理工具sed
Linux Shell 019-文本行处理工具sed 本节关键字:Linux、Bash Shell、文本行处理工具 相关指令:sed、 sed介绍 sed是Stream Editor(流编辑器)的缩写,简称流编辑器;用来处理文件的。sed是一行一行读取文件…...
Ubuntu中fdisk磁盘分区并挂载、扩容逻辑卷
Ubuntu中fdisk磁盘分区并挂载、扩容逻辑卷 一:fdisk磁盘分区并挂载1.查看磁盘分区信息2.分区3.强制系统重新读取分区(避免重启系统)4.格式化分区5.创建挂载目录6.设置开机自动挂载:7.验证并自动挂载(执行了该命令不需要重启系统)8.查看挂载007.异常情况处…...
【leetcode】栈与队列总结
本文内容来自于代码随想录 栈 用栈实现队列 两个栈实现队列。思路:两个栈分别表示入栈和出栈。 入队:直接入栈出队: a. 出栈为空,先把入栈中的元素全部放到出栈中(相当于反过来,这样在出栈的时候先进的元…...
[EFI]HP Spectre 13 v102nl电脑 Hackintosh 黑苹果efi引导文件
硬件型号驱动情况主板 HP Spectre 13 v102nl 处理器Intel Core i7-7500U (7th gen - Kaby Lake)已驱动内存8 GB LPDDR3-1866 SDRAM已驱动硬盘512 GB Toshiba NVMe™ M.2 SSD已驱动显卡Intel HD Graphics 620已驱动声卡Conexant CX8200 (0x2008)已驱动网卡I1211 Gigabit Etherne…...
【Pytorch】学习记录分享8——PyTorch自然语言处理基础-词向量模型Word2Vec
【Pytorch】学习记录分享7——PyTorch自然语言处理基础-词向量模型Word2Vec 1. 词向量模型Word2Vec)1. 如何度量这个单词的?2.词向量是什么样子?3.词向量对应的热力图:4.词向量模型的输入与输出,其实…...
用Xshell连接虚拟机的Ubuntu20.04系统记录。虚拟机Ubuntu无法上网。本机能ping通虚拟机,反之不能。互ping不通
先别急着操作,看完再试。 如果是:本机能ping通虚拟机,反之不能。慢慢看到第8条。 如果是:虚拟机不能上网(互ping不通),往下一直看。 系统是刚装的,安装步骤:VMware虚拟机…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
