使用docker/docker-compose通过自定义的redis.conf文件启动redis 7.2.3,附上docker-compose.yml的redis配置

news2024/10/7 14:23:34

目录

一.复制以及使用自定义的redis.conf文件

1.在官网拷贝对应版本的配置文件内容新建redis.conf文件进行粘贴。(推荐)

2.也可以去官网下载对应版本的redis的tar.gz包,解压后在根目录下找到redis.conf文件复制也可也可。

二.配置redis.conf文件(这里有个小坑)

1.注释掉bind 127.0.0.1 -::1,不然外部无法连接到redis

2.将daemonize改为no,也就是后台启动关闭(小坑)

3.将protected-mode改为no,也就是关闭保护模式

4.appendonly改为yes,开启aof持久化(可选)

5.放开requirepass的注释,将原来的foobared改为你自己的密码(可选)

三.docker-compose.yml文件配置

四.关于Memory overcommit的警告


一.复制以及使用自定义的redis.conf文件

使用docker或者docker-compose启动redis时,如果想用自定义的redis.conf文件启动redis,有两种方式获取默认的redis.conf文件。

1.在官网拷贝对应版本的配置文件内容新建redis.conf文件进行粘贴。(推荐)

官网配置文件地址:

Redis configuration | Redis

需要点击你的redis对应的版本去复制,这里我用的是redis7.2.3,所以点击7.2的版本,点进去复制全部即可。

2.也可以去官网下载对应版本的redis的tar.gz包,解压后在根目录下找到redis.conf文件复制也可也可。

 官网所有版本redis下载地址:

Index of /releases/

推荐第一种方法,方便省事,并且第二种方法有些特殊的镜像版本可能不知道对应哪个版本的tar.gz包。

不管哪种方式,注意一定要对应版本,不然启动会报配置文件相关的错误。

然后将此文件放置在你想挂载的目录下进行挂载,可以直接将redis.conf文件存放目录挂载(目录挂载时容器内的路径最好是一个新创建的路径,不然用容器内已有目录进行挂载那这个目录下其他的文件或者目录就没了),或者也可以直接挂载到conf文件就不会影响到其他文件或者目录(但是配合sentinel搭建集群的时候就不能挂载到文件,会没有权限写入的,需要挂载到目录),挂载好后按照下面的配置进行修改,然后启动时在docker run命令或者docker-compose文件中command参数部分中加上redis-server <你的容器内conf文件存放路径>/redis.conf。

二.配置redis.conf文件(这里有个小坑)

redis不管是常规安装或者docker/docker-compose安装配置除了第2点都一样,小坑就在第2点。

1.注释掉bind 127.0.0.1 -::1,不然外部无法连接到redis

这个选项会绑定连接redis的ip,127.0.0.1代表本地,只能本机也就是容器内部使用redis,所以外部要连接的话需要注释这个选项,或者有需要的也可以将ip改为需要固定连接的ip,::1代表的是允许ipv6连接。

2.将daemonize改为no,也就是后台启动关闭(小坑)

如果是linux常规安装是要将这个选项改成yes的,因为要后台启动,但是如果是以docker容器的方式启动,这个选项必须改为no,否则会跟docker的-d或者docker compose的后台启动冲突,导致容器启动不起来,并且用docker logs 看不到任何日志,千万记住redis的docker与常规安装的这个选项是反的。

3.将protected-mode改为no,也就是关闭保护模式

保护模式开启只会允许本地的回环连接,不允许外部访问,关闭才能从外部连接redis。

4.appendonly改为yes,开启aof持久化(可选)

aof持久化选项,最好开启。

5.放开requirepass的注释,将原来的foobared改为你自己的密码(可选)

这一步是设置redis的密码,注释就是无密码,最好设置一下。

三.docker-compose.yml文件配置

