Docker容器部署Redis集群时CLUSTER MEET失败问题求助
解决MacOS Docker部署Redis集群的节点通信与外部访问问题
问题根源
核心矛盾在于Redis集群的节点间通信依赖集群总线端口(如17001-17003),同时外部服务(如Redisson)需要访问集群的业务端口:
- 用本机内网IP/
host.docker.internal启动节点时,容器间通过该IP访问总线端口可能被MacOS防火墙或Docker端口转发规则拦截,导致CLUSTER MEET超时。 - 用Docker内网IP创建集群时,集群节点会向客户端返回内部IP,而本机无法直接访问Docker内网网段,导致Redisson连接失败。
方案一:统一用本机内网IP部署(推荐)
此方案让容器间和外部服务都使用本机内网IP通信,无需额外配置客户端。
1. 修改容器启动命令
将--cluster-announce-ip设为你的本机内网IP(如192.168.2.11),确保所有节点参数对应更新:
# 启动redis-7001 docker run -d --rm \ --name redis-7001 \ -e ALLOW_EMPTY_PASSWORD=yes \ --net redis-cluster \ -p 7001:6379 -p 17001:17001 \ -v ~/LuckyrhinoStudios/docker/redis_cluster/7001:/data redis \ redis-server --port 6379 \ --cluster-enabled yes \ --cluster-config-file /data/nodes.conf \ --cluster-node-timeout 5000 \ --appendonly yes \ --protected-mode no \ --bind 0.0.0.0 \ --cluster-announce-ip 192.168.2.11 \ --cluster-announce-port 7001 \ --cluster-announce-bus-port 17001 # 同理启动redis-7002、redis-7003,替换端口、目录和容器名
2. 创建集群
直接使用本机内网IP执行集群创建命令:
docker exec -it redis-7001 redis-cli --cluster create \ 192.168.2.11:7001 192.168.2.11:7002 192.168.2.11:7003 \ --cluster-replicas 0 --verbose
3. Redisson配置
直接用本机内网IP+映射端口配置即可:
clusterServersConfig: nodeAddresses: - "redis://192.168.2.11:7001" - "redis://192.168.2.11:7002" - "redis://192.168.2.11:7003"
方案二:Docker内网IP集群+Redisson强制自定义端口
如果必须用Docker内网IP创建集群,可通过Redisson配置强制使用外部映射端口。
1. 启动容器(用Docker内网IP)
指定容器的Docker内网IP,集群宣告信息用内部IP和端口:
# 先创建带子网的Docker网络(可选,方便固定IP) docker network create --subnet=172.18.0.0/16 redis-cluster # 启动redis-7001 docker run -d --rm \ --name redis-7001 \ --net redis-cluster \ --ip 172.18.0.2 \ -e ALLOW_EMPTY_PASSWORD=yes \ -p 7001:6379 -p 17001:17001 \ -v ~/LuckyrhinoStudios/docker/redis_cluster/7001:/data redis \ redis-server --port 6379 \ --cluster-enabled yes \ --cluster-config-file /data/nodes.conf \ --cluster-node-timeout 5000 \ --appendonly yes \ --protected-mode no \ --bind 0.0.0.0 \ --cluster-announce-ip 172.18.0.2 \ --cluster-announce-port 6379 \ --cluster-announce-bus-port 17001 # 同理启动redis-7002、redis-7003,替换IP、端口和容器名
2. 创建集群
用Docker内网IP或容器别名执行创建命令:
docker exec -it redis-7001 redis-cli --cluster create \ 172.18.0.2:6379 172.18.0.3:6379 172.18.0.4:6379 \ --cluster-replicas 0 --verbose
3. Redisson关键配置
添加useClusterHostPort: true参数,强制Redisson使用你配置的外部端口,忽略集群返回的内部端口:
clusterServersConfig: nodeAddresses: - "redis://192.168.2.11:7001" - "redis://192.168.2.11:7002" - "redis://192.168.2.11:7003" useClusterHostPort: true # 核心:禁用集群节点返回的端口,使用自定义端口
内容的提问来源于stack exchange,提问作者Shvalb
相关产品推荐
相关产品推荐

