目錄
一.復(fù)制以及使用自定義的redis.conf文件
1.在官網(wǎng)拷貝對應(yīng)版本的配置文件內(nèi)容新建redis.conf文件進(jìn)行粘貼。(推薦)
2.也可以去官網(wǎng)下載對應(yīng)版本的redis的tar.gz包,解壓后在根目錄下找到redis.conf文件復(fù)制也可也可。
二.配置redis.conf文件(這里有個小坑)
1.注釋掉bind 127.0.0.1 -::1,不然外部無法連接到redis
2.將daemonize改為no,也就是后臺啟動關(guān)閉(小坑)
3.將protected-mode改為no,也就是關(guān)閉保護(hù)模式
4.appendonly改為yes,開啟aof持久化(可選)
5.放開requirepass的注釋,將原來的foobared改為你自己的密碼(可選)
三.docker-compose.yml文件配置
四.關(guān)于Memory overcommit的警告
一.復(fù)制以及使用自定義的redis.conf文件
使用docker或者docker-compose啟動redis時,如果想用自定義的redis.conf文件啟動redis,有兩種方式獲取默認(rèn)的redis.conf文件。
1.在官網(wǎng)拷貝對應(yīng)版本的配置文件內(nèi)容新建redis.conf文件進(jìn)行粘貼。(推薦)
官網(wǎng)配置文件地址:
Redis configuration | Redis
需要點擊你的redis對應(yīng)的版本去復(fù)制,這里我用的是redis7.2.3,所以點擊7.2的版本,點進(jìn)去復(fù)制全部即可。
?
?
2.也可以去官網(wǎng)下載對應(yīng)版本的redis的tar.gz包,解壓后在根目錄下找到redis.conf文件復(fù)制也可也可。
?官網(wǎng)所有版本redis下載地址:
Index of /releases/
推薦第一種方法,方便省事,并且第二種方法有些特殊的鏡像版本可能不知道對應(yīng)哪個版本的tar.gz包。
不管哪種方式,注意一定要對應(yīng)版本,不然啟動會報配置文件相關(guān)的錯誤。
然后將此文件放置在你想掛載的目錄下進(jìn)行掛載,可以直接將redis.conf文件存放目錄掛載(目錄掛載時容器內(nèi)的路徑最好是一個新創(chuàng)建的路徑,不然用容器內(nèi)已有目錄進(jìn)行掛載那這個目錄下其他的文件或者目錄就沒了),或者也可以直接掛載到conf文件就不會影響到其他文件或者目錄(但是配合sentinel搭建集群的時候就不能掛載到文件,會沒有權(quán)限寫入的,需要掛載到目錄),掛載好后按照下面的配置進(jìn)行修改,然后啟動時在docker run命令或者docker-compose文件中command參數(shù)部分中加上redis-server <你的容器內(nèi)conf文件存放路徑>/redis.conf。
二.配置redis.conf文件(這里有個小坑)
redis不管是常規(guī)安裝或者docker/docker-compose安裝配置除了第2點都一樣,小坑就在第2點。
1.注釋掉bind 127.0.0.1 -::1,不然外部無法連接到redis
這個選項會綁定連接redis的ip,127.0.0.1代表本地,只能本機(jī)也就是容器內(nèi)部使用redis,所以外部要連接的話需要注釋這個選項,或者有需要的也可以將ip改為需要固定連接的ip,::1代表的是允許ipv6連接。
2.將daemonize改為no,也就是后臺啟動關(guān)閉(小坑)
如果是linux常規(guī)安裝是要將這個選項改成yes的,因為要后臺啟動,但是如果是以docker容器的方式啟動,這個選項必須改為no,否則會跟docker的-d或者docker compose的后臺啟動沖突,導(dǎo)致容器啟動不起來,并且用docker logs 看不到任何日志,千萬記住redis的docker與常規(guī)安裝的這個選項是反的。
3.將protected-mode改為no,也就是關(guān)閉保護(hù)模式
保護(hù)模式開啟只會允許本地的回環(huán)連接,不允許外部訪問,關(guān)閉才能從外部連接redis。
4.appendonly改為yes,開啟aof持久化(可選)
aof持久化選項,最好開啟。
5.放開requirepass的注釋,將原來的foobared改為你自己的密碼(可選)
這一步是設(shè)置redis的密碼,注釋就是無密碼,最好設(shè)置一下。
三.docker-compose.yml文件配置
這是我自己用的redis的docker-compose.yml配置,如果發(fā)現(xiàn)有錯誤請指正。
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是為了獲取完整權(quán)限。?
掛載- /app/redis/data:/data是為了同步redis的持久化數(shù)據(jù)。
為什么數(shù)據(jù)是在/data目錄?因為redis的默認(rèn)數(shù)據(jù)保存目錄(rdb與aof數(shù)據(jù)保存都是在這個文件夾下)是在執(zhí)行redis-server命令時當(dāng)前所處的目錄下,可以在默認(rèn)的redis.conf文件中看到,dir這一項就是配置數(shù)據(jù)文件的保存位置,默認(rèn)的是./,這個.就是在執(zhí)行redis-serve命令時所處的目錄。而redis鏡像啟動的容器的工作目錄就是/data目錄,redis-server命令就是在這個目錄下運行的,所以自然而然就是/data目錄。
當(dāng)然你也可以指定目錄,修改dir后面的路徑即可,注意如果是不存在的目錄,redis不會自己創(chuàng)建目錄需要手動創(chuàng)建。如果是不存在的目錄,想在容器啟動后使用docker exec進(jìn)入容器mkdir新建目錄然后再重啟使修改的新目錄生效這種方式來修改數(shù)據(jù)保存位置的話是不行的,redis啟動不了,會報權(quán)限錯誤訪問被拒絕。解決方式是在command的redis-server命令執(zhí)行之前先執(zhí)行mkdir命令創(chuàng)建你想指定的目錄,重新創(chuàng)建一個容器即可,而且記得要帶上privileged獲取權(quán)限。不過屬實是沒有這個必要,使用默認(rèn)的即可。
掛載- /etc/localtime:/etc/localtime:ro是為了讓容器與主機(jī)之間的時間日期進(jìn)行完全同步,因為docker容器與宿主機(jī)日期時間會存在同步問題,最好保持一致,:ro是只讀權(quán)限,因為這是系統(tǒng)文件所以只給只讀權(quán)限。
restart: always是為了自行啟動。
networks是加入指定的網(wǎng)絡(luò)中。
logging是跟容器日志有關(guān)的配置,driver指定日志存儲機(jī)制,max-size為單個日志最大容量,max-file為最多的日志文件個數(shù)。
四.關(guān)于Memory overcommit的警告
本來在程序員眼里警告基本是不存在的[手動狗頭],之所以我會注意到這個警告,是因為上面的第二點我寫成了yes,一直啟動不起來,docker logs就只報了這個警告,后面查了半天解決了這個警告,發(fā)現(xiàn)還是啟動不起來,并且日志也沒有。后面百度了才發(fā)現(xiàn)是由于daemonize設(shè)置了yes的原因,突然想起好像常規(guī)安裝跟docker安裝是反的,后面改回來之后就好了,所以這里千萬要注意。暈死,浪費半天力氣。不過這個警告解決還有點曲折,所以分享一下。
啟動redis容器后時,用docker logs -f命令可以發(fā)現(xiàn)出現(xiàn)了如下的警告?
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.
?
翻譯過來就是
警告必須啟用內(nèi)存過度使用!如果沒有它,后臺保存或復(fù)制可能會在內(nèi)存不足的情況下失敗。如果被禁用,它也可能在沒有內(nèi)存不足的情況下導(dǎo)致故障,請參閱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”以使其生效。剛開始我一直以為要容器內(nèi)部修改redis容器內(nèi)的/etc/sysctl.conf文件,但是容器內(nèi)部的/etc目錄下是沒有sysctl.conf文件的,并且容器內(nèi)部也沒有sysctl命令。
后面我在gitbub上看到了有人說這個問題,原來單個容器時無法修改這個選項的,需要在宿主機(jī)上修改/etc/sysctl.conf,然后重新啟動或運行命令“sysctl vm.overommit_memory=1”以使其生效。
原帖地址如下:
Warning about memory overcommit at start up · Issue #346 · docker-library/redis · GitHub
后面在宿主機(jī)上的/etc目錄下修改了sysctl.conf文件,并且執(zhí)行了sysctl vm.overommit_memory=1命令,然后刪掉原來的容器重新啟動了一個容器,這時日志就沒有這個警告了。文章來源:http://www.zghlxwxcb.cn/news/detail-779199.html
后面還有一些其他警告,懶得去管了,既然跑起來了那就是不存在[手動狗頭],有需要的自行查詢。文章來源地址http://www.zghlxwxcb.cn/news/detail-779199.html
到了這里,關(guān)于使用docker/docker-compose通過自定義的redis.conf文件啟動redis 7.2.3,附上docker-compose.yml的redis配置的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!