15.3 Docker Compose 多服务编排
FastAPI与Docker Compose多服务编排完整教程 - 简单易懂的部署指南
本教程由FastAPI高级工程师编写,详细讲解如何使用Docker Compose编排多个服务,包括FastAPI应用、数据库和缓存,适合新人学习容器化微服务部署,内容简单易懂并附有代码示例。
使用Docker Compose编排FastAPI多服务:完整教程
引言
FastAPI是一个现代、快速(高性能)的Web框架,用于基于标准Python类型提示构建API。而Docker Compose是一个工具,用于定义和运行多容器Docker应用程序,特别适合微服务架构。本教程将教你如何使用Docker Compose编排多个服务,例如FastAPI应用、数据库和缓存,以便高效部署和管理微服务。
为什么需要多服务编排?在真实项目中,你的应用可能依赖多个组件(如API服务器、数据库、消息队列)。使用Docker Compose,你可以在一个文件中定义所有服务,轻松启动、停止和扩展它们,提升开发和部署效率。
前提条件
在开始之前,请确保你已安装以下工具:
- Docker:用于容器化应用。
- Docker Compose:用于多容器编排。
- Python(建议3.7+):用于运行FastAPI。
- 基本了解Python和FastAPI会有所帮助,但本教程将从头开始讲解。
第1部分:创建FastAPI应用示例
我们将创建一个简单的FastAPI应用来演示。在你的项目目录中,创建一个文件 main.py,并添加以下代码:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI(title="My FastAPI App")
class Item(BaseModel):
name: str
price: float
@app.get("/")
def read_root():
return {"message": "Hello from FastAPI with Docker Compose!"}
@app.post("/items/")
def create_item(item: Item):
return {"item_name": item.name, "item_price": item.price}
这个应用有两个端点:一个GET根端点和一个POST端点用于创建项目。
第2部分:容器化FastAPI应用
为了在Docker中运行FastAPI应用,我们需要一个Dockerfile。在项目根目录创建一个文件 Dockerfile:
# 使用官方Python轻量级镜像
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 复制依赖文件
COPY requirements.txt .
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY . .
# 暴露端口(FastAPI默认8000)
EXPOSE 8000
# 启动应用
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
创建一个 requirements.txt 文件,包含依赖:
fastapi>=0.68.0
uvicorn>=0.15.0
第3部分:编写Docker Compose文件
Docker Compose允许你定义多个服务。在项目根目录创建一个文件 docker-compose.yml:
version: '3.8'
services:
# FastAPI应用服务
api:
build: .
container_name: fastapi_app
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgresql://user:password@db:5432/mydb
- REDIS_URL=redis://cache:6379
depends_on:
- db
- cache
networks:
- app-network
# PostgreSQL数据库服务
db:
image: postgres:13
container_name: postgres_db
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- app-network
# Redis缓存服务
cache:
image: redis:6
container_name: redis_cache
networks:
- app-network
# 可选:添加一个Nginx反向代理服务
nginx:
image: nginx:alpine
container_name: nginx_proxy
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- api
networks:
- app-network
# 定义卷和网络
volumes:
postgres_data:
networks:
app-network:
driver: bridge
这个配置文件定义了四个服务:
- api:我们的FastAPI应用,构建自当前目录,依赖数据库和缓存。
- db:PostgreSQL数据库,用于存储数据。
- cache:Redis缓存,用于提高性能。
- nginx:可选的反向代理,用于负载均衡(示例中未配置nginx.conf,你可以根据需要添加)。
注意:
depends_on确保服务按顺序启动。networks定义网络,使服务能够相互通信。environment设置环境变量,例如数据库连接字符串。
第4部分:配置服务和网络
在 docker-compose.yml 中,我们已配置了服务间网络。所有服务都连接到 app-network 网络,这样它们可以通过服务名称(如 db、cache)相互访问。
例如,在FastAPI代码中,你可以使用 DATABASE_URL 环境变量连接到数据库。更新 main.py 以使用这些环境变量(实际应用中可能需要添加数据库连接代码)。
第5部分:运行和测试
现在,运行以下命令来启动所有服务:
docker-compose up --build
--build选项确保构建新的Docker镜像。- 服务启动后,访问
http://localhost:8000来测试FastAPI应用的根端点。 - 你还可以使用工具如
curl或浏览器测试API端点。
示例命令:
# 测试GET端点
curl http://localhost:8000/
# 测试POST端点
curl -X POST http://localhost:8000/items/ -H "Content-Type: application/json" -d '{"name":"Example", "price":19.99}'
停止服务:
docker-compose down
这会将所有容器和网络。
最佳实践
- 日志管理:使用Docker Compose日志查看服务输出:
docker-compose logs。 - 健康检查:在
docker-compose.yml中添加健康检查来监控服务状态。 - 安全性:使用环境变量文件(如
.env)存储敏感信息,避免硬编码。 - 扩展性:使用
docker-compose scale命令扩展服务实例。
结论
通过本教程,你学会了如何使用Docker Compose编排多个FastAPI相关服务。这简化了开发和部署过程,让你能专注于编写代码而不是基础设施管理。实践是掌握的关键,尝试修改配置或添加新服务来加深理解。
后续学习资源:
- 官方FastAPI文档:https://fastapi.tiangolo.com/
- 官方Docker Compose文档:https://docs.docker.com/compose/
- 微服务架构和容器化进阶主题。
祝你学习愉快!如有问题,欢迎在社区讨论。