見出し画像

FastAPI勉強日記: #1. FastAPIのDockerコンテナを作成

OpenAI APIを使い始めて何年ぶりかにPython開発に戻ってきた。
今はJupyter Noteを使っていろいろ実験途中だが、いずれはDjangoかFlaskにバックエンドに機能として組み込むことを考えて、DjangoとFlaskどちらかを復習しておこうと思った。
Djangoに最後に触ったのは5年位前、Flaskはもっと前である。
いまどちらがイケてるのだろう、、と思って調べてみると、むむむ、、なんか違うのがあるぞ??、FastAPI???
ということで、Fast APIの存在を新たに知った中年エンジニアなのであった笑

DjangoもFlaskもWebフロントエンドも書ける豪華なフレームワーク。自分はフロントエンドはVueで開発することが多いので、バックエンドの機能だけをもったFast APIはなんとも魅了的に感じる。
もしかしたら今後自分にぴったりのバックエンドフレームワークになるかもしれないと思い早速勉強してみることにした。

過去の経験から、PythonのWebフレームワークで開発するときの一番のネックは環境構築。
node.jsと比べるといろんなPythonのバージョン、ディストリビューションがあり、それらを複数動かすバーチャル環境のためのツールも無数にあり、毎回迷ってしまう。

そういえば何年か前にDjango REST APIの本をぱらぱらと読んでいたときに、Dockerで構築する方法を試したことがあったなと思い出して、そのときのDockerfileとdocker-composeファイルを探して引っ張り出してきた。

おぉ、こんな感じでできたらいいなと思って、Fast APIで同じような構成がないか探してみると、、
なんとオフィシャルドキュメントにDockerで起動する方法が書いてあった↓

いい時代である。。
これを参考に、昔作った構成と混ぜて環境をつくることにした。


ディレクトリ構成は以下のようになった。公式ではDockerfileについてのみ書かれているが、docker-compose.ymlがあったほうが起動コマンドがシンプルになるので、docker-compose.ymlも追加した。

app以下がFastAPIのコード

fastapi公式がDockerイメージを公開しているので、それを拝借し、その後appディレクトリをコンテナの/appにコピー。
そして、最後にuvicornをつかってappを起動する↓

Dockerfile

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

COPY ./app /app

CMD ["uvicorn", "main:app", "--reload", "--host", "0.0.0.0", "--port", "3000"]

ポート番号はFast APIでは何番が一番使われるのか分からないが、ひとまずnode.jsで良くつかっている3000番ポートをモニターするようにした。

docker-compose.yml

次にdocker-compose.ymlを書いていく。カレントディレクトリにイメージをビルドし、それをもとに"api"という名前でコンテナを起動する。

version: '3.7'

services:
  api:
    build: .
    container_name: "api"
    volumes:
      - ./app:/app
    ports:
    - 3000:3000

volumes:で、コンテナの/appディレクトリがローカルのappディレクトリにバインドされるようにして、コンテナの3000番ポートとホストの3000番ポートを繋げるようにする。

main.py

main.pyは、公式のコードをそのまま使った。まだFast APIを勉強する前なのでFast APIのコーディングについては何もわからないのである。。ただ、nodeと似ているので2つのサンプルAPI、"/"と"/items"が実装されていることはわかった。

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}


これでdocker-composeを使ってコンテナを起動してみる。

 docker-compose up -d


http://localhost:3000/
にアクセスすると、下のように、APIが動いているのが確認できた。

先程説明したようにdocker-compose.ymlで下のように、ローカルコンピューターのappディレクトリをコンテナの/appディレクトリにバインドしているので、

    volumes:
      - ./app:/app


次のように、main.pyのルートAPI ( / )のレスポンスをHello -> Good Morningに変えると、

APIの応答も直ちに変わることが確認できた。

このようにdocker-composen.ymlのvolumeタグを使ってホストとコンテナのディレクトリをバインディングしておくと、コンテナを再起動することなくコードの変更が反映がされるため、開発中は非常に便利である。



続く。

このブログに関する質問や、Webサービス、Android・iOSアプリの開発の相談はこちら↓↓↓からお願いします!

mizutori@goldrushcomputing.com
@mizutory


次回は↓↓↓


この記事が気に入ったらサポートをしてみませんか?