2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

FastAPI を Docker コンテナで動かしてみた

Posted at

はじめに

前回の記事「CI について調べたら思ったよりシンプルだったので、FastAPI で構築してみた」では、FastAPI プロジェクトに CI を構築してみました。

今回は、そのプロジェクトを Docker Desktop を使ってコンテナで動かしてみます。

普段は uvicorn main:app --reload で動かしていましたが、
Docker で動かすことで環境の統一や配布が楽になるので、
サクッと Dockerfile を書いてコンテナ化してみました。

今回は Docker Desktop を使って、シンプルな構成で動かしてみます。

概要

本記事では、FastAPI アプリケーションを Docker Desktop を使ってコンテナ化し、効率的な開発環境を構築する方法を解説します。

具体的な手順は以下の通りです:

  • Docker 環境の構築(Dockerfile、docker-compose.yml、.dockerignore の作成)
  • コンテナの起動と動作確認
  • 従来の開発フローとの比較

これにより、仮想環境の構築や依存関係のインストールが不要になり、docker-compose up --build 一発でアプリケーションを起動できるようになります。

プロジェクト構成

前回の記事で作成した FastAPI アプリをベースに進めます。
今回は Docker 化に焦点を当てるため、プロジェクト構成をシンプルにしています。

fastapi-test/
├── main.py             # FastAPIアプリケーション
├── requirements.txt    # 依存関係
└── tests/              # テストファイル
    ├── __init__.py
    └── test_main.py    # メインテスト

※ 前回の記事にあった client.py は削除して、今回は Docker 化に集中しています。

Docker 環境を作ってみる

Dockerfile の作成

まずはDockerfileを作成します。これが Docker イメージの「設計図」みたいなものです。

FROM python:3.11-slim

# 作業ディレクトリの設定
WORKDIR /app

# 依存関係をインストール
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# アプリケーションのコードをコピー
COPY . .

# ポートを公開
EXPOSE 8000

# FastAPIアプリを起動
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

docker-compose.yml の作成

毎回docker runコマンドを打つのは面倒なので、docker-compose.ymlも作りました。

version: "3.8"

services:
  fastapi:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - .:/app
    environment:
      - PYTHONUNBUFFERED=1
    restart: unless-stopped

volumesでローカルのコードをマウントしているので、
開発中にコードを変更すると即座にコンテナ内に反映されます。

.dockerignore で不要なファイルを除外

.dockerignoreファイルも作成しました。
これは.gitignoreの Docker 版みたいなものです。

# Python関連
__pycache__/
*.pyc

# Virtual environment
venv/

# OS
.DS_Store

# Git
.git
.gitignore
.github/

# Docker
Dockerfile
.dockerignore
docker-compose.yml

# Coverage
htmlcov/
.coverage
.pytest_cache/

実際にプロジェクトに存在するファイルだけを対象にして、
不要なファイルを Docker イメージに含めないことで、イメージサイズを小さく保てます。

実際に動かしてみる

コンテナの起動

これまでは uvicorn main:app --reload で起動していましたが、
今度は Docker コンテナとして起動してみます。

# ビルド & 起動
docker-compose up --build

# バックグラウンドで起動したい場合
docker-compose up -d --build

従来の方法との違い:

  • 仮想環境の作成・有効化が不要
  • 依存関係のインストールも不要
  • docker-compose up 一発で起動完了

コンテナが起動したらhttp://localhost:8000にアクセス。
ちゃんと動きました!

{ "message": "Hello, World!" }

Swagger UI もhttp://localhost:8000/docsで確認できます。

加算 API のテスト

POST /addエンドポイントもテストしてみました。

curl -X POST "http://localhost:8000/add" \
  -H "Content-Type: application/json" \
  -d '{"a": 10.5, "b": 20.3}'

レスポンス:

{
  "a": 10.5,
  "b": 20.3,
  "result": 30.8,
  "message": "10.5 + 20.3 = 30.8"
}

まとめ

今回は、前回作成した FastAPI アプリを Docker コンテナで動かしてみました。

今回やったこと:

  • Dockerfile の作成(Python 3.11 ベース)
  • docker-compose.yml でアプリの起動設定
  • .dockerignore で不要なファイルを除外
  • 実際にコンテナを起動して動作確認

従来の方法との比較:

# 従来の方法
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
uvicorn main:app --reload

# Docker化後
docker-compose up --build

手順がシンプルになり、環境構築も確実にできるようになりました。

次は、FastAPI アプリにデータベース(PostgreSQL)を追加して、
データベースも含めた Docker 構成を試してみたいと思います。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?