docker安装redis集群

3,226 阅读3分钟

docker的网络介绍

Docker有三种网络模式,bridge、host、none,在你创建容器的时候,不指定--network默认是bridge。

bridge:为每一个容器分配IP,并将容器连接到一个docker0虚拟网桥,通过docker0网桥与宿主机通信。
	也就是说,此模式下,你不能用宿主机的IP+容器映射端口来进行Docker容器之间的通信。
host:容器不会虚拟自己的网卡,配置自己的IP,而是使用宿主机的IP和端口。这样一来,Docker容器之间的
      通信就可以用宿主机的IP+容器映射端口

none:无网络。

此处我们使用host模式,进行redis集群的配置。

拉取redis:5.0的镜像到本地

docker pull redis:5.0 # 拉取tag为5.0的redis镜像。

虽然我们拉取的时5.0,但是redis的版本不是真的就是5.0
这时我们可以使用命令:

docker inspect redis:5.0

查看镜像的详情,会以json的形式展示。从中可以看到具体的redis版本号。
redis的5.0版本以上安装集群不需要ruby了。为了方便,我们选取5.0版本redis进行集群配置

创建存放redis集群相关配置文件和数据的文件夹

mkdir /home/docker/redis-cluster # 创建redis集群文件根目录

下面是配置文件模板,我们后续要写入到各个节点的配置文件中

port 6601
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.1.97
cluster-announce-port 6601
cluster-announce-bus-port 16601
appendonly yes


解释:
cluster-announce-ip 这个必须要改成你自己主机的ip

根据刚才生成的配置文件模板生成各个节点的文件夹以及文件

在刚才创建的/home/docker/redis-cluster文件夹内
根据上面模板写一个自动生成所需文件夹以及文件的命令,把ip改成自己的
输入以下命令:

for port in `seq 6601 6606`; do 
    mkdir -p ./${port}/conf 
    touch ./${port}/conf/redis.conf
    mkdir -p ./${port}/data
    echo "port ${port}" >>./${port}/conf/redis.conf
    echo "protected-mode no"  >>./${port}/conf/redis.conf
    echo "cluster-enabled yes" >>./${port}/conf/redis.conf
    echo "cluster-config-file nodes.conf" >>./${port}/conf/redis.conf
    echo "cluster-node-timeout 5000" >>./${port}/conf/redis.conf
    echo "cluster-announce-ip 192.168.1.97" >>./${port}/conf/redis.conf
    echo "cluster-announce-port ${port}" >>./${port}/conf/redis.conf
    echo "cluster-announce-bus-port 1${port}" >>./${port}/conf/redis.conf
    echo "appendonly yes" >>./${port}/conf/redis.conf
done

解释:
mkdir -p :递归创建目录,即使上级目录不存在,会按目录层级自动创建目录
创建6601文件夹,并且创建6601/conf文件夹
把当前目录的redis-cluster.conf 复制到6601/conf文件夹下并改名为redis.conf
在/home/docker/redis-cluster目录下输入命令:
ls -l
查看相应的文件夹是否已经生成,查看文件内容是否正确
例如6602文件夹内配置文件的内容用为:
port 6602
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.1.97
cluster-announce-port 6602
cluster-announce-bus-port 16602
appendonly yes

根据已经生成文件,启动容器

for port in `seq 6601 6606`; do \
  docker run -d --net host --privileged=true \
  -v $PWD/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
  -v $PWD/${port}/data:/data \
  --restart always --name redis-${port} \
  redis:5.0 redis-server /usr/local/etc/redis/redis.conf; \
done

解释:
--net host #指定容器使用host网络模式启动
-v $PWD/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf # 把对应的配置文件映射到容器内
--privileged=true #使容器内的root拥有真正的root权限
redis-server /usr/local/etc/redis/redis.conf # 使用配置文件启动redis

启动完所需要的redis服务,需要关闭防火墙或者开放对应的端口号,才能顺利的进行集群设置

可以选择下面的命令直接关闭防火墙或者开放对应端口号

直接关闭防火墙的命令:

systemctl stop firewalld # 关闭
systemctl disable firewalld #禁止开机启动
如果选择关闭防火墙需要重启docker服务

对防火墙开放对应的端口号

for port in `seq 6601 6606`; do

	firewall-cmd --zone=public --add-port=${port}/tcp --permanent

done

重启防火墙使生效

firewall-cmd --reload

随意进入一个容器进行集群配置

docker exec -it redis-6601 /bin/bash
cd /usr/local/bin
redis-cli --cluster create 192.168.1.97:6601 192.168.1.97:6602 192.168.1.97:6603 192.168.1.97:6604 192.168.1.97:6605 192.168.1.97:6606 --cluster-replicas 1
把对应IP换成你主机IP

登录集群

docker exec -it redis-7003 /bin/bash
cd /usr/local/bin
以集群模式登录
redis-cli -c -p 7003

解释:
-c # 以集群模式登录
-h # 指定要登录的ip地址
-p # 指定要登录的端口号
这里需要-c 没有这个不能进行集群的正常操作
可以在一个里面set一个值,在其他的里面进行get测试