LoginSignup
1
2

Docker 環境と Python FastAPI で最小 API を実装する:MongoDB

Last updated at Posted at 2023-08-29

Docker 環境と Python FastAPI で最小 API を実装する:MongoDB

こんにちは、@studio_meowtoon です。今回は、WSL の Ubuntu 22.04 で Python FastAPI Web アプリケーションを作成し、最小限の REST API を実装する方法を紹介します。
fastapi_and_mongodb_on_docker.png

目的

Windows 11 の Linux でクラウド開発します。

こちらから記事の一覧がご覧いただけます。

実現すること

ローカル環境の Ubuntu の Docker 環境で、Dockerfile からビルドした Python FastAPI サービスのカスタムコンテナと MongoDB データベースコンテナを起動します。

Python ファイルのアプリをコンテナとして起動

実行環境

要素 概要
terminal ターミナル
Ubuntu OS
Docker コンテナ実行環境

API サービス コンテナ

要素 概要
api-todo-fastapi API サービス カスタムコンテナ
python Python 実行環境
uvicorn Web サーバー
main.py Python スクリプト

データベース コンテナ

要素 概要
mongodb-todo データベースコンテナ
mongodb DB サーバー
db_todo データベース

技術トピック

FastAPI とは?

こちらを展開してご覧いただけます。

FastAPI (ファストエーピーアイ)

FastAPI は、Python の Web フレームワークの中でも特に注目されている新しいフレームワークであり、多くの特徴とメリットがあります。

キーワード 内容
高速な性能 FastAPI は非常に高速なWebフレームワークであり、ASGI (Asynchronous Server Gateway Interface) を活用することで高いパフォーマンスを提供します。非同期処理をサポートすることで、同時リクエストの処理が可能となります。
シンプルで直感的な記述 FastAPI はシンプルで直感的な構文を持ち、少ないコードで強力な API を構築することができます。Python の型ヒント (Type Hints) を活用して、入力の検証やドキュメントの自動生成が行えます。
自動生成されたドキュメント FastAPI は Swagger UI や Redoc を使って API のドキュメントを自動生成します。API エンドポイント、リクエストボディ、レスポンスなどが自動的にドキュメント化され、API の理解やテストが容易になります。
入力検証とシリアライゼーション FastAPI はリクエストの入力データを自動的に検証し、Pydantic を使って型情報をシリアライズします。入力データのバリデーションエラーを自動的に処理することができます。
依存性注入 FastAPI は依存性注入をサポートしており、依存関係の注入によってコードの再利用性とテスト容易性が向上します。依存性注入を活用することで、アプリケーションの部品を疎結合に保ちながら効果的に結合できます。
サポートされるデータベースと ORM FastAPI は様々なデータベースと ORM (Object-Relational Mapping) をサポートしています。例えば、SQLAlchemy、Tortoise ORM、MongoDB、Redis などが利用可能です。
セキュリティ FastAPI は標準的なセキュリティ機能を提供しています。OAuth2.0 や API キーのサポート、HTTPS 対応など、セキュアな API の構築が可能です。

開発環境

  • Windows 11 Home 22H2 を使用しています。

WSL の Ubuntu を操作していきますので macOS の方も参考にして頂けます。

WSL (Microsoft Store アプリ版) ※ こちらの関連記事からインストール方法をご確認いただけます

> wsl --version
WSL バージョン: 1.0.3.0
カーネル バージョン: 5.15.79.1
WSLg バージョン: 1.0.47

Ubuntu ※ こちらの関連記事からインストール方法をご確認いただけます

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.1 LTS
Release:        22.04

Docker ※ こちらの関連記事からインストール方法をご確認いただけます

$ docker --version
Docker version 23.0.1, build a5ee5b1

この記事では基本的に Ubuntu のターミナルで操作を行います。Vim を使用してコピペする方法を初めて学ぶ人のために、以下の記事で手順を紹介しています。ぜひ挑戦してみてください。

作成する REST API の仕様

エンドポイント HTTPメソッド 説明 リクエストBody レスポンスBody
/todos GET すべての ToDo アイテムを取得します。 None ToDo アイテムの配列
/todos/complete GET 完了した ToDo アイテムを取得します。 None ToDo アイテムの配列
/todos/{id} GET ID で ToDo アイテムを取得します。 None ToDo アイテム
/todos POST 新しい ToDo アイテムを追加します。 ToDo アイテム ToDo アイテム
/todos/{id} PUT 既存の ToDo アイテムを更新します。 ToDo アイテム None
/todos/{id} DELETE ID で ToDo アイテムを削除します。 None None

