我有一个 Flask 应用程序在我的 Ubuntu 桌面上运行(作为更详细开发的第一阶段)。我在容器(官方
redis
docker 镜像)中运行 Redis,我创建的容器如下:
docker run --name redis --network host -d redis
现在,当我在桌面上的终端中运行 Python 时,
import redis
,并运行常用命令,我能够完美地连接到 Redis 并执行所需的操作。
import redis
r=redis.Redis(host="128.224.2.97",port=6397)
r.hgetall('1')
但是,当我在 Flask 应用程序中使用完全相同的命令执行相同操作时,我收到如下连接错误:
Traceback (most recent call last):
File "/home/ssharma3/.local/share/virtualenvs/cos-dir-QPdremXL/lib/python3.8/site-packages/redis/connection.py", line 276, in connect
sock = self.retry.call_with_retry(
File "/home/ssharma3/.local/share/virtualenvs/cos-dir-QPdremXL/lib/python3.8/site-packages/redis/retry.py", line 46, in call_with_retry
return do()
File "/home/ssharma3/.local/share/virtualenvs/cos-dir-QPdremXL/lib/python3.8/site-packages/redis/connection.py", line 277, in <lambda>
lambda: self._connect(), lambda error: self.disconnect(error)
File "/home/ssharma3/.local/share/virtualenvs/cos-dir-QPdremXL/lib/python3.8/site-packages/redis/connection.py", line 639, in _connect
raise err
File "/home/ssharma3/.local/share/virtualenvs/cos-dir-QPdremXL/lib/python3.8/site-packages/redis/connection.py", line 627, in _connect
sock.connect(socket_address)
ConnectionRefusedError: [Errno 111] Connection refused
处理这个问题的正确方法是什么?
连接应该成功了。
我建议使用 Docker Compose 堆栈而不是主机网络。
🗎
docker-compose.yml
version: '3.1'
services:
redis:
image: redis:latest
restart: always
container_name: redis
ports:
- '6379:6379'
flask:
container_name: flask
build:
context: .
depends_on:
- redis
🗎
Dockerfile
FROM python:3.11.4
COPY requirements.txt .
RUN pip3 install -r requirements.txt
COPY app.py .
CMD python3 app.py
🗎
requirements.txt
(根据需要更改版本并添加所需的任何其他 Python 包。)
redis==5.0.3
Flask==3.0.2
🗎
app.py
(一个简单的 Flask 应用程序。正如问题中提到的,这会连接到 Redis 并运行几个命令。仔细查看下面的屏幕截图,检查这些命令是否成功运行。使用 Docker Compose 的好处是当您连接到 Redis 服务时,您只需使用服务名称 redis
,无需担心显式 IP 地址。)
from flask import Flask
import redis
r = redis.Redis(host='redis', port=6379, db=0, decode_responses=True)
print("🚨 Check for connection to Redis:")
print(r.hgetall("1"))
r.set('test', '123')
print(r.get('test'))
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run(debug=False)