【Python】Dockerを用いたFastAPIの環境構築手順

2023/08/17に公開

最近気に入っているFastAPIの環境構築について解説します。
友人と行っている開発のバックエンドにもゴリ押しでFastAPIを導入しました。

概要

FastAPI

FastAPIは、Python 3.6以降で動作する、モダンで高速なWebフレームワークです。
Pythonのtype hinting機能を使用してリクエストパラメータの型チェックや自動変換を行い、またOpenAPIやJSON Schemaを自動生成します。

メリット

  • Starlette(軽量なASGIフレームワーク)とPydantic(データバリデーションライブラリ)に基づいて構築されており非常に高速。NodeやGoと同等のパフォーマンスを有する。
  • 型ヒントと自動エラーチェックを利用することで、バグを早期に発見し、開発速度を上げることが可能。
  • OpenAPIに基づいて、APIのエンドポイントとモデルのスキーマを自動的にドキュメンテーション化する。
  • Pythonの非同期処理(async await)をフルにサポートしている

実装

docker

Dockerfileでは、python3.12のimageを指定しています。

version: "3.9"

services:
  python:
    container_name: python_container
    build: ./Docker/python
    ports:
      - "8000:8000"
    volumes:
      - ./api:/usr/src/python/api
    working_dir: /usr/src/python/api

  db:
    container_name: mysql_container
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    volumes:
      - python-hobby-volume:/var/lib/mysql
      - ./Docker/mysql/my.conf:/etc/mysql/my.conf
volumes:
  python-hobby-volume:

ライブラリinstall

コンテナ内でfastApiとuvicornをインストールします。

$ pip install fastapi uvicorn

uvicorn

Pythonで作られたASGI(Asynchronous Server Gateway Interface)サーバで、FastAPIのようなASGIフレームワークが必要とするWebサーバを提供する。

API実装

疎通確認の為に一つAPIを実装します。
importしたFastAPIクラスからインスタンスを生成し、localhost:8000/ へのアクセス時にGETでメッセージを返す簡単な処理です。

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def hello():
    return {"message": "hello ranble"}

uvicornサーバを起動して確認します。

$ uvicorn main:app --reload

INFO:     Started server process [13]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
INFO:     192.168.128.1:60142 - "GET / HTTP/1.1" 200 OK
INFO:     192.168.128.1:60144 - "GET / HTTP/1.1" 200 OK
// response
"Hello": "hello uvicorn"

OpenAPI自動出力

FastAPIの便利機能である、OpenAPIドキュメントの自動生成を確認してみます。
http://0.0.0.0:8000/docs にアクセスすると確認でき、APIが増えてもこのurlページに追加される形になります

Discussion