跳转至

使用 Docker 部署

本章的主要内容如下:

  • 创建最高性能的 FastAPI 应用 Docker 镜像/容器。约 5 分钟
  • (可选)开发者需要了解的 HTTPS 知识;
  • 使用自动 HTTPS 设置 Docker Swarm 模式集群,同样适用于 5美元/月的简单服务器。约 20 分钟
  • 使用 Docker Swarm 与 HTTPS 生成并部署完整的 FastAPI 应用。约 10 分钟

使用 Docker 部署应用具有安全、可复制、开发简单等优势。

如果使用 Docker,推荐使用官方 Docker 镜像:

tiangolo/uvicorn-gunicorn-fastapi

这个镜像内置了自动调优机制,只需添加代码,就能开发出高性能的应用,而且不用付出任何代价。

您依然可以使用环境变量或配置文件更改配置。

提示

要查看所有配置和选项,请参阅 Docker 镜像页面: tiangolo/uvicorn-gunicorn-fastapi

创建 Dockerfile

  • 进入项目文件夹
  • 创建包含以下内容的 Dockerfile
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7

COPY ./app /app

大型应用

参照创建多文件大型应用一章,Dockerfile 的内容是类似这样的:

FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7

COPY ./app /app/app

树莓派与其他架构

如果在(使用 ARM 处理器的)树莓派或其他任何架构中运行 Docker,要基于 Python 基础镜像(多架构)从头创建 Dockerfile,并单独使用 Uvicorn。

本例中,Dockerfile 的内容如下:

FROM python:3.7

RUN pip install fastapi uvicorn

EXPOSE 80

COPY ./app /app

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]

创建 FastAPI 代码

  • 创建 app 文件夹,并进入文件夹
  • 使用以下代码创建 main.py
from typing import Optional

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
    return {"item_id": item_id, "q": q}
  • 文件夹架构如下:
.
├── app
│   └── main.py
└── Dockerfile

构建 Docker 镜像

  • 进入项目文件夹(Dockerfile 所在的文件夹,包含 app 文件夹)
  • 构建 FastAPI 镜像:
$ docker build -t myimage .

---> 100%

启动 Docker 容器

  • 运行基于镜像的容器:
$ docker run -d --name mycontainer -p 80:80 myimage

这样,就在 Docker 容器中创建了一个优化过的 FastAPI 服务器。并对当前服务器(和 CPU 内核数)进行了自动调优。

查看文档

查看Docker容器的 URL,例如:http://192.168.99.100/items/5?q=somequeryhttp://127.0.0.1/items/5?q=somequery(或使用 Docker 主机)。

返回的响应如下:

{"item_id": 5, "q": "somequery"}

API 文档

现在跳转至 http://192.168.99.100/docshttp://127.0.0.1/docs(或使用 Docker 主机)。

查看自动交互的(Swagger UI) API 文档。

Swagger UI

备选 API 文档

跳转至 http://192.168.99.100/redochttp://127.0.0.1/redoc(或 Docker 主机)。

查看(ReDoc)备选 API 文档:

ReDoc

Traefik

Traefik 是高性能反向代理/加载均衡器,用于执行 TLS 终止代理任务(其他功能除外)。

它集成了 Let's Encrypt,可以处理所有 HTTPS 组件,包括获取与更新证书。

Traefik 还集成了 Docker,可以在每个应用配置中声明域,用它读取配置,生成 HTTPS 证书,为应用自动提供 HTTPS 服务,而且无需在配置中进行任何更改。


有了这些信息与工具,就可以继续下一节组合所有内容。

支持 Traefik 与 HTTPS 的 Docker Swarm mode 集群

设置 Docker Swarm Mode 集群大约需要 20 分钟,还包括使用 Traefik 处理 HTTPS(包括证书获取与更新)。

使用 Docker Swarm Mode 可以启用单机 “集群”(仅 5 美元/月 服务器),然后再按需添加更多服务器。

使用 Traefik 与 HTTPS 设置 Docker Swarm Mode 集群,要遵循以下指南:

用于 HTTPS 集群的 Docker Swarm Mode 与 Traefik

部署 FastAPI 应用

完成这些设置的最简单方式是使用 FastAPI 项目生成器

项目生成器集成了 Docker Swarm 集群与 Traefik 与 HTTPS。

生成项目只需要大约 2 分钟。

生成的项目提供了部署说明,再用 2 分钟就可以完成部署。