Docker Compose実践ガイド - 効率的な開発環境構築の手順とベストプラクティス

Tech Trends AI
- 3 minutes read - 561 wordsDocker Compose実践ガイド - 効率的な開発環境構築の手順とベストプラクティス
Docker Composeは、複数のDockerコンテナで構成されるアプリケーションを定義・実行するためのツールです。本記事では、実践的な観点からDocker Composeの活用方法とベストプラクティスを解説します。
Docker Composeの基本概念
Docker Composeは、YAMLファイルでサービス構成を定義し、一つのコマンドでアプリケーション全体を起動・停止できる便利なツールです。
主な利点
- 環境の統一: 開発、ステージング、本番環境で同じ構成を利用
- 簡単な起動: 複雑なマルチコンテナアプリも一コマンドで起動
- 依存関係管理: サービス間の依存関係を自動で解決
- ネットワーク管理: コンテナ間通信を自動でセットアップ
基本的なdocker-compose.ymlの作成
シンプルなWeb+DB構成
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=development
- DB_HOST=database
depends_on:
- database
volumes:
- .:/app
- /app/node_modules
database:
image: postgres:13
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
volumes:
postgres_data:
キーポイント解説
- version: Docker Composeファイルのスキーマバージョン
- services: 各コンテナの定義
- volumes: データの永続化設定
- depends_on: サービス起動順序の制御
実践的な開発環境構築例
フルスタックアプリケーション構成
version: '3.8'
services:
# フロントエンド (React)
frontend:
build:
context: ./frontend
dockerfile: Dockerfile.dev
ports:
- "3000:3000"
volumes:
- ./frontend:/app
- /app/node_modules
environment:
- CHOKIDAR_USEPOLLING=true
depends_on:
- backend
# バックエンド (Node.js/Express)
backend:
build:
context: ./backend
dockerfile: Dockerfile.dev
ports:
- "3001:3001"
volumes:
- ./backend:/app
- /app/node_modules
environment:
- NODE_ENV=development
- DB_HOST=database
- REDIS_HOST=redis
depends_on:
- database
- redis
# データベース
database:
image: postgres:13
environment:
POSTGRES_DB: ${DB_NAME:-myapp}
POSTGRES_USER: ${DB_USER:-user}
POSTGRES_PASSWORD: ${DB_PASSWORD:-password}
volumes:
- postgres_data:/var/lib/postgresql/data
- ./db/init:/docker-entrypoint-initdb.d
ports:
- "5432:5432"
# Redis (キャッシュ・セッション)
redis:
image: redis:6-alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
# Nginx (リバースプロキシ)
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- frontend
- backend
volumes:
postgres_data:
redis_data:
networks:
default:
name: myapp_network
環境変数の管理
.envファイルの活用
# .env
DB_NAME=myapp_dev
DB_USER=developer
DB_PASSWORD=secret123
POSTGRES_PASSWORD=secret123
NODE_ENV=development
API_PORT=3001
WEB_PORT=3000
docker-compose.ymlでの環境変数使用
services:
database:
image: postgres:13
environment:
POSTGRES_DB: ${DB_NAME}
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
開発効率を向上させるベストプラクティス
1. ホットリロード対応
services:
app:
build: .
volumes:
- .:/app # ソースコードのマウント
- /app/node_modules # node_modulesは除外
environment:
- NODE_ENV=development
2. デバッグ環境の設定
services:
backend:
build:
context: .
dockerfile: Dockerfile.dev
command: npm run debug
ports:
- "3001:3001"
- "9229:9229" # Node.jsデバッガー用ポート
volumes:
- .:/app
3. データベース初期化スクリプト
services:
database:
image: postgres:13
volumes:
- ./db/init:/docker-entrypoint-initdb.d # 初期化SQLの自動実行
- postgres_data:/var/lib/postgresql/data
プロダクション環境への対応
docker-compose.prod.yml
version: '3.8'
services:
web:
build:
context: .
dockerfile: Dockerfile.prod
restart: unless-stopped
environment:
- NODE_ENV=production
depends_on:
- database
database:
image: postgres:13
restart: unless-stopped
environment:
POSTGRES_DB: ${DB_NAME}
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
# 本番環境ではポートを公開しない
volumes:
postgres_data:
起動コマンドの使い分け
# 開発環境
docker-compose up -d
# 本番環境
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
便利なコマンド集
基本操作
# サービス起動 (バックグラウンド)
docker-compose up -d
# サービス停止
docker-compose down
# サービス再起動
docker-compose restart
# ログ確認
docker-compose logs -f [service_name]
# サービス一覧表示
docker-compose ps
開発時に便利なコマンド
# 特定サービスでコマンド実行
docker-compose exec backend npm test
# 新しいシェルセッション開始
docker-compose exec backend bash
# サービス個別起動
docker-compose up backend database
# 強制再ビルド
docker-compose up --build
トラブルシューティング
よくある問題と解決法
1. ポートが既に使用されている
# ポート使用状況確認
netstat -tulpn | grep :3000
# 該当プロセス終了後、再起動
docker-compose down && docker-compose up -d
2. ボリュームのパーミッション問題
services:
app:
build: .
volumes:
- .:/app
user: "${UID:-1000}:${GID:-1000}" # ホストユーザーと合わせる
3. ネットワーク接続エラー
# ネットワーク確認
docker network ls
docker-compose exec backend ping database
# ネットワーク再作成
docker-compose down
docker-compose up -d
セキュリティベストプラクティス
1. 機密情報の管理
services:
app:
build: .
secrets:
- db_password
- api_key
secrets:
db_password:
file: ./secrets/db_password.txt
api_key:
file: ./secrets/api_key.txt
2. 最小権限の原則
# Dockerfile内で非rootユーザーを作成
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
USER nextjs
3. イメージの脆弱性対策
services:
app:
image: node:16-alpine # Alpine Linuxで軽量・安全
security_opt:
- no-new-privileges:true
read_only: true
tmpfs:
- /tmp
パフォーマンス最適化
1. ビルドキャッシュの活用
services:
app:
build:
context: .
cache_from:
- myapp:latest
image: myapp:latest
2. マルチステージビルド
# Dockerfile
FROM node:16-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
FROM node:16-alpine AS runtime
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
3. ヘルスチェックの設定
services:
web:
build: .
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
まとめ
Docker Composeは、現代の開発環境において必須のツールです。本記事で紹介した実践的な設定とベストプラクティスを活用することで、以下のメリットが得られます:
- 開発効率の向上: 環境構築の自動化と標準化
- チーム開発の円滑化: 統一された開発環境の共有
- 本番環境への移行: 設定の再利用による安全なデプロイ
- 運用の安定性: コンテナベースの信頼性の高いシステム
継続的な学習と実践を通じて、Docker Composeを効果的に活用し、より良い開発体験を実現していきましょう。