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

Docker化Flask+Redis缓存遇连接拒绝,求正确部署方案

问题描述

我有一个基于Flask和RedisCache的后端Web应用,计划将其Docker化后部署到AWS Lightsail,且希望保留已填充的缓存数据。目前已构建Docker容器,但运行时无法访问Redis实例,报错redis.exceptions.ConnectionError: Error 111 connecting to 0.0.0.0:6379. Connection refused,尽管Redis服务器已启动。请教正确的Docker化方案:Flask与Redis应放在同一容器还是分容器?

附相关代码文件:

Dockerfile

# Set base image (host OS)
FROM python:3.9-slim

# By default, listen on port 5000
EXPOSE 5001/tcp

# Set the working directory in the container
WORKDIR /server

# Copy the dependencies file to the working directory
COPY requirements.txt .

# Install any dependencies
RUN pip install -r requirements.txt

# Copy the content of the local src directory to the working directory
COPY flask-server.py .
COPY gpt.py .
COPY article_feed.py .
COPY credentials.py .

ENV PYTHONPATH /Back_end

# Specify the command to run on container start
CMD [ "python", "./flask-server.py" ]

docker-compose.yml

version: "3.9"
services:
  web:
    build: .
    ports:
      - "6379:6379"
  redis:
    image: "redis:latest"
    command: ["redis-server", "--bind", "redis", "--port", "6379"]

flask-server.py(核心部分)

cache = Cache(config={"CACHE_TYPE": "RedisCache",
                      "CACHE_REDIS_HOST": "0.0.0.0",
                      "CACHE_REDIS_PORT": 6379,
                      "CACHE_DEFAULT_TIMEOUT": -1})


def create_app():
    app = Flask(__name__)
    cache.init_app(app)

    # 各路由代码省略...

    if __name__ == "__main__":
        app.run(debug=True, host="0.0.0.0", port=5001)

create_app()

解决方案

1. 容器部署方案:必须分容器

按照Docker最佳实践,Flask应用和Redis服务应该分容器部署,原因如下:

  • 分离关注点:每个容器只负责单一服务,便于维护、更新和调试
  • 独立生命周期:Redis缓存可以单独重启或扩容,不影响Flask应用
  • 资源隔离:避免单一容器故障导致整个服务崩溃
  • 可复用性:Redis容器可以被其他服务复用

2. 解决Redis连接拒绝问题

报错的核心原因是网络配置错误,结合Docker Compose的网络机制调整如下:

修改Flask的Redis配置

在flask-server.py中,将Redis主机地址从0.0.0.0改为Docker Compose中Redis服务的名称redis(Docker Compose会自动为服务创建DNS别名):

cache = Cache(config={"CACHE_TYPE": "RedisCache",
                      "CACHE_REDIS_HOST": "redis",  # 替换为服务名
                      "CACHE_REDIS_PORT": 6379,
                      "CACHE_DEFAULT_TIMEOUT": -1})

修正Docker Compose配置

原配置存在端口映射错误,且缺少数据持久化配置,修改后的docker-compose.yml:

version: "3.9"
services:
  web:
    build: .
    ports:
      - "5001:5001"  # 正确映射Flask的运行端口
    depends_on:
      - redis  # 确保Redis服务先于Flask启动
    environment:
      - PYTHONPATH=/Back_end
  redis:
    image: "redis:latest"
    # 无需额外绑定参数,默认允许容器内网络访问
    volumes:
      - redis_data:/data  # 挂载数据卷持久化缓存数据

# 定义数据卷,用于存储Redis持久化数据
volumes:
  redis_data:

说明:

  • 移除了Redis的--bind redis参数,默认配置已允许Docker内部网络访问
  • 给Redis添加了数据卷redis_data,确保容器重启后缓存数据不会丢失
  • 修正了web服务的端口映射,将宿主机5001端口映射到容器内的Flask端口

3. AWS Lightsail部署要点

  • 在Lightsail实例上安装Docker和Docker Compose
  • 将代码上传到实例(通过Git、SCP或Lightsail控制台文件上传)
  • 运行docker-compose up -d启动服务(后台运行)
  • 配置Lightsail防火墙规则,开放5001端口(若需要外部访问)
  • 如需生产环境规范,可添加Nginx反向代理,将请求转发到Flask服务,并配置SSL证书

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 02:15:58