Docker Compose による Python アプリケーションとデータベースの連携
Docker Compose は、複数の Docker コンテナを定義し、実行するためのツールです。これにより、Python アプリケーションとデータベースのような、互いに連携が必要な複数のサービスを、単一の設定ファイルで管理できます。このドキュメントでは、Docker Compose を用いて Python アプリケーションとデータベースを連携させる方法について、基本的な設定から応用的な考慮事項までを包括的に解説します。
Docker Compose の基本概念
Docker Compose は、docker-compose.yml という名前の YAML ファイルでサービスを定義します。このファイルには、各サービスのイメージ、ポートマッピング、ボリューム、ネットワーク、環境変数などが記述されます。
`docker-compose.yml` ファイルの構造
基本的な docker-compose.yml ファイルは、以下のような構造を持ちます。
version: '3.8'
services:
python_app:
build: ./python_app
ports:
- "5000:5000"
environment:
DATABASE_URL: postgresql://user:password@db:5432/mydatabase
depends_on:
- db
db:
image: postgres:13
environment:
POSTGRES_DB: mydatabase
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:
この例では、python_app という名前の Python アプリケーションサービスと、db という名前の PostgreSQL データベースサービスが定義されています。version は Compose ファイルのバージョンを指定します。services キー以下に、各サービスの設定を記述します。
Python アプリケーションの設定
コンテナイメージのビルド
python_app サービスでは、build: ./python_app と指定しています。これは、docker-compose.yml ファイルと同じディレクトリにある python_app ディレクトリ内の Dockerfile を使用して、Python アプリケーションの Docker イメージをビルドすることを示しています。
python_app/Dockerfile の例:
FROM python:3.9-slim WORKDIR /app COPY requirements.txt requirements.txt RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD ["python", "app.py"]
この Dockerfile は、Python 3.9 のスリムイメージをベースに、依存関係をインストールし、アプリケーションコードをコピーして、app.py を実行するように設定しています。
ポートマッピング
ports: - "5000:5000" は、ホストマシンのポート 5000 を、コンテナ内のポート 5000 にマッピングします。これにより、ホストマシンから http://localhost:5000 で Python アプリケーションにアクセスできるようになります。
環境変数
environment: DATABASE_URL: postgresql://user:password@db:5432/mydatabase は、Python アプリケーションにデータベース接続情報を環境変数として渡します。ここで db は、Docker Compose が内部で作成するデータベースコンテナのサービス名に解決されます。この形式の URL は、多くの Python Web フレームワーク(Flask, Django など)や ORM(SQLAlchemy など)で直接利用できます。
依存関係の指定
depends_on: - db は、db サービスが起動してから python_app サービスを起動するように指示します。これにより、Python アプリケーションがデータベースに接続しようとする際に、データベースが既に利用可能になっていることを保証します。ただし、depends_on はコンテナの起動順序を指定するだけで、データベースサービスが完全に初期化されたことを保証するわけではない点に注意が必要です。データベースが完全に準備されるまで待機するロジックをアプリケーション側で実装する必要がある場合があります。
データベースの設定
イメージの指定
db: image: postgres:13 は、PostgreSQL バージョン 13 の公式 Docker イメージを使用することを指定します。他にも MySQL, Redis, MongoDB など、様々なデータベースの公式イメージが利用可能です。
環境変数による初期設定
environment: POSTGRES_DB: mydatabase POSTGRES_USER: user POSTGRES_PASSWORD: password は、PostgreSQL コンテナ起動時に、データベース名、ユーザー名、パスワードを設定します。これらの値は、python_app サービスの DATABASE_URL と一致させる必要があります。
ボリュームによるデータ永続化
volumes: - db_data:/var/lib/postgresql/data は、データベースのデータを永続化するために、Docker ボリュームを使用します。db_data という名前のボリュームが作成され、コンテナ内の /var/lib/postgresql/data ディレクトリ(PostgreSQL のデータディレクトリ)にマウントされます。これにより、コンテナが停止・削除されても、データベースのデータは失われません。
volumes: db_data: は、db_data という名前のボリュームを定義します。Docker Compose は、このボリュームを自動的に管理します。
Docker Compose の実行
docker-compose.yml ファイルを作成したら、以下のコマンドでアプリケーションを起動できます。
docker-compose up: コンテナをバックグラウンドで起動します。docker-compose up -d: コンテナをバックグラウンドで起動します。docker-compose down: 起動したコンテナ、ネットワーク、ボリュームを停止・削除します。docker-compose ps: 起動中のサービスを表示します。docker-compose logs: サービスのログを表示します。
応用的な考慮事項
ヘルスチェック
depends_on だけではデータベースの準備完了を保証できないため、より堅牢な連携のためにはヘルスチェックを導入することが推奨されます。Docker Compose の healthcheck 設定を使用することで、コンテナのヘルス状態を監視できます。
services:
python_app:
# ... other settings
depends_on:
db:
condition: service_healthy
db:
image: postgres:13
# ... other settings
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d mydatabase"]
interval: 10s
timeout: 5s
retries: 5
この設定では、PostgreSQL コンテナが pg_isready コマンドで接続可能になるまで、python_app の起動を待機させます。
ネットワーク
Docker Compose は、サービスごとにデフォルトのネットワークを作成します。これにより、サービス間で名前解決が可能になります。例えば、python_app から db というホスト名でデータベースにアクセスできます。
カスタムネットワーク
必要に応じて、カスタムネットワークを定義し、サービスをそのネットワークに接続することも可能です。
services:
# ...
networks:
my_network:
driver: bridge
services:
python_app:
networks:
- my_network
db:
networks:
- my_network
環境変数の外部化
機密情報(パスワードなど)は、.env ファイルに記述し、Docker Compose から参照することが推奨されます。
.env ファイル:
POSTGRES_USER=myuser POSTGRES_PASSWORD=mypassword POSTGRES_DB=mydb
docker-compose.yml ファイル:
services:
db:
image: postgres:13
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
Docker Compose は、.env ファイルの変数を自動的に読み込み、置換します。
データベースマイグレーション
データベーススキーマの管理には、データベースマイグレーションツール(Alembic for SQLAlchemy, Django migrations など)を使用するのが一般的です。これらのツールを Docker Compose のワークフローに組み込むことで、データベースの変更をコードと共に管理できます。
例えば、Python アプリケーションの起動時にマイグレーションを実行するスクリプトを作成し、それを command または entrypoint で指定する方法があります。
まとめ
Docker Compose を使用することで、Python アプリケーションとデータベースの連携を効率的かつ再現性高く構築できます。docker-compose.yml ファイルでサービス定義、依存関係、ネットワーク、ボリュームなどを一元管理することで、開発環境のセットアップが容易になり、チーム開発における環境差異を最小限に抑えることができます。ヘルスチェックや環境変数の外部化といった応用的な機能も活用することで、より堅牢でセキュアなアプリケーション開発が可能になります。
