零基础玩转Docker部署Redis集群:手把手操作指南
前置准备
在开始Docker部署Redis集群之前,请确保服务器满足以下条件:
- 已安装 Docker(版本 >= 19.03)和 docker-compose。
- 服务器开放以下端口(可根据实际调整):
- Redis节点端口:6379-6384(6个节点)
- 集群总线端口:16379-16384(每个节点端口+10000)
- 建议使用 Ubuntu 20.04+ 或 CentOS 7+ 操作系统。
- 磁盘空间充足(每个节点至少 100MB)。
- 已经配置好防火墙策略,允许内部节点通信。
小知识:Redis集群至少需要 6个节点(3主3从),Docker能快速创建这些容器。
分步操作
第一步:创建网络和目录
在宿主机上执行以下命令创建专用网络和目录:
docker network create redis-cluster-net
mkdir -p /data/redis-cluster/{node1,node2,node3,node4,node5,node6}第二步:编写 docker-compose.yml
在 /data/redis-cluster/ 目录下创建 docker-compose.yml 文件,内容如下:
version: '3'
services:
redis-node1:
image: redis:7.2
container_name: redis-node1
ports:
- "6379:6379"
- "16379:16379"
volumes:
- ./node1:/data
networks:
- redis-cluster-net
command:
redis-server --port 6379 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes
redis-node2:
image: redis:7.2
container_name: redis-node2
ports:
- "6380:6379"
- "16380:16379"
volumes:
- ./node2:/data
networks:
- redis-cluster-net
command:
redis-server --port 6379 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes
redis-node3:
image: redis:7.2
container_name: redis-node3
ports:
- "6381:6379"
- "16381:16379"
volumes:
- ./node3:/data
networks:
- redis-cluster-net
command:
redis-server --port 6379 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes
redis-node4:
image: redis:7.2
container_name: redis-node4
ports:
- "6382:6379"
- "16382:16379"
volumes:
- ./node4:/data
networks:
- redis-cluster-net
command:
redis-server --port 6379 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes
redis-node5:
image: redis:7.2
container_name: redis-node5
ports:
- "6383:6379"
- "16383:16379"
volumes:
- ./node5:/data
networks:
- redis-cluster-net
command:
redis-server --port 6379 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes
redis-node6:
image: redis:7.2
container_name: redis-node6
ports:
- "6384:6379"
- "16384:16379"
volumes:
- ./node6:/data
networks:
- redis-cluster-net
command:
redis-server --port 6379 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes
networks:
redis-cluster-net:
external: true
第三步:启动所有容器
进入目录并执行:
cd /data/redis-cluster
docker-compose up -d检查容器是否全部运行:
docker ps | grep redis-node应该看到6个容器全部为 Up 状态。
第四步:创建集群
选择一个容器作为操作节点(例如 redis-node1),进入容器并创建集群:
docker exec -it redis-node1 redis-cli --cluster create \
172.x.x.x:6379 172.x.x.x:6379 172.x.x.x:6379 172.x.x.x:6379 172.x.x.x:6379 172.x.x.x:6379 \
--cluster-replicas 1注意:将172.x.x.x替换为容器实际的IP地址。获取方式:docker inspect redis-node1 | grep "IPAddress"。或者直接使用容器名称(因为它们在同一个网络内)。推荐使用容器名称:redis-node1:6379 redis-node2:6379 ...。
命令示例(使用容器名称):
docker exec -it redis-node1 redis-cli --cluster create \
redis-node1:6379 redis-node2:6379 redis-node3:6379 \
redis-node4:6379 redis-node5:6379 redis-node6:6379 \
--cluster-replicas 1执行后,Redis会分配哈希槽,并自动设置主从关系。
出现确认提示时输入 yes。
第五步:验证集群状态
连接任意节点,使用 cluster info 和 cluster nodes 检查:
docker exec -it redis-node1 redis-cli -c -p 6379 cluster info
docker exec -it redis-node1 redis-cli -c -p 6379 cluster nodes看到 cluster_state:ok 表示集群部署成功。
避坑指南
- 端口冲突:宿主机上如果已经运行了Redis或其他服务占用了6379等端口,请在
docker-compose.yml中修改映射端口(如6380:6379改为6390:6379)。 - 容器无法互相通信:必须将所有容器加入到同一个自定义网络(如
redis-cluster-net),不要使用默认 bridge。 - 创建集群时IP错误:如果使用
--cluster create时 IP 填写错误,会导致集群创建失败。建议直接用容器名称,Docker会解析。 - 数据持久化:每个节点配置了
--appendonly yes,数据存放在挂载的宿主机目录。如果卷挂载权限问题,可以chown -R 999:999 /data/redis-cluster/*(Redis 容器用户 uid 为 999)。
高频问题解答
Q1:Docker部署Redis集群后,外部程序如何连接?
外部程序需要连接集群中的 任意一个节点,并使用集群模式驱动。
连接地址可以是宿主机的任意映射端口(例如 宿主机IP:6379)。
因为Redis集群会自动重定向。
Q2:如何增加节点或重新分片?
先添加新容器(参考上述步骤),然后使用 redis-cli --cluster add-node 和 --cluster reshard 命令。
详细可参考Redis官方文档。
Q3:为什么创建集群时提示“Node is not empty”?
每个Redis节点启动后,如果之前的数据目录中有旧的 nodes.conf 或 appendonly.aof,会导致冲突。
解决:清空对应的数据目录(如 /data/redis-cluster/node1/ 下的所有文件)再重启容器。
效果验证
执行以下命令写入测试数据:
docker exec -it redis-node1 redis-cli -c -p 6379 set mykey "Hello Redis Cluster"
docker exec -it redis-node1 redis-cli -c -p 6379 get mykey如果能正常写入和读取,说明Docker部署Redis集群已经成功运行。
另外,可以在任意节点执行 cluster nodes,看到有三主三从,且哈希槽分配均匀,没有 fail 状态,即完全正常。
如果你正在处理 Docker部署Redis集群,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。