使用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/*