You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署Redis Sentinel返回容器内网IP,如何改为宿主机IP?

问题:Docker部署Redis主从+Sentinel后,外部机器获取内网IP无法正常连接

环境与部署背景

  • Docker宿主机静态IP:192.168.2.90
  • 本地网络:192.168.2.0/24,Docker内部网络:172.16.0.0/12
  • 通过Docker Compose部署3个Redis Server(映射端口6379、6380、6381)和3个Redis Sentinel,目标是将所有节点暴露至本地网络

异常现象

容器内部运行正常,但本地网络其他机器连接时出现以下问题:

  1. Python脚本可成功连接Sentinel,但返回的主从节点地址均为Docker内网IP(如172.18.3.1)
  2. 通过telnet连接主节点执行INFO命令,返回的从节点地址同样是Docker内网IP

相关返回信息

Redis master:
('172.18.3.1', 6379)

Redis slaves:
[('172.18.3.3', 6381), ('192.168.2.90', 6379),('172.18.3.2', 6380)]

role:master
connected_slaves:2
slave0:ip=172.18.3.3,port=6381,state=online,offset=252692195,lag=0
slave1:ip=172.18.3.2,port=6380,state=online,offset=252692195,lag=0

当前Redis Server容器配置

redis-a-1:
    container_name: redis-a-1
    hostname: redis-a-1
    image: redis
    command: "redis-server --port 6379 --bind-source-addr 192.168.2.90"    
    environment:
      - REDIS_HOST=192.168.2.90
    ports:
    - "6379:6379"
    restart: unless-stopped
    networks:
      blue-green-network:
        ipv4_address: 172.18.3.1

  redis-a-2:
    container_name: redis-a-2
    hostname: redis-a-2
    image: redis
    command: "redis-server --port 6380 --bind-source-addr 192.168.2.90 --slaveof 192.168.2.90 6379"        
    environment:
      - REDIS_HOST=192.168.2.90
    ports:
    - "6380:6380"
    restart: unless-stopped
    networks:
      blue-green-network:
        ipv4_address: 172.18.3.2

  redis-a-3:
    container_name: redis-a-3
    hostname: redis-a-3
    image: redis
    command: "redis-server --port 6381 --bind-source-addr 192.168.2.90 --slaveof 192.168.2.90 6379"        
    environment:
      - REDIS_HOST=192.168.2.90
    ports:
    - "6381:6381"
    restart: unless-stopped
    networks:
      blue-green-network:
        ipv4_address: 172.18.3.3  

解决方案

1. 修改Redis Server配置,指定对外暴露的IP和端口

Redis默认会返回容器内网IP给客户端和Sentinel,需要通过replica-announce-ip(Redis 5+版本,旧版本用slave-announce-ip)和replica-announce-port强制指定宿主机的公开IP和映射端口:

  • 主节点(redis-a-1)的command修改为:
redis-server --port 6379 --bind 0.0.0.0 --replica-announce-ip 192.168.2.90 --replica-announce-port 6379
  • 从节点(redis-a-2)的command修改为:
redis-server --port 6380 --bind 0.0.0.0 --slaveof 192.168.2.90 6379 --replica-announce-ip 192.168.2.90 --replica-announce-port 6380
  • 从节点(redis-a-3)的command修改为:
redis-server --port 6381 --bind 0.0.0.0 --slaveof 192.168.2.90 6379 --replica-announce-ip 192.168.2.90 --replica-announce-port 6381

说明:--bind 0.0.0.0允许容器接受所有来源的连接,replica-announce-ip和replica-announce-port让Redis对外返回宿主机的公开地址,而非容器内网地址。

2. 修改Redis Sentinel配置,确保返回公开地址

Sentinel同样需要配置公开地址,避免返回容器内网IP:

  • 在Sentinel的启动命令或配置文件中添加:
sentinel announce-ip 192.168.2.90
sentinel announce-port <Sentinel宿主机映射端口>
  • 同时,Sentinel监控主节点时要指定宿主机的公开地址:
sentinel monitor mymaster 192.168.2.90 6379 2

3. 重启容器生效

执行以下命令重启所有Redis和Sentinel容器:

docker-compose down && docker-compose up -d

验证方法

  1. 在本地网络其他机器上,执行telnet 192.168.2.90 6379,输入INFO replication,确认返回的slaveX字段的ip为192.168.2.90,端口为对应的映射端口
  2. 运行Python测试脚本,检查获取到的主从节点地址是否为192.168.2.90和对应端口

内容的提问来源于stack exchange,提问作者Shaun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 22:40:32