【发布时间】:2019-06-23 08:58:47
【问题描述】:
我在 docker 容器中运行 redis,并且正在使用 redis 哨兵模式。 我已经设置了以下配置 -
3 redis sentinels nodes
1 redis master node
2 redis slave nodes
我在我的本地机器上运行所有这些。因此,总共有 6 个 docker 容器在桥接网络模式下通过 docker-compose 运行。
所有容器都有到外部的端口映射。
所有容器都可以相互访问,因为它们位于docker-compose up 运行期间创建的同一个桥接 docker 网络中。
我创建了一个使用 Redisson 库来访问 redis 的 Java 客户端。 配置客户端使用redis-sentinel模式如下 -
Config config = new Config();
config.useSentinelServers()
.setMasterName("redis-master")
.addSentinelAddress("redis://127.0.0.1:26379")
.addSentinelAddress("redis://127.0.0.1:26380")
.addSentinelAddress("redis://127.0.0.1:26381")
RedissonClient client = Redisson.create(config);
这就是我面临的问题。 每当我尝试通过这个客户端在 redis 上运行一些命令时,请求都会通过哨兵节点,这给了我当前的 redis 主节点地址。 但是我的 java 客户端无法直接与 redis master 通信,因为 sentinel 节点返回的 ip 是主节点的内部 docker 网络 ip,它在 docker 网络之外无法访问,并且它失败并出现如下类似的异常 -
Exception in thread "main" org.redisson.client.RedisConnectionException: Unable to connect to Redis server: 172.21.0.2/172.21.0.2:6379
at org.redisson.connection.pool.ConnectionPool$2$1.operationComplete(ConnectionPool.java:161)
at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511)
如何解决这个问题? 我需要在一些不同的网络模式下运行它吗? 或者以某种方式将此内部 docker ip 转换为运行 docker conatiners 的机器的实际 ip?
【问题讨论】:
标签: docker redis docker-compose redisson