如何从Flask应用连接容器中的Redis?连接被拒问题排查
解决Flask应用无法连接host网络Redis容器的问题
以下是针对该问题的排查和解决步骤:
1. 替换Redis连接地址为localhost/127.0.0.1
终端代码使用公网IP 128.224.2.97 能正常连接,但Flask应用可能因网络路由、环境限制等原因无法访问该公网IP。由于Redis容器使用了--network host,直接连接回环地址更可靠:
import redis # 替换为localhost或127.0.0.1 r = redis.Redis(host="localhost", port=6397) r.hgetall('1')
2. 确认Redis容器的绑定地址和端口
进入Redis容器,检查Redis是否绑定了所有网络接口,以及实际运行端口:
# 进入容器 docker exec -it redis bash # 查看绑定地址 redis-cli CONFIG GET bind # 查看运行端口 redis-cli info server | grep tcp_port
如果bind返回的是127.0.0.1,说明Redis仅允许本地回环访问,需要重启容器时指定绑定所有接口:
docker stop redis docker rm redis docker run --name redis --network host -d redis redis-server --bind 0.0.0.0 --port 6397
3. 检查Flask运行环境的网络连通性
在Flask应用中添加临时测试路由,验证是否能访问Redis端口:
from flask import Flask import socket app = Flask(__name__) @app.route('/test-redis') def test_redis_connectivity(): try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 替换为你的Redis地址和端口 result = sock.connect_ex(('128.224.2.97', 6397)) if result == 0: return "Redis端口可访问" else: return f"Redis端口不可访问,错误码: {result}" except Exception as e: return f"连接测试失败: {str(e)}" if __name__ == '__main__': app.run(debug=True)
启动Flask后访问http://localhost:5000/test-redis,根据返回结果判断网络是否通畅。
4. 排查防火墙限制
Ubuntu的UFW防火墙可能阻止了Flask应用访问Redis端口,临时关闭防火墙测试:
sudo ufw disable
如果关闭后Flask能正常连接,说明需要添加防火墙规则允许访问6397端口:
sudo ufw allow 6397/tcp sudo ufw enable
5. 对齐虚拟环境与终端的Redis客户端版本
检查终端和Flask虚拟环境中的Redis客户端版本是否一致,版本差异可能导致连接问题:
# 终端中查看版本 pip show redis # Flask虚拟环境中查看版本 source /home/ssharma3/.local/share/virtualenvs/cos-dir-QPdremXL/bin/activate pip show redis
如果版本不一致,升级虚拟环境中的Redis包:
pip install --upgrade redis
内容的提问来源于stack exchange,提问作者SSB
相关产品推荐
相关产品推荐

