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,目标是将所有节点暴露至本地网络
异常现象
容器内部运行正常,但本地网络其他机器连接时出现以下问题:
- Python脚本可成功连接Sentinel,但返回的主从节点地址均为Docker内网IP(如172.18.3.1)
- 通过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
验证方法
- 在本地网络其他机器上,执行
telnet 192.168.2.90 6379,输入INFO replication,确认返回的slaveX字段的ip为192.168.2.90,端口为对应的映射端口 - 运行Python测试脚本,检查获取到的主从节点地址是否为192.168.2.90和对应端口
内容的提问来源于stack exchange,提问作者Shaun
相关产品推荐
相关产品推荐

