本地PC无法连接Docker部署的Redis Sentinel服务问题求助
问题根因
你遇到的连接超时本质是Docker桥接网络的默认网段仅宿主机内部可达,Sentinel返回给客户端的Redis主从节点地址是Docker内部虚拟IP,外部主机无法路由到该地址导致连接失败。
解决方案(推荐:配置端口映射+节点通告地址)
该方案不需要修改网络模式,保留Docker的网络隔离能力,适合开发和生产环境使用。
1. 调整docker-compose.yml配置
你需要修改配置固定Redis主从的端口映射,同时通过bitnami镜像内置的环境变量配置节点的外部通告地址,示例配置如下:
version: '3' networks: app-tier: driver: bridge services: redis: image: 'bitnami/redis:latest' environment: - REDIS_REPLICATION_MODE=master - REDIS_PASSWORD=str0ng_passw0rd # 替换为你的Docker宿主机的外部可达IP,比如局域网IP/公网IP - REDIS_ANNOUNCE_IP=192.168.3.100 # 对外映射的Redis主节点端口 - REDIS_ANNOUNCE_PORT=6379 networks: - app-tier ports: # 固定端口映射,不要随机分配 - '6379: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 # 同样替换为宿主机外部可达IP - REDIS_ANNOUNCE_IP=192.168.3.100 # 对外映射的Redis从节点端口 - REDIS_ANNOUNCE_PORT=6380 ports: # 固定从节点端口映射 - '6380:6379' depends_on: - redis networks: - app-tier redis-sentinel: image: 'bitnami/redis-sentinel:latest' environment: - REDIS_MASTER_HOST=redis - REDIS_MASTER_PASSWORD=str0ng_passw0rd - REDIS_MASTER_SET=mymaster # 替换为宿主机外部可达IP - SENTINEL_ANNOUNCE_IP=192.168.3.100 # Sentinel对外映射的端口 - SENTINEL_ANNOUNCE_PORT=26379 depends_on: - redis - redis-slave ports: - '26379:26379' networks: - app-tier
2. 客户端配置调整
Java端JedisSentinelPool配置时,Sentinel地址填写宿主机IP+26379,同时配置对应的Redis密码即可,Sentinel会返回宿主机的可达地址给客户端,不再返回Docker内部IP。
替代方案(开发环境快速使用)
如果是本地开发调试使用,可以直接将所有服务的网络模式改为host,去掉端口映射配置和专属networks配置,容器会直接复用宿主机的网络栈,IP直接为宿主机IP,不会出现内部IP问题:
# 每个service下添加该配置 network_mode: "host"
内容的提问来源于stack exchange,提问作者rholdberh
相关产品推荐
相关产品推荐

