使用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
相关产品推荐
相关产品推荐

