私のメンター探しログ

Docker Compose ローカル開発環境構築 実践

Tags: Docker, 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:

この例では、webdbという2つのサービスを定義しています。

ファイルを作成したら、ターミナルでそのファイルがあるディレクトリに移動し、以下のコマンドで環境を起動できます。

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の書き方など、学ぶべきことは多岐にわたります。

このような状況で、経験豊富なメンターに相談することは非常に有効です。メンターは、あなたの現在のスキルレベルや目標とする技術スタックに合わせて、最適な学習リソースの提示、具体的な設定ファイルのレビュー、実践的なアドバイスやトラブルシューティングのサポートをしてくれます。

例えば、

といった具体的なサポートを受けることができます。一人で試行錯誤するよりも、メンターの導きを得ることで、より早く、より確実にモダンな開発環境を構築し、次のステップに進むことが可能になります。

まとめ

Docker Composeを使ったローカル開発環境の構築は、モダンなWeb開発を行う上で非常に強力な手法です。環境差異の解消、依存関係の容易な管理、オンボーディングの効率化など、多くのメリットを享受できます。

本記事で解説した基本的な使い方や実践的なポイントを参考に、ぜひご自身のプロジェクトでDocker Composeを活用した開発環境構築に挑戦してみてください。もし学習や実装の過程で壁にぶつかった際は、メンターという存在を頼ることも、成長への有効なアプローチの一つであることを覚えておいていただければと思います。

モダンな開発環境を手にすることで、よりスムーズで効率的な開発ワークフローを実現し、事業会社で求められるスキル習得へ繋げていきましょう。