一、结论
Windows + WSL2 + Docker(Linux 容器)的场景,
因此:
--net=host绑定的是 WSL2 的 Linux 网络栈,而不是 Windows 主机的 172.18.53.x
这就是为什么:
-
Redis 日志显示:
Ready to accept connections -
但:
ss -lntp | grep 7000没有任何输出
-
Windows 上:
telnet 172.18.53.x 7000 → 失败
👉 这是 WSL2 网络模型导致的"必然结果",不是 Redis 配置错误。
二、关键证据(你已经无意中暴露了)
这一行信息非常关键:
root@DESKTOP-6OOV0C7:/data/redis/cluster#
DESKTOP-xxxx = Windows 主机名
这说明:
-
Redis 实际运行在 WSL2 Linux 虚拟机
-
Docker 的
--net=host:-
只对 WSL2 内部的 Linux 网络生效
-
不会绑定 Windows 的物理网卡 IP
-
三、WSL2 网络模型(这是问题根源)
WSL2 是什么?
一个轻量级虚拟机
网络关系是:
Windows (172.18.53.x)
↑ NAT
WSL2 Linux (172.30.x.x)
↑
Docker container (--net=host)
所以:
| 以为的 | 实际发生的 |
|---|---|
| Redis 监听 172.18.53.x | Redis 监听 WSL2 的 IP |
| host 网络 = Windows host | host 网络 = WSL2 VM |
| Windows 可直连 | Windows 不能直连 |
四、为什么 ss -lntp | grep 7000 没输出?
Redis 日志里这行:
* Running mode=cluster, port=7000. * Ready to accept connections
说明:
-
Redis 确实启动了
-
但它监听的是 WSL2 的某个 IP
-
而你执行
ss的环境 不是 Redis 实际监听的网络命名空间
在 WSL2 中,Redis 很可能监听的是:
127.0.0.1:7000 或 172.30.x.x:7000
但你尝试连接的是:
172.18.53.x (Windows IP)
→ 两个世界
五、为什么这件事在 WSL2 下"无解"
❌ 在 WSL2 中,你无法做到:
-
Docker
--net=host -
Redis Cluster
-
Windows 直接通过物理 IP 访问
-
并且地址还能正确 announce
这四个条件不能同时成立。
Redis Cluster 的前提是:
客户端和节点在同一套地址体系中
WSL2 + Windows 天生违背这个前提。
六、可行的解决方案(按现实可用性排序)
✅ 方案一(强烈推荐,生产级):不用 WSL2
如果你是认真要跑 Redis Cluster(尤其给 Spring Boot 用):
-
用 纯 Linux 物理机 / 云服务器
-
或 Linux 虚拟机
-
Docker +
--net=host
👉 这是 唯一与 Redis Cluster 设计完全一致的方式
七、为什么"配置全对但还是不通"
因为:
Redis Cluster 的"网络假设" vs WSL2 的"虚拟化网络"冲突
这不是配置细节问题,是架构层面的不兼容。