一、安装docker
1、查看linux内核版本
uname -a
docker 要求centos7在版本3.10之上,内核版本过低的百度一下,自己去更新
2、安装必要的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
3、设置yum源
yum-config-manager --add-repo
4、查看docker版本
yum list docker-ce --showduplicates | sort -r
5、选择你喜爱的版本下载安装
yum install docker-ce-17.12.1.ce
6、 启动,并加入开机启动
systemctl start docker
systemctl start docker
7、查看版本
docker version
到此docker 安装成功。
二、本文用到的一些docker基础命令
1、docker images :查看已下载的docker镜像
2、docker ps [options] :
-
-a :显示所有的容器,包括未运行的。
-
-f :根据条件过滤显示的内容。
-
--format :指定返回值的模板文件。
-
-l :显示最近创建的容器。
-
-n :列出最近创建的n个容器。
-
--no-trunc :不截断输出。
-
-q :静默模式,只显示容器编号。
-
-s :显示总的文件大小。
3、docker search [options] term :
-
--automated :只列出 automated build类型的镜像;
-
--no-trunc :显示完整的镜像描述;
-
-s :列出收藏数不小于指定值的镜像。
4、docker pull [options] name [:tag|@digest] :
-
-a :拉取所有 tagged 镜像
-
--disable-content-trust :忽略镜像的校验,默认开启
5、docker build [options] path| url| -
-
--build-arg=[] :设置镜像创建时的变量;
-
--cpu-shares :设置 cpu 使用权重;
-
--cpu-period :限制 CPU CFS周期;
-
--cpu-quota :限制 CPU CFS配额;
-
--cpuset-cpus :指定使用的CPU id;
-
--cpuset-mems :指定使用的内存 id;
-
--disable-content-trust :忽略校验,默认开启;
-
-f :指定要使用的Dockerfile路径;
-
--force-rm :设置镜像过程中删除中间容器;
-
--isolation :使用容器隔离技术;
-
--label=[] :设置镜像使用的元数据;
-
-m :设置内存最大值;
-
--memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;
-
--no-cache :创建镜像的过程不使用缓存;
-
--pull :尝试去更新镜像的新版本;
-
--quiet, -q :安静模式,成功后只输出镜像 ID;
-
--rm :设置镜像成功后删除中间容器;
-
--shm-size :设置/dev/shm的大小,默认值是64M;
-
--ulimit :Ulimit配置。
-
--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
-
--network: 默认 default。在构建期间设置RUN指令的网络模式
三、下载redis4.0
docker pull redis:4.0
四、下载ruby
docker pull ruby
五、创建虚拟网卡
docker network create redis-net
六、查看redis-net虚拟网卡网关ip
docker network inspect redis-net | grep "Gateway" | grep --color=auto -P '(\d{1,3}.){3}\d{1,3}' -o
网卡网关ip是:172.18.0.1
七、创建redis配置文件(redis-cluster.tmpl)
mkdir -p /home/redis-cluster && cd /home/redis-cluster
vim redis-cluster.tmpl
port ${PORT}
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip xxx.xxx.xxx.xx #暂时是你上面查到的网关ip值
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
appendonly yes
protected-mode no
八、生成conf 和 data 文件目录
for port in `seq 7000 7005`; do \
mkdir -p ./${port}/conf \
&& PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis${port}.conf \
&& mkdir -p ./${port}/data; \
done
这样在你的/home/redis-cluster 下便有 7000~7005 总共六个文件夹
使用tree命令查询 应该为:
请忽略data目录下的文件
九、启动redis容器
docker run -p 7000:7000 -p 17000:17000 --restart always --name redis-7000 --net redis-net --privileged=true -v /home/redis-cluster/7000/redis7000.conf:/etc/redis/redis.conf -v /home/redis-cluster/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 /home/redis-cluster/7001/redis7001.conf:/etc/redis/redis.conf -v /home/redis-cluster/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 /home/redis-cluster/7002/redis7002.conf:/etc/redis/redis.conf -v /home/redis-cluster/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 /home/redis-cluster/7003/redis7003.conf:/etc/redis/redis.conf -v /home/redis-cluster/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 /home/redis-cluster/7004/redis7004.conf:/etc/redis/redis.conf -v /home/redis-cluster/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 /home/redis-cluster/7005/redis7005.conf:/etc/redis/redis.conf -v /home/redis-cluster/7005/data:/data -d redis:4.0 redis-server /etc/redis/redis.conf
十、查看容器ip分配
docker network inspect redis-net
将 Containers 中的端口对应ip同步替换到你所生成的 conf文件当中。
十一、停止并删除全部容器
sudo docker stop $(sudo docker ps -a -q)
sudo docker rm $(sudo docker ps -a -q)
十二、创建ruby镜像
写Dockerfile文件,切记文件名为Dockerfile
FROM ruby:latest
MAINTAINER sunlin<sunlin1111@163.com>
RUN gem install redis -v 4.0.0
RUN mkdir /redis
WORKDIR /redis
ADD ./redis-trib.rb /redis/redis-trib.rb
这里分享一个貌似有点坑的小坑
由于当前(2020/01/02)redis最新版本已在5.0之上。redis5.0已经不采用ruby的方式配置集群。
所以这里下载redis 要指定版本。否则就会下载最新版的redis-trib.rb,然后会疯狂提示你:
WARNING: redis-trib.rb is not longer available!
You should use redis-cli ins.....
...
......等等
十三、运行生成ruby自定义镜像
docker build -t redis-trib .
十四、运行ruby
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
中间会弹出确认框:
一定要输入 yes 是yes,不是y!不是y!不是y!!!
输入y会在接下来的某一步操作中报错:
(error) CLUSTERDOWN Hash slot not served
十五、检验下集群是否正常运行
docker exec -it redis-7000 /bin/sh
redis-cli -p 7000 -c
set sunl test1
搭建过程中可能遇到的问题:
一、集群部署一直卡在Waiting for the cluster to join ......
解决办法:
1、检查redis${port}.conf文件
#检查
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
#port是否与当前端口一致
若不一致则修改conf文件,然后执行:
#1、删除redis${port} 所在上级目录的同级目录data下的全部文件
rm -rf appendonly.aof dump.rdb nodes.conf
#2、分别进入每个redis容器
docker exec -it redis-port /bin/sh # port 不是命令 是你容器的端口 redis-port 是你容器的名字
#3、登录redis
redis-cli -p port -c
#4、清除数据
flushdb
#5、退出redis
exit
#6、退出容器
exit
#7、重新启动当前全部容器
sudo docker restart $(sudo docker ps -a -q)
二、[ERR] Node 172.168.63.202:7001 is not empty. Either the nodealready knows other nodes (check with CLUSTER NODES) or contains some
#1、删除redis${port} 所在上级目录的同级目录data下的全部文件
rm -rf appendonly.aof dump.rdb nodes.conf
#2、分别进入每个redis容器
docker exec -it redis-port /bin/sh # port 不是命令 是你容器的端口 redis-port 是你容器的名字
#3、登录redis
redis-cli -p port -c
#4、清除数据
flushdb
#5、退出redis
exit
#6、退出容器
exit
#7、重新启动当前全部容器
sudo docker restart $(sudo docker ps -a -q)
三、Creating Server TCP listening socket ****:6379: bind: Cannot assign requested address
解决办法:删除conf文件中的bind