Docker Compose

複数コンテナの定義と管理

Docker Composeとは

Docker Composeは複数コンテナのアプリケーションをYAMLで定義し、 一括で管理するツールです。開発環境の構築や、 関連するサービス群のローカルテストに適しています。

基本構成

docker-compose.yml
yaml
1version: '3.8'
2
3services:
4 web:
5 build: .
6 ports:
7 - "3000:3000"
8 environment:
9 - NODE_ENV=development
10 - DATABASE_URL=postgres://db:5432/app
11 depends_on:
12 - db
13 - redis
14 volumes:
15 - ./src:/app/src
16 restart: unless-stopped
17
18 db:
19 image: postgres:15
20 environment:
21 POSTGRES_DB: app
22 POSTGRES_USER: user
23 POSTGRES_PASSWORD: password
24 volumes:
25 - db-data:/var/lib/postgresql/data
26 ports:
27 - "5432:5432"
28
29 redis:
30 image: redis:7-alpine
31 ports:
32 - "6379:6379"
33
34volumes:
35 db-data:

主要な設定項目

image / build

image: 既存イメージを使用、build: Dockerfileからビルド

ports

ポートマッピング。"ホスト:コンテナ"

volumes

ボリュームマウント。名前付きボリュームまたはバインドマウント

environment / env_file

環境変数。直接指定または.envファイルから

depends_on

起動順序の依存関係。ただしサービスの準備完了は待たない

networks

カスタムネットワーク。サービス間の通信制御

Composeコマンド

1# 起動
2docker compose up # フォアグラウンド
3docker compose up -d # バックグラウンド
4docker compose up --build # ビルドしてから起動
5
6# 停止
7docker compose down # 停止・コンテナ削除
8docker compose down -v # ボリュームも削除
9docker compose stop # 停止のみ
10
11# 状態確認
12docker compose ps
13docker compose logs
14docker compose logs -f web # 特定サービスをフォロー
15
16# スケール
17docker compose up -d --scale web=3
18
19# 実行
20docker compose exec web bash # コンテナ内でコマンド
21docker compose run web npm test # 新規コンテナで実行
22
23# ビルド
24docker compose build
25docker compose build --no-cache

開発環境向け設定

docker-compose.yml
yaml
1services:
2 web:
3 build:
4 context: .
5 dockerfile: Dockerfile.dev
6 volumes:
7 # ソースコードをマウント(ホットリロード)
8 - ./src:/app/src
9 # node_modulesはボリュームで分離
10 - node_modules:/app/node_modules
11 environment:
12 - NODE_ENV=development
13 - DEBUG=true
14 # ファイル変更を監視
15 develop:
16 watch:
17 - action: sync
18 path: ./src
19 target: /app/src
20 - action: rebuild
21 path: package.json
22
23volumes:
24 node_modules:

複数環境の管理

1# ファイル構成
2# docker-compose.yml # 基本設定
3# docker-compose.override.yml # 開発用(自動読み込み)
4# docker-compose.prod.yml # 本番用
5
6# 本番用で起動
7docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
8
9# 環境変数ファイル
10# .env ファイルは自動読み込み
docker-compose.prod.yml
yaml
1services:
2 web:
3 image: myapp:latest # ビルド済みイメージを使用
4 restart: always
5 deploy:
6 resources:
7 limits:
8 cpus: '1'
9 memory: 512M

ヘルスチェック

1services:
2 web:
3 image: myapp
4 healthcheck:
5 test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
6 interval: 30s
7 timeout: 10s
8 retries: 3
9 start_period: 40s
10 depends_on:
11 db:
12 condition: service_healthy
13
14 db:
15 image: postgres:15
16 healthcheck:
17 test: ["CMD-SHELL", "pg_isready -U postgres"]
18 interval: 10s
19 timeout: 5s
20 retries: 5

SRE/インフラ観点

用途

  • 開発環境: ローカルでの開発・テスト
  • CI/CD: テスト環境の構築
  • 小規模本番: 単一ホストでのデプロイ
  • • 大規模本番には Kubernetes を検討

注意点

  • • depends_on はサービスの準備完了を待たない
  • • ヘルスチェックと condition を組み合わせる
  • • 機密情報は .env に分離し、Git管理外に