Docker+Redis3集群环境搭建
拓扑:
实验目标:
client通过192.168.100.67访问到下列redis集群
容器ID为9cb25bcd52d1的ip地址:172.17.0.5 port: 7005 7006
容器ID为91dac3ea23c9的ip地址:172.17.0.4 port: 7003 7004
容器ID为e2189fc1d4d9的ip地址:172.17.0.2 port: 7001 7002
创建一个基础的rides镜像,包含基础包、ruby、redis接口
我们创建一个基础的rides镜像,这其中要安装必须的一些基础包,ruby等,Dockerfile如下,借用网上的稍作修改,本来打算把gem install redis一起在RUN命令中,但是连不到官方服务器,只能通过国外IP下载放到宿主机目录/root/redissoft作为共享卷让容器读取
[root@localhost CentOS7]# pwd
/root/centos7
[root@localhost centos7]# more Dockerfile
#
# MAINTAINER [email protected]
# Dockerizing CentOS7: Dockerfile for building CentOS images
#
FROM centos:centos7.1.1503
MAINTAINER [email protected]
ENV TZ "Asia/Shanghai"
ENV TERM xterm
ADD aliyun-mirror.repo /etc/yum.repos.d/CentOS-Base.repo
ADD aliyun-epel.repo /etc/yum.repos.d/epel.repo
VOLUME ["/root/redissoft"]
RUN yum install -y curl wget tar bzip2 unzip vim-enhanced passwd sudo yum-utils hostname net-tools rsync man && \
yum install -y gcc gcc-c++ git make automake cmake patch logrotate Python-devel libpng-devel libjpeg-devel && \
yum install -y --enablerepo=epel pwgen python-pip && \
yum install -y ruby rubygems && \
yum clean all
通过Dockfiler创建redis/centos:v7.1 镜像,并且安装redis接口,
[root@localhost centos7]# docker build -t redis/centos:v7.1 .
[root@localhost centos7]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis/centos v7.1 5812d7509345 About an hour ago 601.4 MB
现在有了基础镜像但是还没有安装gem install redis,所以我们进入容器通过gem install redis安装redis接口
[root@localhost ~]#docker run -it -v /root/redissoft:/root/redissoft redis/centos:v1
[root@9cb25bcd7895 ~]#cd /root/redissoft
[root@9cb25bcd7895 ~]#gem install redis-3.2.1.gem
[root@9cb25bcd7895 ~]#exit
创建redis/nodemodule:v1镜像
再创建镜像redis/nodemodule镜像用于redis节点容器的新建
[root@localhost ~]#docker commit -t 9cb25bcd7895 redis/nodemodule:v1
注:由于是实验并没有深究gem install redis-3.2.1.gem整合到Dockfile中,实际应用尽量将操作都要整合到Dockfile,其实以下所有操作都可以作为一个Dockfile来创建,后续再探索;
启动容器
[root@localhost centos7]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis/nodemodule v1 e5ea8f7834df 3 minutes ago 602.1 MB
#此镜像作为创建3个节点容器的模板,此镜像已经安装了ruby环境和基础环境包, 没有安装redis3.0.7;
[root@localhost ~]#docker run -itd -p 7001:7001 -p 7002:7002 -v /root/redissoft:/root/redissoft --name redisNodeA7000-70001 redis/nodemodule:v1 /bin/bash
[root@localhost ~]#docker run -itd -p 7003:7003 -p 7004:7004 -v /root/redissoft:/root/redissoft --name redisNodeA7003-70004 redis/nodemodule:v1 /bin/bash
[root@localhost ~]#docker run -itd -p 7005:7005 -p 7006:7006 -v /root/redissoft:/root/redissoft --name redisNodeA7005-70006 redis/nodemodule:v1 /bin/bash
[root@localhost ~]# docker ps #之所以用-v /root/redissoft:/root/redissoft参数是让容器能取到redis安装包
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e2189fc1d4d9 redis/nodemodule:v1 "/bin/bash" 55 minutes ago Up 55 minutes 0.0.0.0:7001-7002->7001-7002/tcp redisNodeA7000-70001
9cb25bcd52d1 redis/nodemodule:v1 "/bin/bash" About an hour ago Up About an hour 0.0.0.0:7005-7006->7005-7006/tcp redisNodeA7005-70006
91dac3ea23c9 redis/nodemodule:v1 "/bin/bash" About an hour ago Up About an hour 0.0.0.0:7003-7004->7003-7004/tcp redisNodeA7003-70004
容器ID为9cb25bcd52d1的ip地址:172.17.0.5 port: 7005 7006
容器ID为91dac3ea23c9的ip地址:172.17.0.4 port: 7003 7004
容器ID为e2189fc1d4d9的ip地址:172.17.0.2 port: 7001 7002
安装redis3.0.7
下面的操作实例只记录在9cb25bcd52d1:172.17.0.5 上面的操作, 一定要在每个节点都进行操作,对应的端口目录,修改对面的端口
[root@localhost redissoft]# docker-enter 9cb25bcd52d1
Last login: Tue Mar 15 08:13:51 UTC 2016
[root@9cb25bcd52d1 ~]# cd /root/redissoft/
[root@9cb25bcd52d1 redissoft]# ls
redis-3.0.7.tar.gz redis-3.2.1.gem
[root@9cb25bcd52d1 redissoft]#
[root@9cb25bcd52d1 local]# cp redis-3.0.7.tar.gz /usr/local/
[root@9cb25bcd52d1 local]# tar -xvf redis-3.0.7.tar.gz
[root@9cb25bcd52d1 local]# mv redis-3.0.7 redis3.0
[root@9cb25bcd52d1 local]# cd redis3.0
[root@9cb25bcd52d1 local]# make && make install
创建节点配置文件
保证3个节点都有对应的端口目录
[root@9cb25bcd52d1 redis3.0]# mkdir -p /usr/local/cluster
[root@9cb25bcd52d1 redis3.0]# mkdir -p /usr/local/cluster/7005
[root@9cb25bcd52d1 redis3.0]# mkdir -p /usr/local/cluster/7006
[root@9cb25bcd52d1 redis3.0]# cp -rf /usr/local/redis3.0/* /usr/local/cluster/7005/
[root@9cb25bcd52d1 redis3.0]# cp -rf /usr/local/redis3.0/* /usr/local/cluster/7006/
[root@9cb25bcd52d1 redis3.0]#
修个节点配置文件
保证3个节点都要在相应的配置文件内配置相应的端口号,只修改列出的项目;
[root@9cb25bcd52d1 redis3.0]# vi /usr/local/cluster/7005/redis.conf
port 7005
daemonize yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
[root@9cb25bcd52d1 redis3.0]# vi /usr/local/cluster/7006/redis.conf
port 7006
daemonize yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
启动服务
保证3个节点都要起来
[root@9cb25bcd52d1 cluster]# cd /usr/local/cluster/7005/src/
[root@9cb25bcd52d1 src]# ./redis-server ../redis.conf
[root@9cb25bcd52d1 src]# cd /usr/local/cluster/7006/src/
[root@9cb25bcd52d1 src]# ./redis-server ../redis.conf
[root@9cb25bcd52d1 src]# ps -ef |grep redis
root 3000 1 0 09:12 ? 00:00:00 ./redis-server *:7005 [cluster]
root 3004 1 0 09:13 ? 00:00:00 ./redis-server *:7006 [cluster]
root 3008 58 0 09:13 ? 00:00:00 grep --color=auto redis
[root@9cb25bcd52d1 src]#
创建集群
cd /usr/local/redis3.0/src
./redis-trib.rb create --replicas 1 172.17.0.2:7001 172.17.0.2:7002 172.17.0.4:7003 172.17.0.4:7004 172.17.0.5:7005 172.17.0.5:7006
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
172.17.0.2:7001
172.17.0.4:7003
172.17.0.5:7005
Adding replica 172.17.0.4:7004 to 172.17.0.2:7001
Adding replica 172.17.0.2:7002 to 172.17.0.4:7003
Adding replica 172.17.0.5:7006 to 172.17.0.5:7005
M: b9597621be3c89721e980bf21211349d816719f8 172.17.0.2:7001
slots:0-5460 (5461 slots) master
S: 198746c9c20225b2f35312e3f787590ae8fbc450 172.17.0.2:7002
replicates ae4adef75beba6f20129f7a7263ec301b85862c5
M: ae4adef75beba6f20129f7a7263ec301b85862c5 172.17.0.4:7003
slots:5461-10922 (5462 slots) master
S: 3f89d374e0e6461b566527d5a9dffe2d91bf43dd 172.17.0.4:7004
replicates b9597621be3c89721e980bf21211349d816719f8
M: 1b26d10b8a6ee3aa731123716e68bd3e911d805e 172.17.0.5:7005
slots:10923-16383 (5461 slots) master
S: 75e63758ce188ab1ccaa4e9bc195d560b9a7c417 172.17.0.5:7006
replicates 1b26d10b8a6ee3aa731123716e68bd3e911d805e
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join...
>>> Performing Cluster Check (using node 172.17.0.2:7001)
M: b9597621be3c89721e980bf21211349d816719f8 172.17.0.2:7001
slots:0-5460 (5461 slots) master
M: 198746c9c20225b2f35312e3f787590ae8fbc450 172.17.0.2:7002
slots: (0 slots) master
replicates ae4adef75beba6f20129f7a7263ec301b85862c5
M: ae4adef75beba6f20129f7a7263ec301b85862c5 172.17.0.4:7003
slots:5461-10922 (5462 slots) master
M: 3f89d374e0e6461b566527d5a9dffe2d91bf43dd 172.17.0.4:7004
slots: (0 slots) master
replicates b9597621be3c89721e980bf21211349d816719f8
M: 1b26d10b8a6ee3aa731123716e68bd3e911d805e 172.17.0.5:7005
slots:10923-16383 (5461 slots) master
M: 75e63758ce188ab1ccaa4e9bc195d560b9a7c417 172.17.0.5:7006
slots: (0 slots) master
replicates 1b26d10b8a6ee3aa731123716e68bd3e911d805e
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
创建结束后我们会发现有:
3个主节点:172.17.0.2:7001 172.17.0.2:7003 172.17.0.2:7005 这正是我们想要的结果
集群测试
发现3个set语句都把数据存在不同节点的slot里面了,读取的时候也从相应节点进行读取
[root@e2189fc1d4d9 ~]# redis-cli -c -p 7001
127.0.0.1:7001> set foo bar
-> Redirected to slot [12182] located at 172.17.0.5:7005
OK
172.17.0.5:7005> set hello newjoyful
-> Redirected to slot [866] located at 172.17.0.2:7001
OK
172.17.0.2:7001> set test newjoy
-> Redirected to slot [6918] located at 172.17.0.4:7003
OK
172.17.0.4:7003> get foo
-> Redirected to slot [12182] located at 172.17.0.5:7005
"bar"
172.17.0.5:7005> get hello
-> Redirected to slot [866] located at 172.17.0.2:7001
"newjoyful"
172.17.0.2:7001> get test
-> Redirected to slot [6918] located at 172.17.0.4:7003
"newjoy"
172.17.0.4:7003>
在宿主机192.168.100.67上安装redis3.0.7之后同样可以连接redis集群环境,因为容器与主机有端口映射关系
[root@localhost ~]# cp redis-3.0.7.tar.gz /usr/local/
[root@localhost ~]# cd /usr/local/
[root@localhost ~]# tar -xvf redis-3.0.7.tar.gz
[root@localhost ~]# mv redis-3.0.7 redis3.0
[root@localhost ~]# cd redis3.0/
[root@localhost ~]# make
[root@localhost ~]# make install
[root@localhost ~]# netstat -an |grep :::700
tcp6 0 0 :::7001 :::* LISTEN
tcp6 0 0 :::7002 :::* LISTEN
tcp6 0 0 :::7003 :::* LISTEN
tcp6 0 0 :::7004 :::* LISTEN
tcp6 0 0 :::7005 :::* LISTEN
tcp6 0 0 :::7006 :::* LISTEN
[root@localhost ~]# redis-cli -c -p 7003
127.0.0.1:7003> get hello
-> Redirected to slot [866] located at 172.17.0.2:7001
"newjoyful"
172.17.0.2:7001> get test
-> Redirected to slot [6918] located at 172.17.0.4:7003
"newjoy"
172.17.0.4:7003>
作为结尾,我们应该把现在运行的容器生成Image,但是觉得没有意义,如果容器重启之后IP地址可能会发生变化配置也会随着变化,所以这次试验只合适进行学习、测试
Error parsing reference: "redis/redisNodeA7001_7002:v1" is not a valid repository/tag
[root@localhost ~]# docker commit redisNodeA7000-70001 redis/redisnodea7001_7002:v1
sha256:4bef9995c1fd4214719ae810c8dda347c8f10d0431d27f84cc1c81cf94231cb1
[root@localhost ~]# docker commit redisNodeA7003-70004 redis/redisnodeb7003_7004:v1
sha256:37a5ea1d992b3406fb98751f2798f1f339f6f5bc6ed001fc0103da35ca79f4f4
[root@localhost ~]# docker commit redisNodeA7005-70006 redis/redisnodec7005_7006:v1
sha256:263ccb2779787d917e24a5e0ed7ba29c1a24fb4adc544fdb8948365526f4fb56
[root@localhost ~]#
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis/redisnodec7005_7006 v1 263ccb277978 About a minute ago 751.5 MB
redis/redisnodeb7003_7004 v1 37a5ea1d992b About a minute ago 752.9 MB
redis/redisnodea7001_7002 v1 4bef9995c1fd 2 minutes ago 752.9 MB
redis/nodemodule v1 e5ea8f7834df About an hour ago 602.1 MB
redis/centos v7.1 5812d7509345 About an hour ago 601.4 MB
Ubuntu latest 07c86167cdc4 11 days ago 187.9 MB
redis latest 4f5f397d4b7c 12 days ago 177.5 MB
centos centos7.1.1503 30e55721fefe 5 months ago 212.1 MB
本文要用到的相关附件到安科网资源站下载:
------------------------------------------分割线------------------------------------------
具体下载目录在 /2016年资料/3月/17日/Docker+Redis3集群环境搭建/
------------------------------------------分割线------------------------------------------