FastAPI 教程

15.3 Docker Compose 多服务编排

FastAPI与Docker Compose多服务编排完整教程 - 简单易懂的部署指南

FastAPI 教程

本教程由FastAPI高级工程师编写,详细讲解如何使用Docker Compose编排多个服务,包括FastAPI应用、数据库和缓存,适合新人学习容器化微服务部署,内容简单易懂并附有代码示例。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

使用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

这个配置文件定义了四个服务:

  1. api:我们的FastAPI应用,构建自当前目录,依赖数据库和缓存。
  2. db:PostgreSQL数据库,用于存储数据。
  3. cache:Redis缓存,用于提高性能。
  4. nginx:可选的反向代理,用于负载均衡(示例中未配置nginx.conf,你可以根据需要添加)。

注意:

  • depends_on 确保服务按顺序启动。
  • networks 定义网络,使服务能够相互通信。
  • environment 设置环境变量,例如数据库连接字符串。

第4部分:配置服务和网络

docker-compose.yml 中,我们已配置了服务间网络。所有服务都连接到 app-network 网络,这样它们可以通过服务名称(如 dbcache)相互访问。

例如,在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/
  • 微服务架构和容器化进阶主题。

祝你学习愉快!如有问题,欢迎在社区讨论。

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包