Docker Composeで実現!本番環境級の開発環境構築ガイド
Docker Composeで実現する、本番環境に近い開発環境構築術
「ローカル環境でウェブアプリケーションを動かす」というのは、単にdocker runを何回も叩く作業で終わることが多くなりました。しかし、実際のアプリケーションは、Webサーバー、データベース、キャッシュストアなど、複数のサービスが連携して動作することが一般的です。
この複数のサービスを、毎回の手動コマンドで立ち上げるのは非常に手間がかかり、再現性も低くなりがちです。ここで強力な出番となるのが、Docker Composeです。
本記事では、単に「Docker Composeとは何か」という説明にとどまらず、実際に多層的なアプリケーション(例えば、Webアプリケーション、PostgreSQLデータベース、Redisキャッシュを連携させる構成)を、どのようにdocker-compose.ymlという一つのファイルで管理し、実践的に運用するかを解説します。
そもそも、Docker Composeが解決することとは?
Docker Composeは、複数のコンテナを一つにまとめて、ネットワークやボリューム、環境変数といった複雑な設定を一元的に記述・管理するためのツールです。YAMLファイルに定義したサービス群を、docker-compose upという単一のコマンドで起動し、連携させるのが最大の利点です。
これが実現できる仕組みの核心は、単なるコンテナの集合ではなく、「サービスとしての依存関係」を定義できる点にあります。
実践例:Web API + DB + Cacheの構築
今回は、ユーザー認証を行うシンプルなWeb APIを想定し、以下の3つのサービスで構成される環境を立ち上げてみます。
web_api: アプリケーション本体(Pythonなど)db: データベース(PostgreSQL)cache: キャッシュストア(Redis)
Step 1: docker-compose.ymlの設計
全ての設定は、docker-compose.ymlファイルに記述します。このファイルこそが、開発環境の「設計図」となります。
ポイント解説
- build: .: web_apiはカレントディレクトリ(.)にあるDockerfileを使ってイメージをビルドすることを指定しています。
- depends_on:: web_apiが起動する前に、dbとcacheが最低限起動していることを保証しています。
- environment:: アプリケーションに必要な環境変数を設定しています。ここでは、サービス名(例:
dbやcache)をホスト名として利用できるのがDocker Composeの強力な点です。 - volumes:: データベースのデータ永続化(コンテナが消えてもデータが残るように)を実現しています。
Step 2: サービスの実行とライフサイクル管理
環境構築は、以下の単一コマンドで行えます。
docker-compose up -d
これは、全ての設定に基づき、必要なイメージのダウンロード、ネットワークの構築、コンテナの起動を自動で行います。`-d`はデタッチドモード(バックグラウンド)で実行するという意味です。
アプリケーションの実行状況を確認したい場合は、以下のコマンドが便利です。
docker-compose logs -f web_api
サービスを全て停止・削除する際は、必ずこのコマンドを使います。
docker-compose down
より実践的な応用テクニック
1. サービスの依存関係の明示 (Restart Policy)
もしdbサービスが一時的に利用不能になった場合、web_apiはエラーを吐き出し続けるかもしれません。サービス定義にrestart: alwaysを追加することで、コンテナが異常終了した場合に、Composeが自動で再起動を試みるように設定できます。
2. ポートマップの利用と調整
複数のサービスで同じポート番号を使いたい場合(例えば、ローカルのNginxとコンテナ内のNginx)、ポートを公開するportsの設定を工夫する必要があります。あるいは、特定のサービス(例:Web API)だけを外部に公開し、他のサービス(DBやCache)は内部通信専用にすることが重要です。
3. 開発専用のボリュームマウント
もしWeb APIのソースコード自体をローカルのPCからコンテナ内に反映させたい場合(開発時よくあるケース)は、ボリュームマウントを利用します。これにより、ローカルのコードを編集するだけで、コンテナ内のサービスが即座にその変更を読み込むことができます。
# web_api サービス部分に追記する例 web_api: # ... (省略) volumes: - ./src:/app/src - /app/logs:/var/log/app
まとめ
Docker Composeの真価は、「記述の簡潔さ」と「再現性の保証」にあります。本番環境と同じ構成を、docker-compose.ymlという単一の定義ファイルに落とし込むことで、開発チーム全体が「どの環境で何が動いているか」について迷うことがなくなり、開発効率と品質が格段に向上します。
まずは、自分が現在運用している最も複雑なローカル環境を、docker-compose.ymlファイルとして定義し直すことから試してみてはいかがでしょうか。
コメント
コメントを投稿