公司网站改版需要怎么做,化妆品网站内容规划,新能源电动汽车价格,商城网站开发价格在使用单机 Docker 部署 Redis Sentinel 后#xff0c; Python 调用报 MasterNotFoundError TimeoutError#xff0c;核心原因是Docker 网络配置问题#xff08;容器端口未映射/IP 访问不到#xff09;或 Sentinel 配置错误#xff08;监控的主节点是容器内部 IP#xf…在使用单机 Docker 部署 Redis Sentinel 后 Python 调用报MasterNotFoundError TimeoutError核心原因是Docker 网络配置问题容器端口未映射/IP 访问不到或Sentinel 配置错误监控的主节点是容器内部 IPPython 无法解析。以下是针对「单机 Docker 部署」的专属排查和解决方案先明确单机 Docker 部署的典型架构单机部署时通常会启动 3 个容器1 个 Redis 主节点、1 个 Redis 从节点、3 个 Sentinel 节点或至少 1 个但所有容器都运行在同一台宿主机上需通过「宿主机 IP 映射端口」访问而非容器内部 IP。步骤1检查 Docker 容器端口映射最核心1.1 查看容器端口映射情况执行docker ps查看 Redis 主/从、Sentinel 容器的端口映射示例正常输出CONTAINER ID IMAGE COMMAND PORTS NAMES xxx redis:sentinel redis-sentinel /etc/… 0.0.0.0:26380-26379/tcp sentinel1 xxx redis:sentinel redis-sentinel /etc/… 0.0.0.0:26381-26379/tcp sentinel2 xxx redis:sentinel redis-sentinel /etc/… 0.0.0.0:26382-26379/tcp sentinel3 xxx redis docker-entrypoint.s… 0.0.0.0:6379-6379/tcp redis-master xxx redis docker-entrypoint.s… 0.0.0.0:6380-6379/tcp redis-slave✅ 关键Sentinel 容器的PORTS列必须是0.0.0.0:宿主机端口-26379/tcp如26380-26379Redis 主节点是6379-6379。❌ 常见错误容器未映射端口PORTS列为空Python 无法访问容器映射端口冲突多个容器映射同一端口导致端口被占用连接超时。1.2 修复端口映射重新启动容器若端口未映射删除旧容器后重新启动以 Sentinel 为例# 停止并删除旧Sentinel容器docker stop sentinel1 sentinel2 sentinel3 dockerrmsentinel1 sentinel2 sentinel3# 启动Sentinel容器映射端口到宿主机26380/26381/26382# 注意--networkhost 可选单机推荐直接使用宿主机网络无需端口映射docker run -d --name sentinel1 -p26380:26379 redis:sentinel docker run -d --name sentinel2 -p26381:26379 redis:sentinel docker run -d --name sentinel3 -p26382:26379 redis:sentinel# 启动Redis主节点映射6379端口docker run -d --name redis-master -p6379:6379 redis --requirepassyourpassword步骤2修正 Sentinel 配置核心坑监控的主节点是容器 IP单机 Docker 部署时Sentinel 默认会监控「容器内部 IP:6379」但 Python 运行在宿主机或另一容器无法访问容器内部 IP导致 Sentinel 虽然能识别主节点但 Python 从 Sentinel 获取到的主节点 IP 不可达。2.1 进入 Sentinel 容器修改配置# 进入任意Sentinel容器dockerexec-it sentinel1 /bin/bash# 编辑sentinel.conf默认路径/etc/redis/sentinel.confvi/etc/redis/sentinel.conf2.2 修改核心配置关键# 原配置错误监控容器内部IP # sentinel monitor mymaster 172.17.0.2 6379 2 # 新配置监控宿主机IP 映射端口 sentinel monitor mymaster 宿主机IP 6379 2 # 若Redis主节点有密码添加 sentinel auth-pass mymaster yourpassword # 启用hostname解析可选 sentinel resolve-hostnames yes sentinel announce-ip 宿主机IP # 告诉客户端用宿主机IP连接主节点 sentinel announce-port 6379 # 主节点映射端口✅ 宿主机 IP 查看执行ifconfig/ip addr取非127.0.0.1的内网 IP如192.168.1.100。2.3 重启所有 Sentinel 容器docker restart sentinel1 sentinel2 sentinel3步骤3修正 Python 代码连接宿主机 IP 映射端口错误代码连容器内部 IP必超时fromredis.sentinelimportSentinel# 错误172.24.0.7是容器内部IPPython访问不到sentinelSentinel([(172.24.0.7,26380),(172.24.0.6,26381),(172.24.0.5,26382)],socket_timeout3)正确代码连宿主机 IP 映射端口fromredis.sentinelimportSentinel# 核心Sentinel地址是「宿主机IP 容器映射的端口」sentinelSentinel([(宿主机IP,26380),# 对应sentinel1的映射端口26380(宿主机IP,26381),# sentinel2(宿主机IP,26382)# sentinel3],socket_timeout3.0,# 延长超时时间socket_connect_timeout3.0,retry_on_timeoutTrue,# 超时重试passwordSentinel密码若有# 若Sentinel配置了requirepass才加)# 获取主节点注意主节点密码是Redis的密码不是Sentinel的try:mastersentinel.master_for(mymaster,passwordyourpassword,# Redis主节点的密码retry_on_timeoutTrue)print(连接成功,master.ping())master.set(test,docker redis sentinel)print(取值,master.get(test))exceptExceptionase:print(错误详情,e)步骤4验证连通性单机环境快速测试4.1 宿主机测试 Sentinel 连接# 用redis-cli连接宿主机的Sentinel端口redis-cli -h 宿主机IP -p26380# 执行命令查看是否能识别主节点127.0.0.1:26380sentinel master mymaster# 输出中检查# - ip宿主机IP不是容器IP# - port6379# - statusok4.2 测试 Python 代码运行修正后的 Python 代码若输出连接成功True则正常。单机 Docker 部署的额外避坑点使用 Docker Network 桥接模式若不想映射端口可创建自定义网络让 Python 容器若 Python 也在 Docker 中和 Redis/Sentinel 容器在同一网络# 创建自定义网络docker network create redis-net# 启动容器时指定--networkredis-netdocker run -d --name redis-master --networkredis-net redis docker run -d --name sentinel1 --networkredis-net redis:sentinel# Python容器也加入同一网络此时可通过容器名访问如sentinel1:26379Redis 保护模式若 Redis 主节点未设置密码需关闭保护模式否则拒绝外部连接docker run -d --name redis-master -p6379:6379 redis --protected-mode no端口冲突单机部署时确保 26380/26381/26382/6379 端口未被其他进程占用# 检查端口占用netstat-tulpn|grep26380netstat-tulpn|grep6379最终总结单机 Docker 核心要点所有容器必须映射端口到宿主机或加入同一 Docker 网络Sentinel 配置中监控的主节点必须是「宿主机 IP 映射端口」而非容器内部 IPPython 代码必须连接「宿主机 IP 容器映射的 Sentinel 端口」而非容器内部 IP延长超时时间 开启重试适配单机 Docker 的网络延迟。按以上步骤操作后99% 的单机 Docker 环境下MasterNotFoundError TimeoutError都会解决。