Dockerによるマルチcontainerアプリケーションのセットアップ
docker runコマンドで完全なマルチcontainerアプリケーションスタックをセットアップする方法を学びます。ネットワーキング、共有volume、環境設定、依存サービスのオーケストレーションについて解説します。
詳細な説明
完全なアプリケーションスタックの構築
ほとんどの実際のアプリケーションは複数のサービスで構成されます:Webサーバー、API、データベース、キャッシュ。Docker Composeがマルチcontainerオーケストレーションの標準ツールですが、docker runでcontainerを接続する方法を理解することで、Dockerのネットワーキングとリンクの仕組みに関するより深い知識が得られます。
スタックの例:Web + API + Database + Cache
4つのcontainerスタックをステップバイステップで構築しましょう:
ステップ1:共有ネットワークを作成
docker network create myapp-net
ステップ2:データベースを起動
docker run -d \
--name myapp-db \
--network myapp-net \
--restart unless-stopped \
-e POSTGRES_USER=app \
-e POSTGRES_PASSWORD=dbpass123 \
-e POSTGRES_DB=myapp \
-v myapp-pgdata:/var/lib/postgresql/data \
postgres:16
ステップ3:キャッシュを起動
docker run -d \
--name myapp-cache \
--network myapp-net \
--restart unless-stopped \
--memory 256m \
redis:7-alpine \
redis-server --maxmemory 128mb --maxmemory-policy allkeys-lru
ステップ4:APIサーバーを起動
docker run -d \
--name myapp-api \
--network myapp-net \
--restart unless-stopped \
-e DATABASE_URL=postgres://app:dbpass123@myapp-db:5432/myapp \
-e REDIS_URL=redis://myapp-cache:6379 \
-e NODE_ENV=production \
my-api-image
ステップ5:Webサーバー(リバースプロキシ)を起動
docker run -d \
--name myapp-web \
--network myapp-net \
--restart unless-stopped \
-p 80:80 \
-p 443:443 \
-v $(pwd)/nginx.conf:/etc/nginx/conf.d/default.conf:ro \
nginx:alpine
サービスの起動順序
containerは依存関係の順序で起動する必要があります:
- データベース(依存関係なし)
- キャッシュ(依存関係なし)
- API(データベースとキャッシュに依存)
- Web(APIに依存)
Docker Composeとは異なり、docker runには組み込みの依存関係管理がありません。アプリケーションは起動中の一時的な利用不可に対応するために接続リトライロジックを実装する必要があります。
ヘルスチェック
サービスが実際に準備できていることを確認するためにヘルスチェックを追加します:
docker run -d \
--name myapp-db \
--network myapp-net \
--health-cmd="pg_isready -U app" \
--health-interval=10s \
--health-timeout=5s \
--health-retries=5 \
-e POSTGRES_USER=app \
-e POSTGRES_PASSWORD=dbpass123 \
postgres:16
クリーンアップスクリプト
完全なティアダウンスクリプト:
#!/bin/bash
docker stop myapp-web myapp-api myapp-cache myapp-db
docker rm myapp-web myapp-api myapp-cache myapp-db
docker network rm myapp-net
# 必要に応じてvolumeを削除:
# docker volume rm myapp-pgdata
Docker Composeへの移行タイミング
以下の場合はdocker runスクリプトを使用してください:
- 学習と実験
- シンプルな2container構成
- カスタムオーケストレーションを持つCI/CDパイプライン
以下の場合はDocker Composeに切り替えてください:
- 定期的に一緒に起動する3つ以上のcontainerがある場合
- 依存関係の順序付けとヘルスチェックの統合が必要な場合
- 複数のチームメンバーが再現可能なセットアップを必要とする場合
- 環境変数が複雑で環境固有の場合
スタックのモニタリング
# 実行中のすべてのcontainerを表示
docker ps
# リソース使用量を表示
docker stats
# すべてのcontainerのログを確認
docker logs myapp-web
docker logs myapp-api
docker logs myapp-db
docker logs myapp-cache
ユースケース
Webサーバー、API、データベース、キャッシュを備えた完全なローカル開発スタックをセットアップし、すべてのサービスが内部Dockerネットワーク上で通信し、再起動後もデータが永続化される場合に使用します。