Docker Compose は、ローカル開発用のマルチコンテナ Docker アプリケーションの定義と実行プロセスを簡素化する強力なツールです。これにより、単一の docker-compose.yml ファイルでアプリケーションのサービス、ネットワーク、ボリュームを設定でき、単一のコマンドで開発環境全体を起動できます。
ローカル開発で Docker Compose を使用する理由
- 簡単なセットアップ: 複数の依存関係(例:Web アプリ、データベース、キャッシュサービス)を持つ複雑な開発環境のセットアッププロセスを合理化します。
- 再現可能な環境: ローカル環境が本番環境と密接に一致することを保証し、「私のマシンでは動作します」という問題を減らします。
- 依存関係管理: ホストマシン上で競合することなく、さまざまなバージョンのサービス(例:データベース、メッセージキュー)を簡単に管理できます。
- オンボーディング: 新しい開発者は、単一のコマンドでプロジェクトを迅速に実行できます。
主要な概念
docker-compose.yml(またはcompose.yaml): この YAML ファイルは Docker Compose の中心です。アプリケーションを構成するサービス、ネットワーク、ボリュームを定義します。- サービス (Services):
docker-compose.yml内の各サービスはコンテナを表します。たとえば、アプリケーション用のwebサービス、データベース用のdbサービス、キャッシュ用のredisサービスがある場合があります。 - ネットワーク (Networks): Docker Compose はデフォルトでアプリケーションに単一のネットワークを設定し、サービスがサービス名をホスト名として使用して互いに通信できるようにします。
- ボリューム (Volumes): 永続的なデータストレージ(例:データベースデータ)や、開発中のライブリロードを可能にするためにローカルコードをコンテナにマウントするために使用されます。
基本的なワークフローとコマンド
-
docker-compose.ymlでサービスを定義する: プロジェクトのルートディレクトリにdocker-compose.ymlファイルを作成します。Redis キャッシュに接続された Python Flask Web アプリケーションの簡単な例を次に示します。
```yaml
docker-compose.yml
version: '3.8' # Compose ファイル形式のバージョンを指定します services: web: build: . # 現在のディレクトリの Dockerfile からビルドします ports: - "8000:5000" # ホストポート 8000 をコンテナポート 5000 にマッピングします volumes: - .:/code # 現在のディレクトリをコンテナの /code ディレクトリにマウントします environment: FLASK_ENV: development # 環境変数を設定します REDIS_HOST: redis # サービス名 'redis' をホスト名として使用します redis: image: "redis:alpine" # 公式 Redis イメージを使用します ports: - "6379:6379" # Redis ポートをマッピングします volumes: - redis_data:/data # Redis データを永続化します volumes: redis_data: # 名前付きボリュームを定義します ```
-
アプリケーションをビルドして実行する: ターミナルでプロジェクトディレクトリに移動し、次を実行します。
bash docker compose upこのコマンドは、イメージをビルドし(必要な場合)、docker-compose.ymlファイルで定義されたすべてのサービスを開始します。サービスをバックグラウンド(分離モード)で実行するには、次を使用します。
bash docker compose up -d -
サービスを停止および削除する: 開発が完了したら、Compose によって作成されたすべてのコンテナ、ネットワーク、およびボリュームを停止および削除します。
bash docker compose down名前付きボリュームも削除するにはdocker compose down -vを使用します(これにより永続データが削除されます)。 -
ログを表示する: 実行中のサービスのログを表示するには:
bash docker compose logs [service_name] # 例:docker compose logs web # -f を使用してリアルタイムでログをフォローします: # docker compose logs -f web -
サービス内でコマンドを実行する:
execを使用して、実行中のコンテナ内でコマンドを実行できます。bash docker compose exec web bash # これは 'web' サービスコンテナ内で bash シェルを開きます。
ローカル開発のベストプラクティス
- ライブリロードのためのボリュームマウント: ローカルコードディレクトリをコンテナにマウントします (
volumes: - .:/code)。これにより、イメージを再ビルドせずにコードの変更が即座に反映されます。 - 環境変数:
.envファイルを使用して環境固有の変数(API キーやデータベース認証情報など)を管理し、docker-compose.ymlファイルやバージョン管理から除外します。 - ヘルスチェック: 依存サービスが開始される前にサービスが準備完了であることを確認するために、
docker-compose.ymlでヘルスチェックを実装します。 - 軽量イメージ: 最小限のベースイメージ(Alpine バリアントなど)とマルチステージビルドを使用して、イメージサイズを小さく保ちます。
これらの手順に従うことで、Docker Compose を効果的に活用し、マルチコンテナ アプリケーション用の整合性の取れた、分離された、簡単に管理できるローカル開発環境を作成できます。