Docker部署Redis集群:保姆级教程,按步骤就能跑起来
前置准备
在开始 Docker部署Redis集群 之前,请确保满足以下条件:
- 一台Linux服务器:推荐 CentOS 7 或 Ubuntu 20.04+,已安装 Docker 和 docker-compose。
- 网络通畅:服务器能正常访问互联网,用于拉取 Redis 镜像。
- 端口规划:Redis 集群每个节点使用两个端口——主端口(如 6379)和集群总线端口(主端口+10000,如 16379)。本文采用6节点(3主3从),端口范围 6379~6384 和 16379~16384,请确保这些端口在防火墙中放行。
- 工作目录:创建统一目录
/data/redis-cluster,用于存放配置文件和持久化数据。
分步操作
1. 拉取 Redis 镜像
docker pull redis:7.0使用 Redis 7 稳定版,兼容集群特性。
2. 创建 Docker 网络
节点间需要相互通信,创建一个独立网络:
docker network create redis-cluster-net3. 准备节点配置和目录
为每个节点创建独立文件夹和配置:
mkdir -p /data/redis-cluster/node{1..6}/{conf,data}每个节点下的 redis.conf 内容示例(以 node1 为例,端口为 6379):
port 6379
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes注意:node2 的 port 改为 6380,以此类推到 6384。4. 编写 docker-compose.yml
在 /data/redis-cluster 下创建 docker-compose.yml,完整定义6个服务:
version: '3'
services:
redis-node1:
image: redis:7.0
container_name: redis-node1
ports:
- "6379:6379"
- "16379:16379"
volumes:
- ./node1/conf/redis.conf:/usr/local/etc/redis/redis.conf
- ./node1/data:/data
networks:
- redis-cluster-net
command:
["redis-server", "/usr/local/etc/redis/redis.conf"]
redis-node2:
image: redis:7.0
container_name: redis-node2
ports:
- "6380:6380"
- "16380:16380"
volumes:
- ./node2/conf/redis.conf:/usr/local/etc/redis/redis.conf
- ./node2/data:/data
networks:
- redis-cluster-net
command:
["redis-server", "/usr/local/etc/redis/redis.conf"]
… 类似定义 node3~node6,端口分别 6381~6384、16381~16384
networks:
redis-cluster-net:
external: true
5. 启动容器
cd /data/redis-cluster
docker-compose up -d检查所有容器是否正常运行:
docker-compose ps6. 初始化集群
进入任意节点容器(如 node1),使用 redis-cli --cluster create 命令:
docker exec -it redis-node1 redis-cli --cluster create \
redis-node1:6379 redis-node2:6380 redis-node3:6381 \
redis-node4:6382 redis-node5:6383 redis-node6:6384 \
--cluster-replicas 1参数--cluster-replicas 1表示每个主节点分配一个从节点,共3主3从。系统会自动分配槽位并打印计划,确认后输入yes。
避坑指南
- 端口冲突:确保宿主机的 6379~6384 和 16379~16384 未被占用。
- 网络不通:务必使用同一 Docker 网络,容器名解析依赖该网络。
- 配置文件权限:
redis.conf文件必须可读,数据目录可写。 - 数据残留:如果之前运行过集群,需要先清空
data目录下的持久化文件,否则初始化会报ERR Slot 0 is already busy。 - 容器重启策略:生产环境建议在
docker-compose.yml中添加restart: always。
效果验证
- 查看集群节点信息:
docker exec -it redis-node1 redis-cli -p 6379 cluster nodes输出应显示所有节点角色(master/slave)和槽位分配。
- 查看集群状态:
docker exec -it redis-node1 redis-cli -p 6379 cluster infocluster_state:ok 表示正常。
- 写入和读取测试:
docker exec -it redis-node1 redis-cli -c -p 6379 set foo bar
docker exec -it redis-node1 redis-cli -c -p 6379 get foo-c 启用集群模式,自动重定向到正确节点。
- 故障转移测试(可选):停掉一个主节点(如 node1),观察从节点是否自动晋升:
docker stop redis-node1
docker exec -it redis-node2 redis-cli -p 6380 cluster nodes可以看到原 node1 的从节点变成 master。
高频问题解答
Q1: 是否需要手动指定主从关系?
不需要,--cluster-replicas 1 自动分配。
Q2: 如何扩容节点?
使用 redis-cli --cluster add-node 添加新节点,然后执行 --cluster rebalance 重新分配槽位。
Q3: 数据持久化是否影响性能?
开启 AOF 或 RDB 会有 IO 开销,生产环境建议使用 SSD,并根据业务调整持久化策略。
Q4: 节点无法加入集群,提示 Connection refused?
检查端口映射、网络和防火墙。容器间必须能通过容器名相互 ping 通。
Q5: 如何彻底重置集群?
删除所有容器和持久化数据目录,重新执行步骤 4-6。
---
如果你正在处理 Docker部署Redis集群,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。