LoginSignup
113
123

More than 3 years have passed since last update.

Dockerを使った軽量なFastAPIの開発環境を構築

Last updated at Posted at 2020-05-30

はじめに

最近FastAPIを使う機会がよくあり,Dockerでサクッと構築して使い捨てしたかったので
メモとして軽量で構築する方法を残したいと思います.

準備

  • Docker及びDocker Composeが使える環境
バージョン
$ docker --version
Docker version 19.03.8, build afacb8b7f0
  • ファイル構成はこんな感じにします
ファイル構成
.
├── Dockerfile
├── docker-compose.yml
├── main.py
└── requirements.txt

ソース

ここからcloneできます
https://github.com/sattosan/sample-fastapi-alpine

Dockerfile

alpineベースで作っています

Dockerfile
FROM python:3.8-alpine

WORKDIR /app

COPY requirements.txt .
# コンテナ内で必要なパッケージをインストール
RUN apk add --no-cache build-base \
 && pip install --no-cache-dir --trusted-host pypi.python.org -r requirements.txt \
 && apk del build-base

COPY main.py .
EXPOSE 8000
# FastAPIを8000ポートで待機
CMD ["uvicorn", "main:app", "--reload", "--host", "0.0.0.0", "--port", "8000"]

Docker Compose

docker-compose.yml
version: "3.0"

services:
  # FastAPI
  api:
    container_name: "api"
    build: .
    restart: always
    tty: true
    ports:
      - 8000:8000

必要なパッケージをまとめています

requirements.txt
uvicorn
fastapi

サンプルコード

FastAPIのドキュメントにあるサンプルコードを用意しました

main.py
from fastapi import FastAPI

app = FastAPI()


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

実行

$ docker-compose up -d --build

Docker Imageサイズの確認

  • alpineベースのImageサイズ
docker images | grep api
latest              bff0158b61ca        29 minutes ago      275MB
  • 本家のImageサイズ

本家様を参考に構築した結果です

$ docker images | grep api
latest              878110f2207f        11 seconds ago      1.02GB

本家に比べて3.6倍軽減出来たことがわかります

動作確認

FastAPIで生成したAPIはSwaggerで自動的にドキュメント化されています

Swaggerで見てみる

ドメイン/docsにアクセスするとドキュメントを見ることが出来ます

キャプチャ.PNG

API叩いてみる

curlで叩くとこんな感じで返って来ます

結果
$ curl localhost:8000
{"Hello":"World"}

おわりに

今回はalpineベースで軽量な開発環境を構築してみました.

本家より3.6倍軽量になるので,使い捨てには十分な環境だとは思います.
最近ではNetflixを始め様々なプロジェクトでFastAPIが使われ始めているので,
まだ使っていない人は是非使って見てください!

参考サイト

113
123
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
113
123