如何从 Flask 应用程序连接到容器中的 Redis?

问题描述 投票:0回答:1

我有一个 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 redis containers
1个回答
0
投票

我建议使用 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)

© www.soinside.com 2019 - 2024. All rights reserved.