データベース コンテナの起動

こちらの記事で、ToDo アプリ用の NoSQL データベースを作成し、Docker コンテナとして起動する手順をご確認いただけます。

データベース コンテナが起動していることを確認します。

$ docker ps
CONTAINER ID   IMAGE        COMMAND                   CREATED      STATUS       PORTS                                           NAMES
f374bb7a57ac   mongo-base   "docker-entrypoint.s…"   7 days ago   Up 3 hours   0.0.0.0:27017->27017/tcp, :::27017->27017/tcp   mongodb-todo

コンテナ間通信するために net-todo という Docker ネットワークを予め作成しています。ご注意ください。

REST API を実装する手順

プロジェクトの作成

プロジェクトフォルダを作成します。
※ ~/tmp/restapi-fastapi をプロジェクトフォルダとします。

$ mkdir -p ~/tmp/restapi-fastapi
$ cd ~/tmp/restapi-fastapi

model ファイルの作成

このシリーズの記事で、RDBMSNoSQL の両方で同じ API 操作を行います。そのため、ID フィールドは数値型ではなく文字列として定義しています。統一性を保ちつつ異なるデータストアで動作することを目指しています。ご了承ください。

model.py ファイルを作成します。

$ mkdir -p app
$ vim app/model.py

ファイルの内容

app/model.py
from __future__ import annotations
from os import environ
from typing import Optional
from datetime import datetime
from bson import ObjectId
from pydantic import BaseModel
from motor.core import AgnosticClient, AgnosticDatabase, AgnosticCollection
from motor.motor_asyncio import AsyncIOMotorClient

# データベース接続情報を環境変数から取得
CONNECTION_STRING = (
    f"mongodb://"
    f"{environ.get('DB_USER')}:"
    f"{environ.get('DB_PASSWORD')}@"
    f"{environ.get('DB_HOST')}:"
    f"{environ.get('DB_PORT')}/?authSource=admin"
)

# データベース接続・コレクション取得
client: AgnosticClient = AsyncIOMotorClient(CONNECTION_STRING)
database: AgnosticDatabase = client[environ.get('DB_NAME')] # データベース名
collection: AgnosticCollection = database["todos"] # コレクション名

# ToDo エンティティを表すクラス
class Todo(BaseModel):
    id: Optional[str] = None
    content: Optional[str]
    created_date: Optional[datetime] = None
    completed_date: Optional[datetime] = None

    # MongoDB ドキュメントID を id に変換した Todo インスタンスを生成します。
    @classmethod
    def from_mongo(cls, data: dict) -> Todo:
        data["id"] = str(data.pop("_id"))
        return cls(**data)

    # Todo インスタンスの id を MongoDB ドキュメントIDに変換します。
    def to_mongo(self) -> dict[str, str]:
        data = self.model_dump()
        data["_id"] = ObjectId(data.pop("id"))
        return data

    # 新しい Todo インスタンスの作成に必要なフィールドを設定します。
    def set_create_fields(self, create_dict: dict) -> None:
        create_dict["_id"] = ObjectId()
        create_dict["created_date"] = datetime.utcnow()

    # 更新されるフィールドを差分として設定します。
    def map_update_fields(self, update_dict: dict, exist_dict: dict) -> None:
        update_dict.pop("id")
        update_dict["_id"] = exist_dict["_id"]
        update_dict["created_date"] = exist_dict["created_date"]
説明を開きます。

ライブラリのインポートと型定義

要素 説明
annotations __future__ モジュールを使用して、型アノテーションの評価を遅延し、循環参照の問題を回避しています。このようにすることで、型アノテーションを含むクラスを定義する際にクラス名を文字列として使用することができます。
environ 環境変数を扱うためのモジュールです。
Optional 型アノテーションで使用され、フィールドがオプション (存在しないこともある) であることを示します。
datetime 日時を表現するためのモジュールです。
ObjectId MongoDB のオブジェクト ID を表現するためのデータ型です。
BaseModel Pydantic の基本モデルクラスで、データのバリデーションや変換を行うために使用されます。
AgnosticClient Motor の非同期クライアントのインターフェースです。このクライアントを使用して MongoDB サーバーとの接続を確立し、非同期の操作を実行できます。
AgnosticDatabase Motor の非同期データベースのインターフェースです。このデータベースを使用して MongoDB のデータベースに対する操作を実行できます。
AgnosticCollection Motor の非同期コレクションのインターフェースです。このコレクションを使用して MongoDB のコレクション (テーブルに相当) に対する操作を実行できます。
AsyncIOMotorClient Motor ライブラリのクライアントクラスの実装の1つで、非同期コードと統合された非同期版の MongoDB クライアントです。FastAPI アプリケーション内で非同期の MongoDB 操作を実行するために使用されます。

