Docker Composeで本番に近い開発環境を構築する
Docker Composeで本番に近い開発環境を構築する
開発環境と本番環境の差異により、「ローカルでは動いていたのに、本番で動かない」という悩みを抱えたことはありませんか?このような問題を軽減する方法として、Docker Composeを活用した本番に近い開発環境の構築をご紹介します。
Docker Composeが必要な理由
近年のWebアプリケーション開発では、複数のマイクロサービスで構成されることが一般的です。アプリケーション、データベース、キャッシュレイヤーなど、複数のコンテナが連携して動作する環境を、ローカルマシンで簡単に再現できることは非常に重要です。
Docker Composeはこれらの複数のコンテナを一度に起動・管理できるツールで、本番環境により近い環境をローカルで実現できます。開発チーム全体で同じ環境を共有でき、「自分の環境では動く」という課題を解決します。
実践的なdocker-compose.ymlの構成例
まずは、Webアプリケーション開発における一般的な構成例を見てみましょう。
version: '3.8'
services:
web:
build:
context: .
dockerfile: Dockerfile
container_name: myapp_web
ports:
- "3000:3000"
environment:
- NODE_ENV=development
- DB_HOST=db
- REDIS_URL=redis://cache:6379
volumes:
- .:/app
- /app/node_modules
depends_on:
- db
- cache
networks:
- appnetwork
db:
image: postgres:15-alpine
container_name: myapp_db
environment:
POSTGRES_USER: appuser
POSTGRES_PASSWORD: password
POSTGRES_DB: appdb
volumes:
- db_data:/var/lib/postgresql/data
ports:
- "5432:5432"
networks:
- appnetwork
cache:
image: redis:7-alpine
container_name: myapp_cache
ports:
- "6379:6379"
networks:
- appnetwork
volumes:
db_data:
networks:
appnetwork:
driver: bridge
このファイルでは、WebアプリケーションとPostgreSQL、Redisが連携する環境を定義しています。
本番環境に近づけるための工夫
環境変数の適切な管理
本番環境と開発環境で異なる設定は、.envファイルで管理します。
DB_HOST=db
DB_USER=appuser
DB_PASSWORD=devpassword
LOG_LEVEL=debug
docker-composeではenv_fileで読み込めます:
services:
web:
env_file: .env
ただし、本番のシークレットキーを開発環境に含めないよう注意してください。
ボリュームマウントの活用
開発時はソースコードをボリュームマウントして、コード変更を即座にコンテナに反映させます。一方、本番環境ではイメージの完成後にデプロイするため、この点が異なります。開発専用のdocker-compose.override.ymlを作成し、本体のdocker-compose.ymlと組み合わせる方法が効果的です。
ネットワーク構成の統一
Docker Composeで定義したネットワーク(上記のappnetwork)により、サービス間通信がホスト名で解決されます。これは本番環境のサービスディスカバリーに近い動作です。
トラブルシューティングと運用のコツ
起動時にdepends_onを指定していても、サービスの完全な準備ができていないことがあります。このような場合は、ヘルスチェックを追加します:
db:
image: postgres:15-alpine
healthcheck:
test: ["CMD-SHELL", "pg_isready -U appuser"]
interval: 10s
timeout: 5s
retries: 5
また、複数人での開発時は、マイグレーションやシードデータの自動実行をentrypoint.shで制御するのも良い方法です。
まとめ
Docker Composeを活用することで、開発環境を本番に近づけることができます。これによりデプロイ前のトラブルを減らし、開発生産性を大幅に向上させることが可能です。最初の設定に時間がかかるかもしれませんが、チーム全体で一度構築すれば、その後の開発がスムーズになります。今からでも遅くありません。ぜひプロジェクトに導入してみてください。