这是我自己用的redis的docker-compose.yml配置,如果发现有错误请指正。

  redis:
    container_name: redis
    image: redis:7.2.3
    privileged: true
    command: redis-server /etc/redis/redis.conf
    volumes:
      - /app/redis/redis.conf:/etc/redis/redis.conf
      - /app/redis/data:/data
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "6379:6379"
    restart: always
    networks:
      - learn_default
    logging:
      driver: "json-file"
      options:
        max-size: "20m"
        max-file: "3"    

privileged: true是为了获取完整权限。 

挂载- /app/redis/data:/data是为了同步redis的持久化数据。

为什么数据是在/data目录?因为redis的默认数据保存目录(rdb与aof数据保存都是在这个文件夹下)是在执行redis-server命令时当前所处的目录下,可以在默认的redis.conf文件中看到,dir这一项就是配置数据文件的保存位置,默认的是./,这个.就是在执行redis-serve命令时所处的目录。而redis镜像启动的容器的工作目录就是/data目录,redis-server命令就是在这个目录下运行的,所以自然而然就是/data目录。

当然你也可以指定目录,修改dir后面的路径即可,注意如果是不存在的目录,redis不会自己创建目录需要手动创建。如果是不存在的目录,想在容器启动后使用docker exec进入容器mkdir新建目录然后再重启使修改的新目录生效这种方式来修改数据保存位置的话是不行的,redis启动不了,会报权限错误访问被拒绝。解决方式是在command的redis-server命令执行之前先执行mkdir命令创建你想指定的目录,重新创建一个容器即可,而且记得要带上privileged获取权限。不过属实是没有这个必要,使用默认的即可。

挂载- /etc/localtime:/etc/localtime:ro是为了让容器与主机之间的时间日期进行完全同步,因为docker容器与宿主机日期时间会存在同步问题,最好保持一致,:ro是只读权限,因为这是系统文件所以只给只读权限。

restart: always是为了自行启动。

networks是加入指定的网络中。

logging是跟容器日志有关的配置,driver指定日志存储机制,max-size为单个日志最大容量,max-file为最多的日志文件个数。

四.关于Memory overcommit的警告

本来在程序员眼里警告基本是不存在的[手动狗头],之所以我会注意到这个警告,是因为上面的第二点我写成了yes,一直启动不起来,docker logs就只报了这个警告,后面查了半天解决了这个警告,发现还是启动不起来,并且日志也没有。后面百度了才发现是由于daemonize设置了yes的原因,突然想起好像常规安装跟docker安装是反的,后面改回来之后就好了,所以这里千万要注意。晕死,浪费半天力气。不过这个警告解决还有点曲折,所以分享一下。

启动redis容器后时,用docker logs -f命令可以发现出现了如下的警告 

WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
 

翻译过来就是

警告必须启用内存过度使用!如果没有它,后台保存或复制可能会在内存不足的情况下失败。如果被禁用,它也可能在没有内存不足的情况下导致故障,请参阅https://github.com/jemalloc/jemalloc/issues/1328.若要解决此问题,请将“vm.overcommit_memory=1”添加到/etc/sysctl.conf,然后重新启动或运行命令“sysctl vm.overommit_memory=1”以使其生效。

redis给出了解决方案,就是在/etc目录下的sysctl.conf文件中添加vm.overcommit_memory=1,并且重新启动或运行命令“sysctl vm.overommit_memory=1”以使其生效。刚开始我一直以为要容器内部修改redis容器内的/etc/sysctl.conf文件,但是容器内部的/etc目录下是没有sysctl.conf文件的,并且容器内部也没有sysctl命令。

后面我在gitbub上看到了有人说这个问题,原来单个容器时无法修改这个选项的,需要在宿主机上修改/etc/sysctl.conf,然后重新启动或运行命令“sysctl vm.overommit_memory=1”以使其生效。

原帖地址如下:

Warning about memory overcommit at start up · Issue #346 · docker-library/redis · GitHub

后面在宿主机上的/etc目录下修改了sysctl.conf文件,并且执行了sysctl vm.overommit_memory=1命令,然后删掉原来的容器重新启动了一个容器,这时日志就没有这个警告了。