ToDo クラスの定義

要素 説明
Todo Pydantic の BaseModel を継承しています。
id、content、created_date、completed_date フィールドとして id、content、created_date、completed_date を定義しています。
from_mongo MongoDB のオブジェクト ID から Todo インスタンスを生成するためのクラスメソッドです。のオブジェクト ID から取り出した _id を id フィールドに変換してインスタンスを生成します。
to_mongo Todo インスタンスを MongoDB のオブジェクト ID に変換するためのメソッドです。id フィールドを _id に変換し、のオブジェクト ID を生成します。
set_create_fields, map_update_fields Todo インスタンスの作成や更新に関するものです。新しいインスタンスの作成には _id や created_date フィールドを設定します。

main ファイルの作成

main.py ファイルを作成します。

$ mkdir -p app
$ vim app/main.py

ファイルの内容

app/main.py
from typing import List
from bson import ObjectId
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

from app.model import collection, Todo

# app オブジェクト
app = FastAPI()

# CORS 設定:適切に修正してください。
app.add_middleware(
    CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"]
)

# すべての ToDo アイテムを取得します。
@app.get("/todos")
async def get_all_todos() -> List[Todo]:
    todos = []
    cursor = collection.find({})
    async for document in cursor:
        todos.append(Todo.from_mongo(document))
    return todos

# 完了した ToDo アイテムを取得します。
@app.get("/todos/complete")
async def get_completed_todos() -> List[Todo]:
    todos = []
    cursor = collection.find({"completed_date": {"$ne": None}})
    async for document in cursor:
        todos.append(Todo.from_mongo(document))
    return todos

# ID で ToDo アイテムを取得します。
@app.get("/todos/{id}")
async def get_todo(id: str) -> Todo:
    document = await collection.find_one({"_id": ObjectId(id)})
    todo = Todo.from_mongo(document)
    return todo

# 新しい ToDo アイテムを追加します。
@app.post("/todos")
async def create_todo(create: Todo) -> Todo:
    create_dict = create.model_dump()
    create.set_create_fields(create_dict)
    new_todo = Todo.from_mongo(create_dict)
    await collection.insert_one(new_todo.to_mongo())
    return new_todo

# 既存の ToDo アイテムを更新します。
@app.put("/todos/{id}")
async def update_todo(id: str, update: Todo) -> None:
    exist_dict = await collection.find_one({"_id": ObjectId(id)})
    update_dict = update.model_dump()
    update.map_update_fields(update_dict, exist_dict)
    await collection.update_one({"_id": ObjectId(id)}, {"$set": update_dict})
    return None

# ID で ToDo アイテムを削除します。
@app.delete("/todos/{id}")
async def delete_todo(id: str) -> None:
    await collection.delete_one({"_id": ObjectId(id)})
    return None
説明を開きます。
要素 説明
FastAPI アプリケーションの設定 FastAPI アプリケーションが作成されています。FastAPI は Python の Web フレームワークで、高速で直感的な API を構築できます。
CORS ミドルウェアの設定 CORS ミドルウェアが追加されています。これにより、異なるドメインからのリクエストも許可されるようになります。
ToDo アイテムの取得 /todos エンドポイントでは、MongoDB のコレクションからすべての ToDo アイテムを非同期で取得しています。
完了した ToDo アイテムの取得 /todos/complete エンドポイントでは、完了日付が設定されている ToDo アイテムを非同期で取得しています。
ToDo アイテムの取得 (ID指定) /todos/{id} エンドポイントでは、特定の ToDo アイテムを ID で取得しています。MongoDB の find_one メソッドを使用しています。
ToDo アイテムの作成 /todos エンドポイントへの POST リクエストで新しい ToDo アイテムを作成しています。入力データは Pydantic モデルでバリデーションされ、MongoDB に保存されます。
ToDo アイテムの更新 /todos/{id} エンドポイントへの PUT リクエストで既存の ToDo アイテムを更新しています。変更があるフィールドのみを更新し、MongoDB の update_one メソッドを使用しています。
ToDo アイテムの削除 /todos/{id} エンドポイントへの DELETE リクエストで特定の ToDo アイテムを削除しています。MongoDB の delete_one メソッドを使用しています。

