java - 无法从我的电脑连接到 docker 中的 redis sentinal
问题描述
我在 docker 中使用哨兵运行 redis,但我无法使用哨兵连接到我的 redis。这是我的 docker-compose 文件:
version: '3'
networks:
app-tier:
driver: bridge
services:
redis:
image: 'bitnami/redis:latest'
environment:
- REDIS_REPLICATION_MODE=master
- REDIS_PASSWORD=str0ng_passw0rd
networks:
- app-tier
ports:
- '6379'
redis-slave:
image: 'bitnami/redis:latest'
environment:
- REDIS_REPLICATION_MODE=slave
- REDIS_MASTER_HOST=redis
- REDIS_MASTER_PASSWORD=str0ng_passw0rd
- REDIS_PASSWORD=str0ng_passw0rd
ports:
- '6379'
depends_on:
- redis
networks:
- app-tier
redis-sentinel:
image: 'bitnami/redis-sentinel:latest'
environment:
- REDIS_MASTER_HOST=redis
- REDIS_MASTER_PASSWORD=str0ng_passw0rd
depends_on:
- redis
- redis-slave
ports:
- '26379:26379'
networks:
- app-tier
我可以看到我的 sentinetl 已启动并正在运行,并且可以访问 master 和 slave:
docker exec redis-image_redis-sentinel_1 redis-cli -p 26379 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.23.0.2:6379,slaves=1,sentinels=1
但是,当我从 Java 的 docker 网络外部的本地 PC 访问 redis 时,我得到了以下输出:
redis.clients.jedis.JedisSentinelPool initSentinels
INFO: Trying to find master from available Sentinels...
redis.clients.jedis.JedisSentinelPool initSentinels
INFO: Redis master running at 172.23.0.2:6379, starting Sentinel listeners...
redis.clients.jedis.JedisSentinelPool initPool
INFO: Created JedisPool to master at 172.23.0.2:6379
from master
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
at redis.clients.util.Pool.getResource(Pool.java:53)
at redis.clients.jedis.JedisSentinelPool.getResource(JedisSentinelPool.java:209)
at Main.main(Main.java:22)
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out
at redis.clients.jedis.Connection.connect(Connection.java:164)
at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:80)
at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1677)
at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:87)
at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:868)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:435)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363)
at redis.clients.util.Pool.getResource(Pool.java:49)
... 2 more
Caused by: java.net.SocketTimeoutException: connect timed out
at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399)
at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242)
at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.base/java.net.Socket.connect(Socket.java:608)
at redis.clients.jedis.Connection.connect(Connection.java:158)
... 9 more
看起来我正在获取内部 docker 网络 IP (172.23.0.2:6379),但我无法连接到实例。
我无法找到解决方案如何使用 docker 外部的哨兵连接到 redis。
谢谢
解决方案
我不知道你是否还有这个问题,但它看起来是由于你的“redis”和“redis-slave”容器上的端口绑定。
如果您使用单个端口号(例如 - 6379
),Docker 会将该容器上的端口绑定到主机上的随机端口。如果您将其更改为类似 - 6379:6379
的内容,它将创建所需的端口绑定。
您可以通过运行docker container ls
并检查“端口”列中的值来测试它。
推荐阅读
- r - 在 R Studio 中自定义制图输出的困难
- c++ - 带有嵌套模板参数的 std::vector
- sharepoint - 如何在基于 SharePoint 的流中修复“拒绝访问 - 错误 403”
- tensorflow - 使用 macOS 安装 tfjs-node 时失败,并且 node-gyp 重建失败
- reactjs - React - 操作 DOM 还是使用状态?
- android - 离子时间选择无法显示 Android 的 AM / PM
- python - 如何在使用 plotly 进行子图绘制时隐藏 x 轴值
- git - git apply patch 不起作用:没有这样的文件或目录
- python - 如何通过每次可以更改的索引删除列表的多个元素?
- java - 如何将本机内存复制到 DirectByteBuffer