使用DockerCompose搭建Redis集群
一、安装Docker Compose
1.下载docker-compose,我这里选择1.25.5这个版本
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
2.下载好之后,设置权限
sudo chmod +x /usr/local/bin/docker-compose
3.检测是否安装成功
docker-compose --version
出现下图则表示安装成功

二、Redis镜像
1.下载redis镜像,我这里选择5.0.3
docker pull redis:5.0.3
2.查看镜像
docker image ls -a

三、准备容器挂载的目录
1.创建根目录
mkdir /docker/redis
2.创建容器目录,我这里采用3主3从的方式。端口分别为7001-7006。然后创建给每个节点创建对应的目录和配置文件
mkdir 700{1..6}
mkdir 700{1..6}/data
mkdir 700{1..6}/config
touch 700{1..6}/config/redis.config

四、准备配置文件
1.将redis.config解压后,复制到各个节点的config下

五、准备docker-compose.yml
vi docker-compose.yml
然后按键盘i,进入输入模式
复制以下内容:
version: '3'
services:
 redis1:
  image: redis:5.0.3
  restart: always  
  volumes:
   - /docker/redis/7001/config/redis.conf:/etc/redis/redis.conf
   - /docker/redis/7001/data:/data
  environment:
   - TZ=Asia/Shanghai
   - LANG=en_US.UTF-8
  ports:
    - '7001:6379'     #服务端口
    - '17001:16379'   #集群端口
  command: ["redis-server", "/etc/redis/redis.conf"]
  privileged: true    #环境变量
  
 redis2:
  image: redis:5.0.3
  #network_mode: host
  restart: always
  volumes:
   - /docker/redis/7002/config/redis.conf:/etc/redis/redis.conf
   - /docker/redis/7002/data:/data
  environment:
   - TZ=Asia/Shanghai
   - LANG=en_US.UTF-8
  ports:
    - '7002:6379'     #服务端口
    - '17002:16379'   #集群端口
  command: ["redis-server", "/etc/redis/redis.conf"]
  privileged: true    #环境变量
 redis3:
  image: redis:5.0.3
  #network_mode: host
  restart: always
  volumes:
   - /docker/redis/7003/config/redis.conf:/etc/redis/redis.conf
   - /docker/redis/7003/data:/data
  environment:
   - TZ=Asia/Shanghai
   - LANG=en_US.UTF-8
  ports:
    - '7003:6379'     #服务端口
    - '17003:16379'   #集群端口
  command: ["redis-server", "/etc/redis/redis.conf"]
  privileged: true    #环境变量
 redis4:
  image: redis:5.0.3
  #network_mode: host
  restart: always
  volumes:
   - /docker/redis/7004/config/redis.conf:/etc/redis/redis.conf
   - /docker/redis/7004/data:/data
  environment:
   - TZ=Asia/Shanghai
   - LANG=en_US.UTF-8
  ports:
    - '7004:6379'     #服务端口
    - '17004:16379'   #集群端口
  command: ["redis-server", "/etc/redis/redis.conf"]
  privileged: true    #环境变量
 redis5:
  image: redis:5.0.3
  #network_mode: host
  restart: always
  volumes:
   - /docker/redis/7005/config/redis.conf:/etc/redis/redis.conf
   - /docker/redis/7005/data:/data
  environment:
   - TZ=Asia/Shanghai
   - LANG=en_US.UTF-8
  ports:
    - '7005:6379'     #服务端口
    - '17005:16379'   #集群端口
  command: ["redis-server", "/etc/redis/redis.conf"]
  privileged: true    #环境变量
 redis6:
  image: redis:5.0.3
  #network_mode: host
  restart: always
  volumes:
   - /docker/redis/7006/config/redis.conf:/etc/redis/redis.conf
   - /docker/redis/7006/data:/data
  environment:
   - TZ=Asia/Shanghai
   - LANG=en_US.UTF-8
  ports:
    - '7006:6379'     #服务端口
    - '17006:16379'   #集群端口
  command: ["redis-server", "/etc/redis/redis.conf"]
  privileged: true    #环境变量
按键盘esc,输入:wq,保存文件
六、启动容器
以后台启动
docker-compose up -d

使用docker-compose ps查看容器列表,发现已经全部启动

再使用docker container ls比较看下

七、组建集群
redis-cli -h 192.168.200.135 -p 7001 --cluster create 192.168.200.135:7001 192.168.200.135:7002 192.168.200.135:7003 192.168.200.135:7004 192.168.200.135:7005 192.168.200.135:7006 --cluster-replicas 1

八、查看集群信息
可以看到主从关系

注意
1.使用docker-compose的方式,如果未指定网络,会以文件夹 + _default的规则自动创建一个名为redis_default的网络(文件夹名为redis),该次创建的所有容器都会加入该网络,其中的容器可以相互访问。
常见问题
1.搭建集群的时候,一直是Waiting for the cluster to join.....
我最初的想法是docker是相互隔离的,所以每个node中的端口都可以使用默认的6379。最开始配置为:
  ports:
    - '7001:6379'     #服务端口
    - '17001:16379'   #集群端口
...
  ports:
    - '7006:6379'     #服务端口
    - '17006:16379'   #集群端口
其实这种配置有问题的。在启动容器的时候虽然正常,但是集群的节点间是无法通信的。因为redis集群间的通信端口是10000+当前节点port,在组建集群时,每个容器中的node,端口都是6379,会通过16379访问其他node,而容器映射的端口是17001不是16379,所以才会一直waiting。
2.Node 192.168.200.135:7002 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0
删除对应node中data下的内容即可,我这里是测试环境为了方便,删除所有node下data的内,命令如下:
先停止容器,docker-compose down ,然后删除所有节点data下的内rm -f /docker/redis/700{1..6}/data/*
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号