Docker集成FastAPI与Redis遇阻:服务无法访问及Redis集成困惑求助
问题解决步骤
一、修复浏览器无法连接FastAPI服务的问题
- 你用
https访问是错误的,Uvicorn默认只提供http服务,应访问http://localhost:8000 - 运行Docker容器时必须做端口映射,把容器内的80端口映射到宿主机的8000端口:
单独运行容器命令:docker run -p 8000:80 你的镜像名称
二、集成Redis服务(用docker-compose管理多容器)
1. 补充依赖库
修改requirements.txt,添加Redis客户端:
fastapi uvicorn redis
2. 修正main.py的Redis连接与逻辑
把Redis连接的host从localhost改为redis(对应docker-compose中的服务名),同时替换不安全的eval为JSON序列化:
from fastapi import FastAPI from redis import StrictRedis import json app = FastAPI() # 连接docker-compose中的Redis服务 redis_data = StrictRedis(host="redis", port=6379, db=0, decode_responses=True) @app.get("/") async def get_product_information(product_name: str=""): if product_name == "": products = {} for key in redis_data.scan_iter(): products[key] = json.loads(redis_data.get(key)) return products product_data = redis_data.get(product_name) if product_data: return json.loads(product_data) return "Error : None of the referenced products has the specified name" @app.post("/") async def add_product(product: dict): for feature in ("name", "quantity", "price"): if feature not in product: return f"Error : The product should have a {feature}." product_name = product.pop("name") redis_data.set(product_name, json.dumps(product)) return "The product has been added." @app.delete("/") async def remove_product(product_name: str): if redis_data.exists(product_name): redis_data.delete(product_name) return "The product has been removed." return "Error : None of the referenced products has the specified name."
注:用
json.loads/json.dumps替代eval,避免代码注入风险,同时保证数据读写的一致性。
3. 创建docker-compose.yml配置文件
通过docker-compose同时启动FastAPI和Redis,自动创建共享网络:
version: '3.8' services: web: build: . ports: - "8000:80" depends_on: - redis command: ["sh", "-c", "sleep 2 && uvicorn main:app --host 0.0.0.0 --port 80"] redis: image: redis:alpine ports: - "6379:6379" # 可选:持久化Redis数据,防止容器重启丢失 volumes: - redis_data:/data volumes: redis_data:
4. 构建并启动服务
在项目根目录执行命令:
docker-compose up --build
三、验证服务
- 访问FastAPI接口文档:
http://localhost:8000/docs,可直接测试增删查接口 - 验证Redis数据:用
redis-cli连接localhost:6379,查看数据是否与接口操作同步
内容的提问来源于stack exchange,提问作者Lapin
相关产品推荐
相关产品推荐

