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

使用docker-compose部署RedisDB时遇Recv failure问题求助

解决Redis + Docker Compose连接问题的步骤

Hey there, let's break down the issues in your setup and fix them one by one:

1. 端口映射配置错误

你的web服务端口映射明显不对:

ports:
  - "8081:6379"

这里你把主机的8081端口映射到了web容器的6379端口,但6379是Redis的专属端口,你的Python web应用肯定不是运行在这个端口上的。假设你的main.py里的web服务(比如Flask默认监听5000端口),那应该改成:

ports:
  - "8081:5000"

如果你的web服务用的是其他端口,把容器端的数值改成对应的就行。

2. Redis连接地址配置错误

在Docker Compose的默认桥接网络里,容器之间可以通过服务名称直接互相访问,所以你的REDIS_HOST不应该设为0.0.0.0——这个值是用来让服务监听本地所有地址的,不是用来连接外部服务的正确目标地址。应该改成Redis服务的名称redis:

environment:
  REDIS_HOST: redis
  REDIS_PORT: 6379
  REDIS_PASSWORD: ""

3. 修改后的完整docker-compose.yaml

version: '3'
services:
  redis:
    image: "redis:latest"
    ports:
      - "6379:6379"
  web:
    build: .
    ports:
      - "8081:5000"  # 容器端口需和你的web服务实际监听端口一致
    environment:
      REDIS_HOST: redis
      REDIS_PORT: 6379
      REDIS_PASSWORD: ""
    depends_on:
      - redis

4. 确保web应用正确适配配置

举个简单的Flask示例main.py,确保它监听正确端口,并且用环境变量连接Redis:

from flask import Flask, jsonify
import redis
import os

app = Flask(__name__)

# 从环境变量读取Redis配置
redis_host = os.getenv('REDIS_HOST', 'localhost')
redis_port = int(os.getenv('REDIS_PORT', 6379))
redis_password = os.getenv('REDIS_PASSWORD', '')

# 尝试连接Redis,增加容错
redis_conn = None
try:
    redis_conn = redis.Redis(host=redis_host, port=redis_port, password=redis_password, db=0)
    redis_conn.ping()
except Exception as e:
    print(f"Redis连接失败: {e}")

@app.route('/ping')
def ping():
    return 'pong'

@app.route('/redis-status')
def redis_status():
    if redis_conn and redis_conn.ping():
        return jsonify({"redis_connectivity": "OK"})
    else:
        return jsonify({"redis_connectivity": "FAILED"})

if __name__ == '__main__':
    # 监听0.0.0.0让容器外部可访问,端口和docker-compose配置对应
    app.run(host='0.0.0.0', port=5000)

同时确保requirements.txt包含必要依赖:

flask
redis

5. 重新部署测试

执行以下命令重启服务:

docker-compose down
docker-compose build
docker-compose up -d

然后测试接口:

curl -L http://localhost:8081/ping
# 预期返回: pong
curl -L http://localhost:8081/redis-status
# 预期返回: {"redis_connectivity": "OK"}

额外提示

depends_on仅保证Redis在web服务之前启动,但不保证Redis已经完全就绪。如果你的web应用启动时必须依赖可用的Redis,可以在代码里增加连接重试逻辑,或者给Redis服务添加健康检查配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:25:16