はじめに
前回の記事「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 構成を試してみたいと思います。