在我的docker安裝redis里,已經(jīng)說明過docker安裝redis的流程言津,對于redis的安裝下面文章很多部份會簡寫,看不懂的朋友請看我的docker安裝redis說明
1:下載docker redis
docker pull redis:4.0? ?(注意谨垃,要下載4.0及以上版本拯腮,小于4.0版本的redis集群這種方式不可用)
2:下載ruby? (redis的集群管理使用它)
docker pull ruby
3:創(chuàng)建虛擬網(wǎng)卡
docker network create redis-net
查看網(wǎng)卡信息
docker network ls
查看redis-net虛擬網(wǎng)卡網(wǎng)關(guān)ip
docker network inspect redis-net | grep "Gateway" | grep --color=auto -P '(\d{1,3}.){3}\d{1,3}' -o
網(wǎng)卡的網(wǎng)關(guān)是:172.18.0.1
3:創(chuàng)建配置文件
mkdir -p /docker/redis/{7000,7001,7002,7003,7004,7005}
redis.conf配置文件內(nèi)容:
port 7000? ?????##節(jié)點端口
cluster-enabled yes? ? ? ? ? ?##cluster集群模式
cluster-config-file nodes.conf? ? ? ##集群配置名
cluster-node-timeout 5000? ? ? ? ? ##超時時間?
cluster-announce-ip 172.18.0.1? ? ? ##實際為各節(jié)點網(wǎng)卡分配ip? 先用上網(wǎng)關(guān)ip代替
cluster-announce-port 7000? ? ? ?##節(jié)點映射端口
cluster-announce-bus-port 17000? ##節(jié)點總線端
appendonly yes? ? ? ? ? ? ? ? ? ? ? ##持久化模式
protected-mode no
在每個文件夾下都建立data和redis.conf配置文件起名為redis7000.conf、redis7001.conf潮售、redis7002.conf痊项、redis7003.conf、redis7004.conf酥诽、redis7005.conf
4:啟動redis
docker run -p 7000:7000 -p 17000:17000 --restart always --name redis-7000 --net redis-net --privileged=true -v /docker/redis/7000/redis7000.conf:/etc/redis/redis.conf -v /docker/redis/7000/data:/data -d redis:4.0 redis-server /etc/redis/redis.conf
docker run -p 7001:7001 -p 17001:17001 --restart always --name redis-7001 --net redis-net --privileged=true -v /docker/redis/7001/redis7001.conf:/etc/redis/redis.conf -v /docker/redis/7001/data:/data -d redis:4.0 redis-server /etc/redis/redis.conf
docker run -p 7002:7002 -p 17002:17002 --restart always --name redis-7002 --net redis-net --privileged=true -v /docker/redis/7002/redis7002.conf:/etc/redis/redis.conf -v /docker/redis/7002/data:/data -d redis:4.0 redis-server /etc/redis/redis.conf
docker run -p 7003:7003 -p 17003:17003 --restart always --name redis-7003 --net redis-net --privileged=true -v /docker/redis/7003/redis7003.conf:/etc/redis/redis.conf -v /docker/redis/7003/data:/data -d redis:4.0 redis-server /etc/redis/redis.conf
docker run -p 7004:7004 -p 17004:17004 --restart always --name redis-7004 --net redis-net --privileged=true -v /docker/redis/7004/redis7004.conf:/etc/redis/redis.conf -v /docker/redis/7004/data:/data -d redis:4.0 redis-server /etc/redis/redis.conf
docker run -p 7005:7005 -p 17005:17005 --restart always --name redis-7005 --net redis-net --privileged=true -v /docker/redis/7005/redis7005.conf:/etc/redis/redis.conf -v /docker/redis/7005/data:/data -d redis:4.0 redis-server /etc/redis/redis.conf
5:查看容器分配ip
docker network inspect redis-net
如果redis.conf配置里的地址和network里顯示的地址不對應(yīng)鞍泉,我們需要手動修改下地址,讓redis的地址和network對應(yīng)肮帐。我的redis.conf文件和network顯示的地址都是一一對應(yīng)的
6:創(chuàng)建一個ruby鏡像
寫Dockerfile文件
FROM ruby:latest? ? #上面我下來的ruby
MAINTAINER sunlin<sunlin1111@163.com>
RUN gem install redis
RUN mkdir /redis
WORKDIR /redis
ADD ./redis-trib.rb /redis/redis-trib.rb?
RUN gem install redis? 這個是可以指定版本的 可以gem install redis -v 4.0.0 這樣寫咖驮。? 我沒指定,用的系統(tǒng)最新的
ADD ./redis-trib.rb /redis/redis-trib.rb 其中redis-trib.rb我是在https://github.com/antirez/redis/releases/tag/4.0.0下載的4.0.0版本
7:運行生成ruby自定義鏡像
docker build -t redis-trib .
8:運行ruby
echo yes | docker run -i --rm --net redis-net redis-trib ruby redis-trib.rb create --replicas 1 172.18.0.2:7000 172.18.0.3:7001 172.18.0.4:7002 172.18.0.5:7003 172.18.0.6:7004 172.18.0.7:7005
9:檢驗下集群是否正常運行
進入7000容器
docker exec -it redis-7000 /bin/sh
進入redis客戶端
redis-cli -p 7000 -c
set sunl test?
可以看到數(shù)據(jù)正常創(chuàng)建成功训枢,也保存到7002上
docker redis實例運行在不同的宿主機上實現(xiàn)集群
1:我準備在192.168.155.55虛擬機上啟動7000托修,7001,7004 redis肮砾,在192.168.155.56虛擬機上啟動7002诀黍,7003,7005 redis
2:修改redis.conf文件,修改6份
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
protected-mode no
3:網(wǎng)卡用docker自帶的host
docker network ls
在192.168.155.55上啟動redis
docker run -p 7000:7000 -p 17000:17000 --restart always --name redis-7000 --net host -v /docker/redis/7000/redis7000.conf:/etc/redis/redis.conf -v /docker/redis/7000/data:/data -d redis:4.0 redis-server /etc/redis/redis.conf
docker run -p 7003:7003 -p 17003:17003 --restart always --name redis-7003 --net host -v /docker/redis/7003/redis7003.conf:/etc/redis/redis.conf -v /docker/redis/7003/data:/data -d redis:4.0 redis-server /etc/redis/redis.conf
docker run -p 7004:7004 -p 17004:17004 --restart always --name redis-7004 --net host -v /docker/redis/7004/redis7004.conf:/etc/redis/redis.conf -v /docker/redis/7004/data:/data -d redis:4.0 redis-server /etc/redis/redis.conf
在192.168.155.56上啟動redis
docker run -p 7001:7001 -p 17001:17001 --restart always --name redis-7001 --net host -v /docker/redis/7001/redis7001.conf:/etc/redis/redis.conf -v /docker/redis/7001/data:/data -d redis:4.0 redis-server /etc/redis/redis.conf
docker run -p 7002:7002 -p 17002:17002 --restart always --name redis-7002 --net host -v /docker/redis/7002/redis7002.conf:/etc/redis/redis.conf -v /docker/redis/7002/data:/data -d redis:4.0 redis-server /etc/redis/redis.conf
docker run -p 7005:7005 -p 17005:17005 --restart always --name redis-7005 --net host -v /docker/redis/7005/redis7005.conf:/etc/redis/redis.conf -v /docker/redis/7005/data:/data -d redis:4.0 redis-server /etc/redis/redis.conf
注意:我先建立的是單虛擬機上跑6個redis容器仗处,啟動后data文件夾數(shù)據(jù)已經(jīng)寫入了眯勾,再建立多虛擬機跑redis的時候,需要先把data文件夾清空
4:啟動完redis容器后婆誓,看下網(wǎng)絡(luò)情況
192.168.155.55? 虛擬機
docker network inspect host
192.168.155.56? 虛擬機
5:啟動ruby
echo yes | docker run -i --rm --net host redis-trib ruby redis-trib.rb create --replicas 1 192.168.155.55:7000 192.168.155.56:7001 192.168.155.56:7002 192.168.155.55:7003 192.168.155.55:7004 192.168.155.56:7005
6:測試集群環(huán)境是否運行正常
進入容器
docker exec -it redis-7000 /bin/sh
進入客戶端
redis-cli -p 7000 -c
可以看到在7000上建立了一個key=suntest value=1234,在7001上可以得到1234吃环,說明集群運行正常
-----------------------集群搭建遇到的一些坑,總結(jié)下小伙伴請注意------------------------------------------
1:在運行ruby的時候洋幻,一直報錯>>> Creating cluster [ERR] Sorry, can't connect to node
這個問題網(wǎng)上有很多解釋郁轻,其實按照我上面的配置不會出現(xiàn),說是設(shè)置密碼的,我沒設(shè)置好唯,說是版本不對的竭沫,我的版本都沒問題。
最后發(fā)現(xiàn)是網(wǎng)上給的運行ruby命令有問題骑篙,一般有兩種寫法:
第一種:echo yes | docker run -i --rm --net redis-net ruby sh -c 'gem install redis && wget http://download.redis.io/redis-stable/src/redis-trib.rb && ruby redis-trib.rb create --replicas 1 '"$(for port in `seq 7000 7005`; do echo -n "$(docker inspect --format '{{ (index .NetworkSettings.Networks "redis-net").IPAddress }}' "redis-${port}")":${port} ' ' ; done)"
第二種:echo yes | docker run -i --rm --net redis-net redis-trib ruby redis-trib.rb create --replicas 1 "$(for port in `seq 7000 7005`; do echo -n "$(docker inspect --format '{{ (index .NetworkSettings.Networks "redis-net").IPAddress }}' "redis-${port}")":${port} ' ' ; done)"
這兩種都是sh腳本這塊有問題蜕提,我沒發(fā)現(xiàn)問題在哪里,我們還是老實點靶端,一步一步來吧谎势。
2:當時我用第一種寫法運行ruby的時候,先是報了個ruby create命令找不到的錯誤杨名,這是因為wget?http://download.redis.io/redis-stable/src/redis-trib.rb?&& ruby redis-trib.rb下來的redis-trib.rb版本和我用的redis4.0不一樣造成的脏榆,要把版本統(tǒng)一下
3:redis.conf文件中一定要加上protected-mode no這句,很多網(wǎng)上的文章沒有加台谍,因為版本的不同有時會出現(xiàn)問題须喂,protected-mode的解釋網(wǎng)上很多文章都有。
4:用springboot鏈接redis集群典唇,application.yml的配置文件寫法:
spring.redis.database=0
spring.redis.cluster.nodes=192.168.155.55:7000,192.168.155.55:7001,192.168.155.55:7004,192.168.155.56:7002,192.168.155.56:7003,192.168.155.56:7005
spring.redis.pool.max-active=8
spring.redis.pool.max-wait=-1
spring.redis.pool.max-idle=8
spring.redis.pool.min-idle=0
spring.redis.timeout=0