后面还有一些其他警告,懒得去管了,既然跑起来了那就是不存在[手动狗头],有需要的自行查询。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1433400.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习复习(8)——基本概念

目录 "benchmark"和"baseline"的定义和区别 R1 score概念 LoRA微调概念 "benchmark"和"baseline"的定义和区别 在计算机视觉领域的论文中&#xff0c;"benchmark"和"baseline"这两个术语经常被使用&#xff0…

BootStrap学习笔记JS插件(一)--模态弹出框

一、弹出框基础 <div class"modal show"><div class"modal-dialog"><div class"modal-content"><div class"modal-header"><button type"button" class"close" data-dismiss"mo…

惠普公司也要注销了?

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 惠普科技(上海)有限公司企业状态由存续变更为注销&#xff0c;这意味着惠普公司也要注销了?这是怎么回事?戴尔公司也准备注销了呢?这家美国科技巨头为什么放弃了世界最大的消费市场呢? 之前就有消息称惠普中国…

BFS——双向广搜+A—star

有时候从一个点能扩展出来的情况很多&#xff0c;这样几层之后搜索空间就很大了&#xff0c;我们采用从两端同时进行搜索的策略&#xff0c;压缩搜索空间。 190. 字串变换(190. 字串变换 - AcWing题库) 思路&#xff1a;这题因为变化规则很多&#xff0c;所以我们一层一层往外…

新开发板-正点原子的rk3568

有好长一段时间没有更新博客了&#xff0c;上次更新还是在上次...哈哈开个玩笑&#xff0c;上次stm32f407的定时器还没写完&#xff0c;就备战期末去了&#xff08;电信学院&#xff0c;你懂的&#xff09;&#xff0c;一直没更新&#xff0c;原因是我实习去了&#xff0c;在忙…

Java项目管理01-Maven基础

一、Maven的常用命令和生命周期 1.Maven的常用命令使用方式 complie&#xff1a;编译&#xff0c;将java文件编译为class字节码文件 clean&#xff1a;清理&#xff0c;删除字节码文件 test&#xff1a;测试&#xff0c;运行项目中的test类 package&#xff1a;打包&#x…

IDEA新建文件夹后右击不能创建class类排错方法

目录 1 查看自身文件名是否为关键词 2 查看是否被“蓝色文件夹”给包含了 3 检查设置那边的class模板 4 报错解决 1 查看自身文件名是否为关键词 如下使用了 Java中的关键词"class"所以才无法创建包 ---------------------------------------------------------…

51单片机之LED灯模块篇

御风以翔 破浪以飏 &#x1f3a5;个人主页 &#x1f525;个人专栏 目录 点亮一盏LED灯 LED的组成原理 LED的硬件模型 点亮一盏LED灯的程序设计 LED灯闪烁 LED流水灯 独立按键控制LED灯亮灭 独立按键的组成原理 独立按键的硬件模型 独立按键控制LED灯状态 按键的抖动 独立按键…

KubeMQ简介

如今&#xff0c;企业组织之间的竞争是残酷的。每个组织都希望在其系统之间即时、实时或近乎实时地交换信息&#xff0c;以便做出更好、更快的决策。为了使此类信息持续流动&#xff0c;应用程序组件之间的集成需要无缝。为了充分利用云计算的所有优势&#xff0c;如今构建的应…

双非本科准备秋招(16.1)—— 力扣二叉树

1、101. 对称二叉树 检查是否对称&#xff0c;其实就是检查左节点等不等于右节点&#xff0c;我们可以用递归来做。 如果左右节点都为null&#xff0c;说明肯定对称呀&#xff0c;返回true。 如果一个为null一个不为null&#xff0c;或者左右的值不相等&#xff0c;则为false。…

k8s-深入理解Service(为Pod提供负载均衡和发现)

