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

