从零开始学习docker之在docker中搭建redis(集群)
docker搭建redis集群
docker-compose是以多容器的方式启动,非常适合用来启动集群
一、环境准备
云环境:CentOS 7.6 64位
二、安装docker-compose
#需要先安装企业版linux附加包(epel) yum -y install epel-release #安装pip yum -y install python-pip #安装docker-compose pip install docker-compose
三、创建docker-compose.yml
以docker-compose启动时会从当前路径找docker-compose.yml或者docker-compose.yaml
从docker官网上找一份docker-compose.yml ,传送门—————————————-//docs.docker.com/compose/compose-file/
docker-compose启动单机redis
接下来先用docker-compose尝试启动单点redis,下面是docker-compose配置文件
#docker-compose版本
version: "3.8" services: # service实例名 redis: #容器服务名 container_name: redis-0 #基础镜像 image: redis #端口映射 #第一个端口是客户端通信端口 第二个端口为集群总线端口 用于失败检测以及故障转移、选举等 偏移量总是10000 ports: - 6379:6379 - 16379:16379 #映射宿主机的数据卷 配置数据目录和配置文件目录 HOST:CONTAINER volumes: - /usr/docker/redis/data:/data - /usr/docker/redis/redis.conf:/etc/redis/redis.conf # 设置服务默认的启动程序 entrypoint: - redis-server - /etc/redis/redis.conf
同时需要配置redis.conf ,配置以及配置项的修改请移步上一篇博文——从零开始学习docker之在docker中搭建redis(单机)
配置好之后只需要在docker-compose.yml所在目录执行
docker-compose up -d
启动成功,连接redis与验证同样移步上一篇博文
docker-compose启动redis集群
docker-compose.yml
#https://docs.docker.com/compose/compose-file/ #version version: "3.8" services: # 节点1 redis-1: #容器服务名 container_name: redis-1 #基础镜像 image: redis #网络 host模式 和宿主机公用 以便集群之中的其他机器互相通信 network_mode: "host" #端口映射 #第一个端口是客户端通信端口 第二个端口为集群总线端口 用于失败检测以及故障转移、选举等 偏移量总是10000 ports: - 6381:6381 - 16381:16381 #映射宿主机的数据卷 配置数据目录和配置文件目录 HOST:CONTAINER volumes: - /usr/docker/redis-cluster/redis-6381/data:/data - /usr/docker/redis-cluster/redis-6381/redis.conf:/etc/redis/redis.conf # 设置服务默认的启动程序 entrypoint: - redis-server - /etc/redis/redis.conf # 节点2 redis-2: #容器服务名 container_name: redis-2 #基础镜像 image: redis #网络 host模式 和宿主机公用 以便集群之中的其他机器互相通信 network_mode: "host" #端口映射 #第一个端口是客户端通信端口 第二个端口为集群总线端口 用于失败检测以及故障转移、选举等 偏移量总是10000 ports: - 6382:6382 - 16382:16382 #映射宿主机的数据卷 配置目录 volumes: - /usr/docker/redis-cluster/redis-6382/data:/redis/data - /usr/docker/redis-cluster/redis-6382/redis.conf:/etc/redis/redis.conf # 设置服务默认的启动程序 entrypoint: - redis-server - /etc/redis/redis.conf # 节点3 redis-3: #容器服务名 container_name: redis-3 #基础镜像 image: redis #网络 host模式 和宿主机公用 以便集群之中的其他机器互相通信 network_mode: "host" #端口映射 #第一个端口是客户端通信端口 第二个端口为集群总线端口 用于失败检测以及故障转移、选举等 偏移量总是10000 ports: - 6383:6383 - 16383:16383 #映射宿主机的数据卷 配置目录 volumes: - /usr/docker/redis-cluster/redis-6383/data:/data - /usr/docker/redis-cluster/redis-6383/redis.conf:/etc/redis/redis.conf # 设置服务默认的启动程序 entrypoint: - redis-server - /etc/redis/redis.conf # 节点4 redis-4: #容器服务名 container_name: redis-4 #基础镜像 image: redis #网络 host模式 和宿主机公用 以便集群之中的其他机器互相通信 network_mode: "host" #端口映射 #第一个端口是客户端通信端口 第二个端口为集群总线端口 用于失败检测以及故障转移、选举等 偏移量总是10000 ports: - 6384:6384 - 16384:16384 #映射宿主机的数据卷 配置目录 volumes: - /usr/docker/redis-cluster/redis-6384/data:/redis/data - /usr/docker/redis-cluster/redis-6384/redis.conf:/etc/redis/redis.conf # 设置服务默认的启动程序 entrypoint: - redis-server - /etc/redis/redis.conf # 节点5 redis-5: #容器服务名 container_name: redis-5 #基础镜像 image: redis #网络 host模式 和宿主机公用 以便集群之中的其他机器互相通信 network_mode: "host" #端口映射 #第一个端口是客户端通信端口 第二个端口为集群总线端口 用于失败检测以及故障转移、选举等 偏移量总是10000 ports: - 6385:6385 - 16385:16385 #映射宿主机的数据卷 配置目录 volumes: - /usr/docker/redis-cluster/redis-6385/data:/redis/data - /usr/docker/redis-cluster/redis-6385/redis.conf:/etc/redis/redis.conf # 设置服务默认的启动程序 entrypoint: - redis-server - /etc/redis/redis.conf # 节点6 redis-6: #容器服务名 container_name: redis-6 #基础镜像 image: redis #网络 host模式 和宿主机公用 以便集群之中的其他机器互相通信 network_mode: "host" #端口映射 #第一个端口是客户端通信端口 第二个端口为集群总线端口 用于失败检测以及故障转移、选举等 偏移量总是10000 ports: - 6386:6386 - 16386:16386 #映射宿主机的数据卷 配置目录 volumes: - /usr/docker/redis-cluster/redis-6386/data:/redis/data - /usr/docker/redis-cluster/redis-6386/redis.conf:/etc/redis/redis.conf # 设置服务默认的启动程序 entrypoint: - redis-server - /etc/redis/redis.conf
集群模式的redis.conf除了要改单机的几个配置外(端口、本地访问保护) 还需要修改集群配置。
#把这一行的#注掉 表示支持集群 cluster-enabled yes #集群配置文件(启动时自动生成) cluster-config-file nodes_xxx.conf
同时需要配置网络 如果不配置的话默认时bridge模式 容器之间不能互相通信,无法做集群。
在这里我是把网络配置成host模式:network_mode: “host” 即容器和宿主机共享同一个网络,这样容器与容器之间就可以互相通信,详见上面配置文件。
配置好之后通过docker-compose up -d执行
6个节点能启动成功了 这个时候随便进入一个节点开启集群模式
redis-cli --cluster create 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385 127.0.0.1:6386 --cluster-replicas 1
可以看到开启集群模式后默认分配了主从服务器 选yes接受该配置
这时候主从服务器都加入到集群中去了 到这里集群就已经搭建好了
四、验证redis集群
首先进入其中某一个节点
redis-cli -c -h 127.0.0.1 -p 6381
连接到redis之后可以通过cluster-nodes显示集群节点分布情况
可以看到三主三从
redis6381节点 set值之后根据hash环分布 数据落在6382节点上
五、相关代码及配置文件
传送门———————————-//github.com/DreamsChaser/docker
六、问题汇总
问题1
ERROR: for redis-master-1 Cannot start service redis-master-1: OCI runtime create failed: container_linux.go:349:
starting container process caused "exec: \"redis-server /etc/redis/redis.conf\": stat redis-server /etc/redis/redis.conf: no such file or directory": unknown
这种情况会好多种原因 可能是因为配置文件映射路径有问题导致
我这出现的情况是因为我在写 容器启动的命令entrypoint时没有按照yml的文件格式导致不识别所致
问题2
Node 127.0.0.1:6381 is not configured as a cluster node
未开启集群模式,需要在redis.conf里开启,具体见上面redis.conf配置