ライブラリをインストールします。

$ pip install fastapi uvicorn pydantic motor
説明を開きます。
要素 説明
pip install pip コマンドは Python のパッケージマネージャで、パッケージのインストールや管理を行います。
fastapi FastAPI という Python の Web フレームワークをインストールします。FastAPI は高速で直感的な Web API を作成できる特徴があります。
uvicorn Uvicorn という ASGI サーバーをインストールします。Uvicorn は FastAPI アプリケーションを実行するためのサーバーです。
pydantic Pydantic というライブラリをインストールします。Pydantic はデータ検証と設定のためのライブラリで、FastAPI で入力データのバリデーションに使用されます。
motor Motor という非同期 MongoDB ドライバをインストールします。Motor は非同期操作をサポートする MongoDB との連携に使用されます。

ライブラリへの PATH を追加します。

$ export PATH=$PATH:~/.local/bin

アプリのビルドと起動

環境変数を作成します。

export DB_HOST=localhost
export DB_PORT=27017
export DB_NAME=db_todo
export DB_USER=root
export DB_PASSWORD=password

この環境変数が一時的なものであることに注意してください。

アプリを起動します。
※ アプリを停止するときは ctrl + C を押します。

$ uvicorn app.main:app \
    --host 0.0.0.0 --port 5000
説明を開きます。
要素 説明
uvicorn ASGI (Asynchronous Server Gateway Interface) アプリケーションを実行するためのサーバーです。FastAPI アプリケーションは ASGI アプリケーションであり、このコマンドを使用してサーバーを起動します。
app.main:app FastAPI アプリケーションを指定しています。app.main は app モジュール内の main オブジェクト (FastAPIアプリケーション) を指します。app の後の :app は、起動する FastAPI アプリケーションを指定しています。
--host 0.0.0.0 サーバーがリッスンするホストアドレスを指定します。0.0.0.0 は、すべてのネットワークインターフェースからの接続を受け入れることを意味します。
--port 5000 サーバーがリッスンするポート番号を指定します。ここではポート番号 5000 を指定しています。

ここまでの手順で、Ubuntu でアプリを起動することができました。

アプリの動作確認

別ターミナルから curl コマンドで確認します。

必要な場合、jq をインストールします。

$ sudo apt update
$ sudo apt install jq

GET: /todos エンドポイントの動作確認

すべての ToDo アイテムを取得します。

$ curl -s http://localhost:5000/todos | jq '.'

レスポンス

[
// 省略
  {
    "id": "64e2a2843d5170b46d329665",
    "content": "運動する",
    "created_date": "2023-08-20T23:32:20.985000",
    "completed_date": "2023-08-20T23:32:20.985000"
  },
  {
    "id": "64e2a2843d5170b46d329666",
    "content": "本を読む",
    "created_date": "2023-08-20T23:32:20.985000",
    "completed_date": null
  },
  {
    "id": "64e2a2843d5170b46d329667",
    "content": "請求書を支払う",
    "created_date": "2023-08-20T23:32:20.985000",
    "completed_date": null
  },
// 省略

すべての ToDo アイテムを取得できています。

GET: /todos/complete エンドポイントの動作確認

完了した ToDo アイテムを取得します。

$ curl -s http://localhost:5000/todos/complete | jq '.'

レスポンス

[
  {
    "id": "64e2a2843d5170b46d329663",
    "content": "食材を買う",
    "created_date": "2023-08-20T23:32:20.985000",
    "completed_date": "2023-08-20T23:32:20.985000"
  },
  {
    "id": "64e2a2843d5170b46d329664",
    "content": "報告書を仕上げる",
    "created_date": "2023-08-20T23:32:20.985000",
    "completed_date": "2023-08-20T23:32:20.985000"
  },
  {
    "id": "64e2a2843d5170b46d329665",
    "content": "運動する",
    "created_date": "2023-08-20T23:32:20.985000",
    "completed_date": "2023-08-20T23:32:20.985000"
  }
]

完了した ToDo アイテムを取得できています。

GET: /todos/{id} エンドポイントの動作確認

ID で ToDo アイテムを取得します。

id: 64e2a2843d5170b46d32966a は、その都度適切な値を設定してください。

$ curl -s http://localhost:5000/todos/64e2a2843d5170b46d32966a | jq '.'

レスポンス

{
  "id": "64e2a2843d5170b46d32966a",
  "content": "コードを書く",
  "created_date": "2023-08-20T23:32:20.985000",
  "completed_date": null
}

ID で ToDo アイテムを取得できています。

POST: /todos エンドポイントの動作確認

新しい ToDo アイテムを追加します。

$ curl -s -X POST http://localhost:5000/todos \
    -H 'Content-Type: application/json; charset=utf-8' \
    -d \
'{
    "content": "昼寝をする"
}' | jq '.'

