如何在Docker环境中通过docker-compose创建Redis Cluster及选用适配镜像
用Docker Compose搭建Redis Cluster集群(支持主从复制)
Hey there! 要搭建支持主从复制的Redis Cluster,完全不用折腾自定义镜像——官方的redis镜像就自带了集群所需的所有工具和配置支持,直接用它就行。下面给你一套完整的实操方案,一步到位搞定集群搭建。
第一步:编写docker-compose.yml配置文件
我们用6个节点来搭建标准的3主3从集群(Redis Cluster至少需要3个主节点,搭配从节点实现高可用)。创建一个docker-compose.yml文件,内容如下:
version: '3.8' services: redis-node-1: image: redis:7.2 # 生产环境建议指定具体版本,避免镜像更新带来的兼容问题 container_name: redis-node-1 ports: - "7001:6379" # 客户端连接端口 - "17001:16379" # 集群节点间通信端口 volumes: - ./redis-data/node-1:/data # 持久化数据目录 command: redis-server --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes networks: - redis-cluster-net redis-node-2: image: redis:7.2 container_name: redis-node-2 ports: - "7002:6379" - "17002:16379" volumes: - ./redis-data/node-2:/data command: redis-server --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes networks: - redis-cluster-net redis-node-3: image: redis:7.2 container_name: redis-node-3 ports: - "7003:6379" - "17003:16379" volumes: - ./redis-data/node-3:/data command: redis-server --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes networks: - redis-cluster-net redis-node-4: image: redis:7.2 container_name: redis-node-4 ports: - "7004:6379" - "17004:16379" volumes: - ./redis-data/node-4:/data command: redis-server --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes networks: - redis-cluster-net redis-node-5: image: redis:7.2 container_name: redis-node-5 ports: - "7005:6379" - "17005:16379" volumes: - ./redis-data/node-5:/data command: redis-server --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes networks: - redis-cluster-net redis-node-6: image: redis:7.2 container_name: redis-node-6 ports: - "7006:6379" - "17006:16379" volumes: - ./redis-data/node-6:/data command: redis-server --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes networks: - redis-cluster-net networks: redis-cluster-net: driver: bridge
配置参数说明
--cluster-enabled yes:开启Redis集群模式--cluster-config-file nodes.conf:集群节点的元数据存储文件,自动生成--cluster-node-timeout 5000:节点超时时间(毫秒),超时后会触发故障转移--appendonly yes:开启AOF持久化,避免容器重启后数据丢失
第二步:启动Redis节点
先创建数据目录并设置权限(避免Redis进程无法读写):
mkdir -p ./redis-data/node-{1..6} && chmod -R 777 ./redis-data
然后启动所有容器:
docker-compose up -d
用docker-compose ps检查所有节点是否正常运行。
第三步:初始化Redis Cluster
进入任意一个节点(比如redis-node-1),用内置的redis-cli执行集群初始化命令:
docker exec -it redis-node-1 redis-cli --cluster create \ redis-node-1:6379 redis-node-2:6379 redis-node-3:6379 \ redis-node-4:6379 redis-node-5:6379 redis-node-6:6379 \ --cluster-replicas 1
--cluster-replicas 1表示每个主节点对应1个从节点,命令执行后会自动分配3主3从的架构- 终端会提示你确认集群配置,输入
yes即可完成初始化
第四步:验证集群状态
进入任意节点的集群模式客户端:
docker exec -it redis-node-1 redis-cli -c
执行以下命令验证:
# 查看集群整体状态 127.0.0.1:6379> cluster info # 查看所有节点的主从关系 127.0.0.1:6379> cluster nodes
如果看到cluster_state:ok,就说明集群已经正常运行了。
主从复制与高可用说明
- 初始化时,节点4、5、6会自动成为节点1、2、3的从节点,同步主节点的数据
- 当某个主节点故障时,集群会自动从对应的从节点中选举新的主节点,实现无感知故障转移
- 你也可以手动调整主从关系,比如在从节点执行
cluster replicate <主节点ID>
内容的提问来源于stack exchange,提问作者Anshuman Bardhan




