努力加载中
  • 推荐
  • 要闻
  • 财经
  • 娱乐
  • 时尚
  • 情感

热点推荐

热门图文

一步步将你的 Python FastAPI 应用容器化 —— 实用指南
真智AI

如果你一直在思考如何让 Python 应用更具可移植性、更一致且更易于部署,那么你来对地方了。容器化不仅仅是个流行词,它是一项能立刻提升你开发流程的实用技能。

在本指南中,我将手把手带你将一个简单的 FastAPI 应用进行容器化。没有废话,只有你今天就能用到的实战知识。准备好开始了吗?

[GitHub 上的代码链接]

https://github.com/balapriyac/data-science-tutorials


为什么要将 Python 应用容器化?

在讲“如何做”之前,先聊聊“为什么”:

  • 跨环境一致性:再也不会出现“明明在我电脑上没问题”的尴尬。有了容器,你可以保证你的应用在任何地方都能一致运行。
  • 隔离性:每个容器有自己的依赖,避免了与其他应用或系统库的冲突。
  • 可移植性:只要能运行 Docker,就能部署你的应用——无论是你的笔记本、AWS、Azure 还是其他云服务商。
  • 可扩展性:容器轻量且启动迅速,非常适合服务的弹性伸缩。
  • DevOps 友好:容器与现代 CI/CD 流水线完美契合,让持续部署更加顺畅。

了解了这些好处后,让我们来实际容器化一个 Python 应用!我们将使用 Docker——容器化的首选工具。

▶️ 开始前:请确保已安装 Python 和 Docker。


如何将 Python FastAPI 应用容器化

我们将构建并容器化一个简单的 FastAPI 应用,用于货币兑换。这个示例会带你理解关键概念,你可以将这些应用到自己的项目中。

首先,创建项目目录:

$ mkdir currency-api
$ cd currency-api

接着,创建并激活虚拟环境:

$ python3 -m venv venv
$ source venv/bin/activate  # Windows 下为 venv\Scripts\activate

然后安装必要的包:

$ pip3 install fastapi uvicorn

创建 main.py 文件,内容如下:

from fastapi import FastAPI, HTTPException, Query
from pydantic import BaseModel
from typing import Literal

app = FastAPI(title="Currency Converter")

class ConversionResponse(BaseModel):
    from_currency: str
    to_currency: str
    amount: float
    converted: float
    rate: float

mock_rates = {
    ("USD", "EUR"): 0.91,
    ("EUR", "USD"): 1.10,
    ("USD", "JPY"): 145.0,
}

@app.get("/convert", response_model=ConversionResponse)
def convert(
    amount: float = Query(..., gt=0),
    from_currency: Literal["USD", "EUR"] = "USD",
    to_currency: Literal["USD", "EUR", "JPY"] = "EUR",
):
    if from_currency == to_currency:
        raise HTTPException(
            status_code=400, detail="From and to currencies must differ."
        )

    rate = mock_rates.get((from_currency, to_currency))
    if not rate:
        raise HTTPException(status_code=400, detail="Conversion rate not available.")

    converted = amount * rate
    return ConversionResponse(
        from_currency=from_currency,
        to_currency=to_currency,
        amount=amount,
        converted=round(converted, 2),
        rate=rate,
    )

这个 API 提供了 /convert 端点,接收金额、源货币与目标货币并校验输入。它用模拟的汇率进行兑换,并以结构化 JSON 结果返回。


第 2 步:创建 requirements.txt 文件

创建 requirements.txt 文件,内容如下:

fastapi==0.115.12
uvicorn==0.34.2

这个文件锁定了依赖的具体版本,保证容器每次构建都一致。


第 3 步:创建 Dockerfile

重点来了:创建 Dockerfile,这是容器化的关键步骤。

Dockerfile 示例:

# 使用官方 Python 镜像
FROM python:3.11-slim

# 设置工作目录
WORKDIR /app

# 安装依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 复制应用代码
COPY . .

# 暴露端口
EXPOSE 8000

# 启动应用
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

解析 Dockerfile:

  • 基础镜像:使用 python:3.11-slim,轻量且适合生产环境。
  • 设置工作目录:WORKDIR /app 在容器内创建并设置工作目录。
  • 安装依赖:利用 Docker 的分层缓存机制,只有 requirements.txt 变动时才会重新安装依赖。
  • 复制代码:COPY . . 将所有代码复制进容器。
  • 暴露端口:EXPOSE 8000 告诉 Docker 应用监听的端口。
  • 启动命令:用 Uvicorn 正确运行 FastAPI 应用。

第 4 步:创建 .dockerignore 文件

你可以添加 .dockerignore 文件,让容器镜像更精简。

它的作用类似于 .gitignore,防止无关文件被复制进容器环境,减小镜像体积,避免本地开发文件带来的问题。

例如:

__pycache__/
*.pyc
venv/
.git

第 5 步:构建并运行你的容器

现在来构建并运行容器化应用:

# 构建 Docker 镜像
$ docker build -t currency-api .

# 运行容器
$ docker run -p 8000:8000 currency-api

这些命令会:

  • 从当前目录构建名为 currency-api 的 Docker 镜像
  • 运行该镜像生成的容器,并将主机的 8000 端口映射到容器的 8000 端口

你的 FastAPI 应用现在已经在容器中运行了!访问 http://localhost:8000 即可。


第 6 步:测试容器化 API

测试 API 接口。用 cURL 发送兑换请求到 /convert 端点:

$ curl "http://localhost:8000/convert?amount=100&from_currency=USD&to_currency=EUR"

返回结果如下:

{
    "from_currency": "USD",
    "to_currency": "EUR",
    "amount": 100.0,
    "converted": 91.0,
    "rate": 0.91
}

总结

到这里,你的 Python FastAPI 应用已经容器化并准备投入使用。这一方法几乎适用于任何 Python 应用,不仅限于 FastAPI。无论 Flask、Django 还是其他框架,原理都类似。

容器化的实际价值在于部署到不同环境时的高度一致性。你现在可以自信地将容器化应用推送到开发、测试或生产环境,无需担心环境差异。

接下来你可以尝试 Docker Compose 进行多容器应用管理、Kubernetes 容器编排,或搭建 CI/CD 流水线,进一步提升你的容器化技能。

祝你容器化愉快!

相关推荐
x