レスポンス

{
  "id": "64e43bd56e72e712cde01afa",
  "content": "昼寝をする",
  "created_date": "2023-08-22T04:38:45.075331",
  "completed_date": null
}

新しい ToDo アイテムが追加できています。

PUT: /todos/{id} エンドポイントの動作確認

既存の ToDo アイテムを更新します。

id: 64e43f8a6e72e712cde01afb は、その都度適切な値を設定してください。

$ curl -s -X PUT http://localhost:5000/todos/64e43f8a6e72e712cde01afb \
    -H 'Content-Type: application/json; charset=utf-8' \
    -d \
'{
    "content": "窓を開ける"
}' | jq '.'

レスポンス

None (※なし)

レスポンスは None ですが、DB のコレクションを確認すると対象のレコードが更新されています。

DELETE: /todos/{id} エンドポイントの動作確認

ID で ToDo アイテムを削除します。

id: 64e43bd56e72e712cde01afa は、その都度適切な値を設定してください。

$ curl -s -X DELETE http://localhost:5000/todos/64e43bd56e72e712cde01afa | jq '.'

レスポンス

None (※なし)

レスポンスは None ですが、DB のコレクションを確認すると対象のレコードが削除されています。

ここまでの手順で、最小限の CRUD 操作を行う REST API をアプリに実装できました。

コンテナイメージの作成

Dockerfile を作成します。

$ vim Dockerfile

ファイルの内容

Dockerfile
# set up the container.
FROM python:3.10-slim-bookworm

# set the working dir.
WORKDIR /app

# copy the app dir.
COPY app app

# install libraries.
RUN pip install --no-cache-dir fastapi uvicorn pydantic motor

# expose the port.
EXPOSE 5000

# command to run the app using uvicorn.
CMD ["uvicorn","app.main:app","--host","0.0.0.0","--port","5000"]
説明を開きます。
要素 説明
FROM python:3.10-slim-bookworm ベースイメージとして、Python 公式 3.10 バージョンの slim-bookworm イメージを使用しています。
WORKDIR /app コンテナ内の作業ディレクトリを /app に設定しています。
COPY app app ホストマシンのカレントディレクトリ内の app ディレクトリを、コンテナ内の /app ディレクトリにコピーします。
RUN pip install --no-cache-dir fastapi uvicorn pydantic motor: 必要な Python ライブラリをインストールします。--no-cache-dir オプションはキャッシュを使用しないように指定しています。
EXPOSE 5000 コンテナがリッスンするポート番号を指定します。ここではポート番号 5000 を指定しています。
CMD ["uvicorn","app.main:app","--host","0.0.0.0","--port","5000"]: コンテナが起動した際に、FastAPI アプリケーションを uvicorn サーバーで実行するコマンドを設定しています。--host でホストアドレスを、--port でポート番号を指定しています。

Docker デーモンを起動します。

$ sudo service docker start
 * Starting Docker: docker    [ OK ]

Docker 環境をお持ちでない場合は、以下の関連記事から Docker Engine のインストール手順をご確認いただけます。

コンテナイメージをビルドします。

$ docker build \
    --no-cache \
    --tag api-todo-fastapi:latest .

コンテナイメージを確認します。

$ docker images | grep api-todo-fastapi
api-todo-fastapi    latest    fe2cd81d4205    21 seconds ago    152MB

ここまでの手順で、ローカル環境の Docker にアプリのカスタムコンテナイメージをビルドすることができました。

