使用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主1从的方式。端口分别为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/*

参考:https://www.jianshu.com/p/b7dea62bcd8b

原文地址:https://www.cnblogs.com/wugang/p/14491468.html