Magicode logo
Magicode
1
4 min read

DockerでFastAPIを試してみた

https://cdn.apollon.ai/media/notebox/blob_k6jDReD

はじめに

最近web側の開発をやってなかったのと、友人が勉強したいということで、web apiのサーバーを作ってみることにした。
友人のスキルセットと解析系の処理をするつもりだったのでpythonを選択し、なんとなくfast apiがいいのかなと思いfast apiでapiサーバーを立てることに。 また、共有を楽にしたかったのでDockerを用いた。
今回は、ひとまず公式のDockerイメージを動かすところまで。
なお、執筆は2022年5月だが作業は1月末に行っている。

環境

  • Windows 10
  • Docker Desktop
  • Visual Studio Code

とにかくfast apiを動かしてみる

公式ドキュメントに公開されているDockerイメージを使ったやり方がある。

Docker環境構築

Dockerの起動でいくつか躓いたのでメモ。
インストーラー をDLしてきて、インストール。。。
Error
Errorに書かれているリンク先にある対応をしてみたが、ダメだった。
BIOS のCPU設定で「Intel Virtualization Technology」を有効化することで動いた。(ものによっては「Intel VT-x」らしい)
そして、Errorのおかわり。
リンク先の「手順 4 - Linux カーネル更新プログラム パッケージをダウンロードする」実施で解決し、Dockerが動かせるようになった。

Dockerfileの作成

  • プロジェクトリポジトリに移動
  • Dockerfileを作成
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7

COPY ./app /app

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}
このようなディレクトリ構造になっていればOK
appやmainにしたくない場合はDockerfileでCMDを書けばいいはず!
.
├── app
│   └── main.py
└── Dockerfile

Dockerイメージをビルド

$ docker build -t fastapi_image .
ちなみにdocker buildがDockerfileをもとにイメージをビルドするコマンド
https://docs.docker.jp/engine/reference/commandline/build.html
-t はtagのことでイメージに名前が付けられる。

Docker コンテナを起動

$ docker run -d --name fastapi_container -p 80:80 fastapi_image
docker runで実行している。
https://docs.docker.jp/engine/reference/commandline/run.html
--name: コンテナの名前
-p(--expose): ポートの公開と露出(コロンの左側がホストで右側がコンテナのポート)
-d: バックグランドで実行

動作確認

http://127.0.0.1/items/5?q=somequery
をブラウザで開く。
-p について補足
前項の起動コマンドでは、コンテナの80番ポートをホストの80番ポートにバインド(割り当て)をしている。
下記のように変えると、ホスト側の8080ポートとバインドされるので、urlがhttp://127.0.0.1:8080/items/5?q=somequery になる。
$ docker run -d --name fastapi_container -p 8080:80 fastapi_image
なお、ホスト側の80番ポートについてはイメージの仕様で決まっている。

終わりに

ひとまず動かすところまで。は、開発環境を整えてみます。

Discussion

コメントにはログインが必要です。