一、Service存在的意义 二、Service的定义和创建 Pod与Service的关系 Service的定义和创建 三、Service使用NodePort对外暴露应用 四种类型&#xff0c;常用的三种&#xff1a; 指定Service的NodePort端口 在实际生产中&#xff0c;k8s的集群不会直接暴露在公网中&#xff0c…

free5GC+UERANSIM

使用arp、ifconfig、docker inspect及网桥brctl 相关命令&#xff0c;收集容器IP及Mac地址相关信息&#xff0c;可以梳理出UERANSIMfree5GC模拟环境组网&#xff0c;如下图所示&#xff1a; 如上图所示&#xff1a;环境基于ubuntu 18.04 VMware虚机部署&#xff0c;5GC网元分别…

【Redis】字符串原理--简单动态字符串SDS

一.SDS定义 free 属性值为0&#xff0c;标识SDS没有分配任何未使用空间。len 属性值为5&#xff0c;标识SDS保存了一个5字节长度的字符串。buf 属性是一个char类型数组&#xff0c;数组的前5个字节保存了&#xff0c;R e d i s 五个字符&#xff0c;最后一个保存空字符串 \0…

uniapp android和微信小程序实现PDF在线预览

在使用uniapp开发移动端时&#xff0c;微信开发者工具里webview能正常打开后端接口返回的pdf文件流。正式发布后&#xff0c;在配置了业务域名和服务器域名的前提下&#xff0c;预览pdf文件却只能看到白屏&#xff0c;因此我猜测微信小程序不能通过webview读取文件流。这个想法…

Leetcode—32. 最长有效括号【困难】(动态规划及ranges::max()使用)

2024每日刷题&#xff08;110&#xff09; Leetcode—32. 最长有效括号 栈实现代码 class Solution { public:int longestValidParentheses(string s) {stack<int> st;st.push(-1);int n s.size();int maxn 0;for(int i 0; i < n; i) {if(s[i] () {st.push(i);}…

vulnhub靶场之Thales

一.环境搭建 1.靶场描述 Description : Open your eyes and change your perspective includes 2 flags:user.txt and root.txt. Telegram: machineboy141 (for any hint) This works better with VIrtualBox rathe than VMware 2.靶场地址 https://www.vulnhub.com/entry/t…

platform tree架构下i2c应用实例(HS3003)

目录 概述 1 探究platform tree下的i2c 1.1 platform tree下的i2c驱动 1.2 查看i2c总线下的设备 1.3 使用命令读写设备寄存器 2 认识HS3003 2.1 HS3003特性 2.2 HS3003寄存器 2.2.1 温湿度数据寄存器 2.2.2 参数寄存器 2.2.3 一个参数配置Demo 2.3 温湿度值转换 2.…

ubuntu22.04 经常死机,鼠标,键盘无响应

一、现象说明 1. 开机一小时后&#xff0c;突然之间网络掉线&#xff0c;鼠标、键盘无反应。 2.强制重启后&#xff0c;恢复正常。 3.多次重复出现该问题。 二、环境说明&#xff1a;内核、显卡 三、异常日志&#xff1a; /var/log/syslog: 四、问题解答&#xff1a; 1.…

Linux 路由配置与使用

概念 路由信息用于指导数据包从源地址查找到目的地址传输路径的信息&#xff1b; 路由分类 根据路由信息的来源分为静态路由和动态路由 静态路由 由管理员手动配置的路由表项信息&#xff0c;根据路由形式的不同&#xff0c;静态路由又可细分为&#xff1a; 直连路由&#xf…

asp.net core 依赖注入 实例化对象实例

在面向对象编程中&#xff0c;推荐使用面向接口编程&#xff0c;这样我们的代码就依赖于服务接口&#xff0c;而不是依赖于实现类&#xff0c;可以实现代码解耦。 名称解释&#xff1a; 我们把负责提供对象的注册和 获取功能的框架叫作“容器”&#xff0c; 注册到容器中的对象…