3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PythonのFastAPIを使ってDockerコンテナを構築してみた

Last updated at Posted at 2024-11-07

はじめに

AWSのECSの動作確認用に任意のポート番号のコンテナが必要となり、PythonのFastAPIを使ってDockerコンテナを構築してみました。実務では、コンテナイメージをECRにpushして使用しました。

当時、@kikutch と作業した際の内容を改良しました。

準備

作業ディレクトリを作成
mkdir fastapi_app
cd fastapi_app
ファイルの配置
.
└── fastapi_app
    ├── Dockerfile
    └── main.py

ファイル作成

Dockerfile
# ベースイメージとしてPython 3.11の軽量バージョンを使用
FROM python:3.11.3-slim-buster

# 作業ディレクトリを指定
WORKDIR /usr/src/app

# FastAPIとUvicornのインストール
# キャッシュを利用するため、依存関係インストールを先に実行
RUN pip install --no-cache-dir fastapi uvicorn[standard]

# 必要なPythonプログラムをコンテナにコピー
COPY ./main.py ./main.py

# ビルド時にポート番号を指定できるようにARGを定義し、デフォルトを8000に設定
ARG PORT=8000
# EXPOSEで指定したポートもARGの値に従う
EXPOSE ${PORT}

# アプリケーションをUvicornで実行し、CMDで指定したポートに従う
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "${PORT}"]

main.py
from fastapi import FastAPI
from fastapi.responses import JSONResponse

# FastAPIアプリケーションのインスタンスを作成
app = FastAPI()

# ルートエンドポイント "/" に対する非同期処理を定義
@app.get("/", response_class=JSONResponse)
async def greeting():
    """
    シンプルなJSONレスポンスを返す関数。
    `response_class=JSONResponse`を指定してパフォーマンス向上。
    """
    # JSON形式のレスポンスを返す
    return {"greeting": "Hello"}

コンテナ起動

--build-arg PORT=8080 で、任意のポート番号に変更できます。

コンテナ
# Dockerイメージをビルドし、タグ名を "fastapi_app" に設定
# --build-arg PORT=8080 でビルド時に使用するポート番号を指定
docker build -t fastapi_app --build-arg PORT=8080 .

# Dockerコンテナをバックグラウンドで起動
# -p 8080:8080 でホストの8080番ポートをコンテナの8080番ポートにマッピング
# fastapi_app イメージからコンテナを作成して起動
docker run -d -p 8080:8080 fastapi_app

動作確認

curl http://localhost:8080

# MacOSの場合
open http://localhost:8080

FastAPIのAPIドキュメントの確認

スクリーンショット 2024-11-06 18.58.17.png

FastAPI
# MacOSの場合
open http://localhost:8080/docs

# それ以外は下記のURLをブラウザ表示する
http://localhost:8080/docs

クリーンアップ

コンテナ
# 1. fastapi_app のコンテナを停止
# fastapi_appイメージを使用しているすべてのコンテナを停止
docker ps -q --filter ancestor=fastapi_app | xargs -r docker stop

# 2. fastapi_app のコンテナを削除
# 停止した fastapi_appイメージを使用しているコンテナを削除
docker ps -a -q --filter ancestor=fastapi_app | xargs -r docker rm

# 3. fastapi_app イメージを削除
# fastapi_app のイメージ自体を削除
docker rmi fastapi_app
作業ディレクトリを削除
cd ..
rm -rf fastapi_app
3
2
0

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
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?