Docker Compose ローカル開発環境構築 実践
はじめに
事業会社などで行われるモダンなWeb開発において、開発環境の構築は重要な要素です。従来の開発スタイルでは、各開発者のローカルマシンに様々なミドルウェアやライブラリを個別にインストール・設定する必要があり、環境差異による問題やセットアップの手間が課題となりがちでした。
近年では、コンテナ技術を活用することで、開発環境をコードとして管理し、開発者間で容易に共有・再現することが可能になっています。特にDocker Composeは、複数のコンテナを連携させてアプリケーションの実行環境を定義し、一括して管理できるツールとして広く利用されています。
本記事では、Docker Composeを用いたローカル開発環境の構築方法に焦点を当て、そのメリットや具体的な設定、実践的な利用法について解説します。これにより、モダンな開発ワークフローへのスムーズな移行を支援できれば幸いです。
なぜローカル開発環境にDocker Composeが必要なのか
Docker Composeをローカル開発環境に導入することには、いくつかの明確なメリットがあります。
環境差異の解消
最も大きなメリットの一つは、開発者間や開発環境と本番環境の間で生じる環境差異を最小限に抑えられる点です。Dockerコンテナは、OSやインストールされているソフトウェア、設定など、実行に必要な全てを含んだ自己完結型のパッケージです。Docker Composeを使ってコンテナのバージョンや設定をコード(docker-compose.yml
ファイル)として管理することで、全ての開発者が全く同じ環境をローカルに再現できます。これにより、「自分の環境では動くのに、他の人の環境では動かない」といった問題を大幅に削減できます。
依存関係の容易な管理
多くのアプリケーションは、データベース、キャッシュサーバー、メッセージキューなど、複数のミドルウェアに依存しています。これらの依存関係を個別にローカルマシンにインストール・設定するのは手間がかかり、バージョン管理も煩雑になりがちです。Docker Composeを使用すれば、これらの依存関係をそれぞれ別のコンテナとして定義し、docker-compose.yml
ファイル一つでまとめて管理・起動できます。不要になったら、コマンド一つでまとめて停止・削除することも容易です。
オンボーディングの効率化
新しいメンバーがプロジェクトに参加した際、開発環境のセットアップは最初のハードルとなることが多いです。Docker Composeを使っていれば、開発環境のセットアップはDockerとDocker Composeをインストールし、リポジトリをクローンして特定のコマンドを実行するだけで完了するようになります。これにより、新しいメンバーがすぐに開発に着手できるようになり、オンボーディングにかかる時間と労力を大幅に削減できます。
再現性と廃棄性
環境をコードとして定義することで、特定の状態の環境をいつでも再現できるようになります。また、開発中に環境が壊れてしまったり、別のブランチで作業するために環境を切り替えたい場合でも、既存の環境を簡単に廃棄し、新しい環境を迅速に再構築できます。
Docker Composeの基本的な使い方
Docker Composeは、主にdocker-compose.yml
というYAML形式のファイルを使用して、アプリケーションを構成するサービス(コンテナ)とその設定を定義します。
基本的なdocker-compose.yml
ファイルの構成要素を見てみましょう。
version: '3.8' # Docker Composeファイルのバージョンを指定
services:
web: # サービス名(コンテナ名として利用されることが多い)
build: . # Dockerfileがあるディレクトリを指定し、イメージをビルド
ports:
- "8000:80" # ホストの8000番ポートをコンテナの80番ポートにマッピング
volumes:
- .:/app # カレントディレクトリをコンテナ内の/appにマウント(コードの同期)
depends_on:
- db # このサービスがdbサービスに依存していることを示す
environment: # コンテナ内で利用できる環境変数を設定
DATABASE_URL: postgres://user:password@db:5432/mydatabase
db:
image: postgres:14 # Docker Hubなどから取得するイメージを指定
volumes:
- db_data:/var/lib/postgresql/data # データをホストマシンに永続化するためのボリューム
environment:
POSTGRES_DB: mydatabase
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes: # 永続化に使用するボリュームを定義
db_data:
この例では、web
とdb
という2つのサービスを定義しています。
web
サービスは、現在のディレクトリにあるDockerfileを使ってイメージをビルドし、ホストの8000番ポートとコンテナの80番ポートをマッピングします。また、カレントディレクトリのコードをコンテナ内の/app
にマウントすることで、コードの変更が即座にコンテナに反映されるようにしています(ホットリロード設定が別途必要)。db
サービスに依存しており、環境変数でデータベース接続情報を設定しています。db
サービスは、公式のPostgreSQLイメージを使用し、データベースのデータをdb_data
という名前のボリュームに永続化します。環境変数でデータベース名や認証情報を設定しています。
ファイルを作成したら、ターミナルでそのファイルがあるディレクトリに移動し、以下のコマンドで環境を起動できます。
docker-compose up -d
-d
オプションを付けることで、バックグラウンドでコンテナが実行されます。環境を停止するには以下のコマンドを使用します。
docker-compose down
実践的な利用のポイント
ローカル開発環境でDocker Composeをより効果的に活用するための実践的なポイントをいくつかご紹介します。
Dockerfileとの連携
アプリケーションのサービスを定義する際には、既存のDockerイメージを利用するだけでなく、プロジェクト固有のDockerfileを作成し、それをDocker Composeからビルドして利用することが一般的です。これにより、特定のOS環境、言語バージョン、ライブラリ依存関係などを細かくコントロールできます。
# docker-compose.yml
services:
web:
build:
context: ./app # Dockerfileがあるディレクトリ
dockerfile: Dockerfile # Dockerfileの名前
...
ボリュームを使ったコードの同期とデータ永続化
開発中のコードは頻繁に変更されます。ローカルマシンのコードとコンテナ内のコードを同期させるために、バインドマウント(volumes: - .:/app
のような指定)を使用します。これにより、ローカルでコードを編集すると、コンテナ内のファイルも同時に更新され、ビルドや再起動、ホットリロードなどによって変更をすぐに確認できます。
データベースのデータなど、コンテナが停止・削除されても保持しておきたいデータには、名前付きボリューム(volumes: db_data:/var/lib/postgresql/data
のような指定と、volumes:
セクションでの定義)を使用します。これはDockerが管理する領域にデータが保存されるため、コンテナのライフサイクルから独立してデータを保持できます。
環境変数の管理
データベース接続情報やAPIキーなど、環境に依存する設定値は環境変数として管理することが推奨されます。Docker Composeでは、environment:
セクションで環境変数を直接記述するほか、.env
ファイルを使用して環境変数を定義することも可能です。.env
ファイルに設定を記述しておくと、Docker Composeはそのファイルを自動的に読み込み、docker-compose.yml
内で参照できます。
# .envファイル
DATABASE_USER=myuser
DATABASE_PASSWORD=mypassword
# docker-compose.yml
services:
web:
environment:
DATABASE_USER: ${DATABASE_USER} # .envファイルから参照
DATABASE_PASSWORD: ${DATABASE_PASSWORD}
...
.env
ファイルは機密情報を含む場合があるため、バージョン管理システムからは除外することが一般的です。
複数のComposeファイルの利用
開発環境、テスト環境など、目的によって環境設定を少し変更したい場合があります。Docker Composeでは、複数のdocker-compose.yml
ファイルを組み合わせて使用できます。例えば、基本的な設定を定義したdocker-compose.yml
と、開発用の追加設定を定義したdocker-compose.dev.yml
を作成し、以下のように組み合わせて起動できます。
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d
これにより、設定の重複を避けつつ、環境ごとの差分を管理できます。
メンターとの活用
ローカル開発環境の構築は、特にSIerでの経験が長く、モダンな開発手法や環境に馴染みがない方にとって、最初のつまづきやすいポイントの一つです。DockerやDocker Composeの概念理解、Dockerfileの作成、docker-compose.yml
の書き方など、学ぶべきことは多岐にわたります。
このような状況で、経験豊富なメンターに相談することは非常に有効です。メンターは、あなたの現在のスキルレベルや目標とする技術スタックに合わせて、最適な学習リソースの提示、具体的な設定ファイルのレビュー、実践的なアドバイスやトラブルシューティングのサポートをしてくれます。
例えば、
- あなたのプロジェクトに必要なサービスの洗い出しと、それぞれのコンテナイメージの選定
- 効率的なDockerfileと
docker-compose.yml
の書き方に関するレビュー - ホットリロード設定やデバッグ方法など、開発効率を高めるためのテクニック
- 環境構築で発生したエラーの原因究明と解決策の提示
といった具体的なサポートを受けることができます。一人で試行錯誤するよりも、メンターの導きを得ることで、より早く、より確実にモダンな開発環境を構築し、次のステップに進むことが可能になります。
まとめ
Docker Composeを使ったローカル開発環境の構築は、モダンなWeb開発を行う上で非常に強力な手法です。環境差異の解消、依存関係の容易な管理、オンボーディングの効率化など、多くのメリットを享受できます。
本記事で解説した基本的な使い方や実践的なポイントを参考に、ぜひご自身のプロジェクトでDocker Composeを活用した開発環境構築に挑戦してみてください。もし学習や実装の過程で壁にぶつかった際は、メンターという存在を頼ることも、成長への有効なアプローチの一つであることを覚えておいていただければと思います。
モダンな開発環境を手にすることで、よりスムーズで効率的な開発ワークフローを実現し、事業会社で求められるスキル習得へ繋げていきましょう。