Docker Compose
複数のコンテナを定義・管理するDocker Composeの使い方を学びます。開発環境からテスト環境まで、複数サービスの構成を効率的に管理できます。
目次
Docker Composeとは
概要
Docker Composeは、複数のコンテナを1つのYAMLファイルで定義し、一括で管理するツールです。
従来(個別にコンテナ起動):
docker network create mynet
docker run -d --name db --network mynet postgres:16
docker run -d --name redis --network mynet redis:7
docker run -d --name app --network mynet -p 8080:8080 my-app
Docker Compose(1コマンドで起動):
docker compose up -d
バージョン
# Docker Compose V2(推奨)
# バージョン指定は不要(最新仕様が自動適用)
services:
app:
image: my-app:latest
基本構文
最小構成
# docker-compose.yml
services:
app:
image: eclipse-temurin:21-jre-alpine
ports:
- "8080:8080"
基本コマンド
# コンテナの起動
docker compose up -d
# コンテナの停止
docker compose down
# ログの確認
docker compose logs -f
# コンテナの状態確認
docker compose ps
# 特定サービスの再起動
docker compose restart app
# ビルドして起動
docker compose up -d --build
サービス定義
完全なサービス定義例
services:
idp-server:
# イメージ指定(ビルドしない場合)
image: my-idp-server:latest
# またはビルド設定
build:
context: .
dockerfile: Dockerfile
args:
- JAVA_VERSION=21
# コンテナ名
container_name: idp-server
# ホスト名
hostname: idp-server
# ポートマッピング
ports:
- "8080:8080" # ホスト:コンテナ
- "127.0.0.1:9090:9090" # 特定IPにバインド
# 環境変数
environment:
- SPRING_PROFILES_ACTIVE=docker
- DATABASE_URL=jdbc:postgresql://db:5432/idp
# 環境変数ファイル
env_file:
- .env
- .env.local
# ボリューム
volumes:
- ./logs:/app/logs
- app-data:/app/data
# ネットワーク
networks:
- backend
- frontend
# リソース制限
deploy:
resources:
limits:
cpus: '2.0'
memory: 4G
reservations:
cpus: '0.5'
memory: 1G
# 再起動ポリシー
restart: unless-stopped
# ヘルスチェック
healthcheck:
test: ["CMD", "wget", "-q", "--spider", "http://localhost:8080/actuator/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
# 依存関係
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
ビルド設定の詳細
services:
app:
build:
# ビルドコンテキスト
context: ./app
# Dockerfile指定
dockerfile: Dockerfile.prod
# ビルド引数
args:
- APP_VERSION=${APP_VERSION:-1.0.0}
- BUILD_DATE=${BUILD_DATE}
# ターゲットステージ(マルチステージビルド)
target: production
# キャッシュ設定
cache_from:
- my-app:latest
# ラベル
labels:
- "com.example.version=1.0.0"
# イメージ名とタグ
image: my-app:${TAG:-latest}
ネットワーク
ネットワーク定義
services:
app:
networks:
- frontend
- backend
db:
networks:
- backend
nginx:
networks:
- frontend
networks:
frontend:
driver: bridge
backend:
driver: bridge
# 内部ネットワーク(外部からアクセス不可)
internal: true
ネットワーク構成図
┌─────────────────────────────────────────────────────────────┐
│ Docker Host │
│ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ frontend network │ │
│ │ ┌─────────┐ ┌─────────┐ │ │
│ │ │ nginx │ ◀─────▶ │ app │ │ │
│ │ └────┬────┘ └────┬────┘ │ │
│ └───────│───────────────────│──────────────────────────┘ │
│ │ │ │
│ ▼ │ │
│ :80, :443 │ │
│ │ │
│ ┌───────────────────────────│──────────────────────────┐ │
│ │ backend network (internal) │ │
│ │ ┌───────┴───────┐ │ │
│ │ │ app │ │ │
│ │ └───────┬───────┘ │ │
│ │ ┌───────────────┼───────────────┐ │ │
│ │ ▼ ▼ ▼ │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────── ──┐ │ │
│ │ │ db │ │ redis │ │ kafka │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
サービスディスカバリ
services:
app:
environment:
# サービス名でアクセス可能
- DATABASE_HOST=db
- REDIS_HOST=redis
db:
# app からは "db" でアクセス可能
image: postgres:16
ボリューム
ボリュームの種類
services:
db:
volumes:
# 名前付きボリューム(データ永続化)
- postgres-data:/var/lib/postgresql/data
# バインドマウント(ホストのパスをマウント)
- ./init-scripts:/docker-entrypoint-initdb.d:ro
# 匿名ボリューム
- /var/log/postgresql
volumes:
postgres-data:
# ドライバー指定
driver: local
# 外部で作成済みのボリュームを使用
existing-volume:
external: true
ボリュームの使い分け
┌─────────────────────────────────────────────────────────────┐
│ ボリュームの種類 │
├─────────────────────────────────────────────────────────────┤
│ 名前付きボリューム (Named Volume) │
│ - データベースのデータ │
│ - アップロードファイル │
│ - Dockerが管理、ホストから独立 │
│ │
│ バインドマウント (Bind Mount) │
│ - 開発時のソースコード │
│ - 設定ファイル │
│ - ログ出力 │
│ - ホストのパスを直接マウント │
│ │
│ tmpfs マウント │
│ - 一時的なキャッシュ │
│ - 機密情報(メモリ上のみ) │
│ - コンテナ停止で消える │
└─────────────────────────────────────────────────────────────┘
環境変数
設定方法
services:
app:
# 直接指定
environment:
- SPRING_PROFILES_ACTIVE=docker
- DATABASE_URL=jdbc:postgresql://db:5432/idp
# 変数展開
- APP_VERSION=${APP_VERSION:-1.0.0}
# ファイルから読み込み
env_file:
- .env
- .env.${ENVIRONMENT:-local}
.envファイル
# .env
POSTGRES_USER=idp
POSTGRES_PASSWORD=secret
POSTGRES_DB=idp_db
# アプリケーション設定
APP_VERSION=1.0.0
SPRING_PROFILES_ACTIVE=docker
変数の優先順位
1. Compose ファイルの environment
2. シェル環境変数
3. .env ファイル
4. Dockerfile の ENV
例:
export APP_VERSION=2.0.0 # シェル環境変数
# .env: APP_VERSION=1.0.0 # .envファイル
→ APP_VERSION=2.0.0 が使用される