不知道有没有小伙伴跟我一样是使用的Docker镜像进行Redis集群案例模拟的(三台虚拟机确实带不动= =),然后我遇到了一个问题:Could not connect to Redis at 172.17.0.2:6379: Operation timed out
172.17.0.2是我其中一个Redis实例的IP和端口号,并且我用主机ping 172.17.0.2是可以ping通的
于是我又仔细翻了翻官网集群的相关内容,发现了如下一段
大致翻译下:
目前,Redis Cluster 不支持 NAT 环境以及一般 IP 地址或 TCP 端口重新映射的环境。
而Docker使用技术的就是端口映射:在Docker容器内运行的程序可能会使用与程序认为正在使用的端口不同的端口来公开。
在 Docker 容器内运行的程序可能会使用与程序认为正在使用的端口不同的端口来公开。这对于在同一服务器中同时使用相同端口运行多个容器非常有用。
为了让Docker兼容Redis Cluster,需要使用Docker的主机组网模式。请参阅Docker 文档--net=host中的选项以获取更多信息。
我们来Docker这里瞅瞅
https://docs.docker.com/network/https://docs.docker.com/network/
果然,发现了很关键的一句
容器是不会向外暴露任何端口的!
所以才会出现IP能ping通,但是加上端口后Operation timed out
当然,后面也提供了解决方法:启动容器时加--publish or -p
但是紧接着,官网也提出了这么操作并不安全,并建议如果想让一个容器可供其他容器访问,则无需发布该容器的端口。通过将容器连接到同一网络(通常是桥接网络)来启用容器间通信。
虽然提供了处理方法,但是个人还是建议直接按照官网的集群案例来进行集群搭建案例:
https://redis.io/docs/management/scaling/#create-a-redis-clusterhttps://redis.io/docs/management/scaling/#create-a-redis-cluster