首页 > 代码库 > Docker 实现的 redis 主从
Docker 实现的 redis 主从
计划用 Docker 实现 Redis 的主从,简单主从而已。主的名称叫 redis-master
一步步来。
先新建个Dockerfile ,从alpine 开始,比较简单。
FROM alpine:latestMAINTAINER qufo qufo@163.com# 换源RUN echo ‘http://mirrors.ustc.edu.cn/alpine/edge/main‘ > /etc/apk/repositoriesRUN echo ‘@community http://mirrors.ustc.edu.cn/alpine/edge/community‘ >> /etc/apk/repositoriesRUN echo ‘@testing http://mirrors.ustc.edu.cn/alpine/edge/testing‘ >> /etc/apk/repositoriesRUN apk update# 修正时区ENV TIMEZONE Asia/ShanghaiRUN apk add tzdataRUN ln -snf /usr/share/zoneinfo/$TIMEZONE /etc/localtimeRUN echo $TIMEZONE > /etc/timezone# 修改一些系统设置RUN echo ‘vm.overcommit_memory = 1‘ >> /etc/sysctl.confRUN echo "echo never > /sys/kernel/mm/transparent_hugepage/enabled" >> /etc/rc.local# 开始安装 redisRUN apk add redisCOPY start_redis.sh /usr/local/RUN chmod +x /usr/local/start_redis.shRUN chown redis:redis /usr/local/start_redis.shEXPOSE 6379ENTRYPOINT ["sh","/usr/local/start_redis.sh"]CMD ["master"]
可以看到,我们还需要一个启动脚本。start_redis.sh
redis_role=$1sed -i ‘s/protected-mode yes/protected-mode no/g‘ /etc/redis.confsed -i ‘s/daemonize yes/daemonize no/g‘ /etc/redis.confsed -i ‘s/bind 127.0.0.1/bind 0.0.0.0/g‘ /etc/redis.confecho "Start Redis by "if [ $redis_role = "master" ]; then echo "master" redis-server /etc/redis.confelif [ $redis_role = "slave" ]; then echo "slave" sed -i ‘s/# slaveof <masterip> <masterport>/slaveof redis-master 6379/g‘ /etc/redis.conf redis-server /etc/redis.confelse echo "unknow role!"fi
这里修改了一些系统配置,然后根据传进来的 role 区别启动主或从模式。其中的主名称是写死了的 redis-master
好了,现在构建,在Dockerfile 和 start_redis.sh 所在的目录下,执行
docker rmi qufo/redisdocker build -t="qufo/redis" .
我们就得到了一个名为 qufo/redis 的 image , 因为采用的是 alpine 的包,所以速度很快,在我的机器上大概7秒就完成了。
通过
docker images
看下镜象的信息,只有9M多些。
好了,现在来启动他们,启运完后检查一下是不是都在。
ufo@ubuntu:~$ docker run -d --name=redis-master -p=6379:6379 qufo/redis masterad7c5a6e16a8d87f04240c7bcb20ef765eab832737f32457e956966a2f282179ufo@ubuntu:~$ docker run -d --name=node1 --link=redis-master:redis-master -p=7001:6379 qufo/redis slave8cef160881f59b017cd915775fa3f76d9456b510b300147779fd8ff4ba9f9a2cufo@ubuntu:~$ docker run -d --name=node2 --link=redis-master:redis-master -p=7002:6379 qufo/redis slave767011663ef8b93b5326bd4f9940762922ee4a685278806d42b8ce690164de48ufo@ubuntu:~$ docker run -d --name=node3 --link=redis-master:redis-master -p=7003:6379 qufo/redis slave6c4bb442d5adb6773301bac29e6a7a5b1f636d47c67dc21c9ec0ec28cf988602ufo@ubuntu:~$ docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES6c4bb442d5ad qufo/redis "sh /usr/local/start_" 38 seconds ago Up 37 seconds 0.0.0.0:7003->6379/tcp node3767011663ef8 qufo/redis "sh /usr/local/start_" 48 seconds ago Up 47 seconds 0.0.0.0:7002->6379/tcp node28cef160881f5 qufo/redis "sh /usr/local/start_" 57 seconds ago Up 56 seconds 0.0.0.0:7001->6379/tcp node1ad7c5a6e16a8 qufo/redis "sh /usr/local/start_" About a minute ago Up About a minute 0.0.0.0:6379->6379/tcp redis-master
可以看到有一主(redis-master)多从 node1,node2,node3。
现在来试一下,在主里 set ,从里 get
# 利用映射出来的端品直接连 redis-masterufo@ubuntu:~/$ redis-cli127.0.0.1:6379> info replication# Replicationrole:masterconnected_slaves:3slave0:ip=172.17.0.3,port=6379,state=online,offset=239,lag=0slave1:ip=172.17.0.4,port=6379,state=online,offset=239,lag=1slave2:ip=172.17.0.5,port=6379,state=online,offset=239,lag=1master_repl_offset:239repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:2repl_backlog_histlen:238127.0.0.1:6379> set username qufoOK127.0.0.1:6379> get username"qufo"127.0.0.1:6379> exit# 可见 为 master 模式,在里面设置和 username# 通过 7001 连接 node1ufo@ubuntu:~/$ redis-cli -p 7001127.0.0.1:7001> info replication# Replicationrole:slavemaster_host:redis-mastermaster_port:6379master_link_status:upmaster_last_io_seconds_ago:8master_sync_in_progress:0slave_repl_offset:327slave_priority:100slave_read_only:1connected_slaves:0master_repl_offset:0repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0127.0.0.1:7001> get username"qufo"127.0.0.1:7001> set username nothing(error) READONLY You can‘t write against a read only slave.127.0.0.1:7001> exitufo@ubuntu:~/$ # 可见为 slave 模式,可以 get username ,但不能 set username 因为slave 是只读的。
好吧,主从配置完成。
Docker 实现的 redis 主从
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。