コンテンツにスキップ

Dockerを使用したデプロイ

このセクションでは以下の使い方の紹介とガイドへのリンクが確認できます:

  • 5分程度で、FastAPI のアプリケーションを、パフォーマンスを最大限に発揮するDockerイメージ (コンテナ)にする。
  • (オプション) 開発者として必要な範囲でHTTPSを理解する。
  • 20分程度で、自動的なHTTPS生成とともにDockerのSwarmモード クラスタをセットアップする (月5ドルのシンプルなサーバー上で)。
  • 10分程度で、DockerのSwarmモード クラスタを使って、HTTPSなどを使用した完全なFastAPI アプリケーションの作成とデプロイ。

デプロイのために、Docker を利用できます。セキュリティ、再現性、開発のシンプルさなどに利点があります。

Dockerを使う場合、公式のDockerイメージが利用できます:

tiangolo/uvicorn-gunicorn-fastapi

このイメージは「自動チューニング」機構を含んでいます。犠牲を払うことなく、ただコードを加えるだけで自動的に高パフォーマンスを実現できます。

ただし、環境変数や設定ファイルを使って全ての設定の変更や更新を行えます。

豆知識

全ての設定とオプションを確認するには、Dockerイメージページを開いて下さい: tiangolo/uvicorn-gunicorn-fastapi.

Dockerfile の作成

  • プロジェクトディレクトリへ移動。
  • 以下のDockerfile を作成:
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7

COPY ./app /app

より大きなアプリケーション

Bigger Applications with Multiple Files セクションに倣う場合は、Dockerfile は上記の代わりに、以下の様になるかもしれません:

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

COPY ./app /app/app

Raspberry Piなどのアーキテクチャ

Raspberry Pi (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イメージをビルド

  • プロジェクトディレクトリ (app ディレクトリを含んだ、Dockerfile のある場所) へ移動
  • 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ホストを使用したこれらと同等のもの) を開いて下さい。

自動生成された対話的APIドキュメントが確認できます (Swagger UIによって提供されます):

Swagger UI

その他のAPIドキュメント

また同様に、http://192.168.99.100/redochttp://127.0.0.1/redoc (もしくはDockerホストを使用したこれらと同等のもの) を開いて下さい。

他の自動生成された対話的なAPIドキュメントが確認できます (ReDocによって提供されます):

ReDoc

Traefik

Traefikは、高性能なリバースプロキシ/ロードバランサーです。「TLSターミネーションプロキシ」ジョブを実行できます(他の機能と切り離して)。

Let's Encryptと統合されています。そのため、証明書の取得と更新を含むHTTPSに関するすべての処理を実行できます。

また、Dockerとも統合されています。したがって、各アプリケーション構成でドメインを宣言し、それらの構成を読み取って、HTTPS証明書を生成し、構成に変更を加えることなく、アプリケーションにHTTPSを自動的に提供できます。


次のセクションに進み、この情報とツールを使用して、すべてを組み合わせます。

TraefikとHTTPSを使用したDocker Swarmモードのクラスタ

HTTPSを処理する(証明書の取得と更新を含む)Traefikを使用して、Docker Swarmモードのクラスタを数分(20分程度)でセットアップできます。

Docker Swarmモードを使用することで、1台のマシンの「クラスタ」から開始でき(1か月あたり5ドルのサーバーでもできます)、後から必要なだけサーバーを拡張できます。

TraefikおよびHTTPS処理を備えたDocker Swarm Modeクラスターをセットアップするには、次のガイドに従います:

Docker Swarm Mode and Traefik for an HTTPS cluster

FastAPIアプリケーションのデプロイ

すべてを設定するための最も簡単な方法は、FastAPI Project Generatorsを使用することでしょう。

上述したTraefikとHTTPSを備えたDocker Swarm クラスタが統合されるように設計されています。

2分程度でプロジェクトが生成されます。

生成されたプロジェクトはデプロイの指示がありますが、それを実行するとさらに2分かかります。