DockerでFastAPIを動かす方法 | 環境構築から実行まで徹底解説

この記事は広告を含みます。

FastAPIとは?

FastAPIは、Pythonで書かれたWebフレームワークで、以下のような特徴を持っています。

  • 非同期処理に対応: 高速な処理が可能
  • 型ヒントを活用: 自動補完やバリデーションが強力
  • Swagger UIを自動生成: APIの可視化が簡単

Flaskと比べてパフォーマンスが良く、モダンな開発に適しています。。

Dockerとは?

Dockerは、アプリケーションをコンテナとして管理するツールです。

基本概念

  • コンテナ: 軽量な仮想環境
  • イメージ: コンテナのテンプレート
  • Dockerfile: イメージの構築手順を定義するファイル

FastAPIの開発では、環境の統一とデプロイの容易さからDockerを使うと便利です。。

ダウンロード

Docker: コンテナー アプリケーション開発の加速

インストール

WSLを手動でアップデート

wsl --update --web-download

完了

※ログインはGoogleアカウントでログインをしました。

環境構築

必要なツール

  • Docker: コンテナを動かすため
  • Python 3.14+: FastAPIの実行環境

プロジェクトのディレクトリ構成

fastapi-docker/
├── app/
│   ├── main.py  # FastAPIのエントリーポイント
│   ├── requirements.txt  # 依存関係
├── Dockerfile  # Dockerの設定
├── docker-compose.yml  # コンテナの管理

FastAPIのセットアップ

main.py の作成

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Hello, FastAPI with Docker!"}

requirements.txt の準備

fastapi
uvicorn

Dockerファイルの作成

Dockerfile

FROM python:3.13
WORKDIR /app
COPY ./app/requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]

docker-compose.yml

version: '3.8'
services:
  fastapi:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - .:/app
    environment:
      - ENV=development

コンテナのビルドと実行

イメージのビルド

docker build -t fastapi-app .

イメージが大きいですね。。。スリム化が課題です。

コンテナの起動

docker run -d -p 8000:8000 fastapi-app

または、docker-compose を使うと簡単です。

docker-compose up -d

開発環境でのホットリロード

Dockerfile の CMD を以下のように変更すると、コードの変更を即座に反映できます。

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

外部からのアクセスとデバッグ

アクセス方法

ブラウザまたは curl コマンドで確認できます。

curl http://localhost:8000

また、Swagger UI でAPIの動作確認ができます。

http://localhost:8000/docs

ログの確認

docker logs {コンテナ名}

Docker Desktopからでも

まとめ

Dockerを使うメリット

  • 環境構築の手間を削減
  • 本番環境と開発環境の差異を最小限に
  • チーム開発でも同じ環境を共有可能

次のステップ

  • データベースとの連携 (DynamoDB)
  • クラウドデプロイ (AWS)
  • CORSの設定 (フロントエンドと連携)