はじめに
前回は、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 化に集中しています。
1. Docker 環境を作ってみる
1-1. 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"]
1-2. 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でローカルのコードをマウントしているので、
開発中にコードを変更すると即座にコンテナ内に反映されます。
1-3. .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 イメージに含めないことで、イメージサイズを小さく保てます。
2. 実際に動かしてみる
2-1. コンテナの起動
これまでは 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で確認できます。
2-2. 加算 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