Dockerによるマルチcontainerアプリケーションのセットアップ

docker runコマンドで完全なマルチcontainerアプリケーションスタックをセットアップする方法を学びます。ネットワーキング、共有volume、環境設定、依存サービスのオーケストレーションについて解説します。

Real-World Stacks

詳細な説明

完全なアプリケーションスタックの構築

ほとんどの実際のアプリケーションは複数のサービスで構成されます: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は依存関係の順序で起動する必要があります:

  1. データベース(依存関係なし)
  2. キャッシュ(依存関係なし)
  3. API(データベースとキャッシュに依存)
  4. 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ネットワーク上で通信し、再起動後もデータが永続化される場合に使用します。

試してみる — Docker Run Command Builder

フルツールを開く