コンテナを起動

ローカルでコンテナを起動します。
※ コンテナを停止するときは ctrl + C を押します。

コンテナ間通信するために net-todo という Docker ネットワークを予め作成しています。ご注意ください。

$ docker run --rm \
    --publish 5000:5000 \
    --name api-local \
    --net net-todo \
    --env DB_HOST=mongodb-todo \
    --env DB_PORT=27017 \
    --env DB_NAME=db_todo \
    --env DB_USER=root \
    --env DB_PASSWORD=password \
    api-todo-fastapi

ここまでの手順で、ローカル環境の Docker でアプリのカスタムコンテナを起動することができました。

コンテナの動作確認

別ターミナルから curl コマンドで確認します。
※ ID で ToDo アイテムを取得します。

id: 64e2a2843d5170b46d32966a は、その都度適切な値を設定してください。

$ curl -s http://localhost:5000/todos/64e2a2843d5170b46d32966a | jq '.'

レスポンス

{
  "id": "64e2a2843d5170b46d32966a",
  "content": "コードを書く",
  "created_date": "2023-08-20T23:32:20.985000",
  "completed_date": null
}

ここまでの手順で、ターミナルにレスポンスが表示され、JSON データを取得することが出来ました。

コンテナの状態を確認してみます。

$ docker ps
CONTAINER ID   IMAGE              COMMAND                   CREATED              STATUS              PORTS                                           NAMES
c3a9c7b5bca0   api-todo-fastapi   "uvicorn app.main:ap…"   About a minute ago   Up About a minute   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp       api-local
f374bb7a57ac   mongo-base         "docker-entrypoint.s…"   7 days ago           Up 4 hours          0.0.0.0:27017->27017/tcp, :::27017->27017/tcp   mongodb-todo

コンテナに接続

別ターミナルからコンテナに接続します。

$ docker exec -it api-local /bin/bash

コンテナに接続後にディレクトリを確認します。
※ コンテナから出るときは ctrl + D を押します。

# pwd
/app
# ls -lah
total 20K
drwxr-xr-x 1 root root 4.0K Aug 28 04:40 .
drwxr-xr-x 1 root root 4.0K Aug 28 04:43 ..
drwxr-xr-x 1 root root 4.0K Aug 22 10:31 app
# cd app
# ls -lah
total 32K
drwxr-xr-x 1 root root 4.0K Aug 22 10:31 .
drwxr-xr-x 1 root root 4.0K Aug 28 04:40 ..
drwxr-xr-x 1 root root 4.0K Aug 28 04:43 __pycache__
-rw-r--r-- 1 root root 5.4K Aug 28 04:14 main.py
-rw-r--r-- 1 root root 2.0K Aug 28 04:09 model.py

top コマンドで状況を確認します。

# apt update
# apt install procps
# top
top - 04:47:20 up  5:55,  0 user,  load average: 0.17, 0.07, 0.01
Tasks:   3 total,   1 running,   2 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.1 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   7897.1 total,   4055.0 free,   2466.3 used,   1639.6 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   5430.8 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
    1 root      20   0  355592  53036  12976 S   0.0   0.7   0:00.99 uvicorn
   11 root      20   0    4608   3648   3104 S   0.0   0.0   0:00.02 bash
  180 root      20   0    8988   4736   2856 R   0.0   0.1   0:00.00 top

コンテナの情報を表示してみます。

# cat /etc/*-release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

このコンテナは Debian GNU/Linux をベースに作成されています。つまり、Debian GNU/Linux と同じように扱うことができます。

おまけ:Swagger 装備

FastAPI には Swagger が標準で装備されています。

Swagger を確認

Web ブラウザで Swagger の URL を確認します。

http://localhost:5000/docs

image.png
image.png

これらのツールを活用することにより、より手軽に API を操作することができます。

まとめ

WSL Ubuntu の Docker 環境で、Python FastAPI の最小 API を実装することができました。

この記事の実装例は一つのアプローチに過ぎず、必ずしも正しい方法とは限りません。他にも多様な方法がありますので、さまざまな情報を照らし合わせて検討してみてください。

どうでしたか? WSL Ubuntu で、Python FastAPI Web アプリケーションを手軽に起動することができます。ぜひお試しください。今後も Python の開発環境などを紹介していきますので、ぜひお楽しみにしてください。

推奨コンテンツ

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