Docker Compose
Docker Composeとは
Docker Composeは、複数のコンテナを定義・実行するためのツールです。 YAMLファイルでサービスを定義し、一つのコマンドで全てのサービスを起動・停止できます。
Webアプリケーションとデータベースなど、複数のコンテナを連携させる場合に便利です。
docker-compose.ymlの基本構造
version: '3.8'
services:
# サービス1
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- db
# サービス2
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: myapp
volumes:
- db-data:/var/lib/mysql
volumes:
db-data: サービスの起動・停止
# サービスを起動(フォアグラウンド)
docker compose up
# サービスをバックグラウンドで起動
docker compose up -d
# 特定のサービスのみ起動
docker compose up web
# ビルドしてから起動
docker compose up --build
# サービスを停止(コンテナは削除されない)
docker compose stop
# サービスを停止してコンテナを削除
docker compose down
# サービス停止 + ボリュームも削除
docker compose down -v ✓ up -dでバックグラウンド起動が推奨です
✗ down -vはデータベースのデータも削除されるので注意
サービスの状態確認
# 実行中のサービス一覧
docker compose ps
# 全てのサービス(停止中も含む)
docker compose ps -a
# サービスのログを表示
docker compose logs
# 特定サービスのログ
docker compose logs web
# リアルタイムでログを表示
docker compose logs -f
# 最新100行のログ
docker compose logs --tail=100 サービス内でコマンド実行
# 実行中のサービスでコマンド実行
docker compose exec web bash
docker compose exec db mysql -u root -p
# 新しいコンテナでコマンドを実行
docker compose run web npm install
# 一度だけ実行して終了時に削除
docker compose run --rm web node script.js イメージのビルド
# Dockerfileからイメージをビルド
docker compose build
# 特定サービスのみビルド
docker compose build web
# キャッシュを使わずにビルド
docker compose build --no-cache
# ビルドしてから起動
docker compose up --build サービスの再起動・更新
# サービスを再起動
docker compose restart
# 特定サービスのみ再起動
docker compose restart web
# 設定を再読み込みして再起動
docker compose up -d --force-recreate
# 変更されたサービスのみ再作成
docker compose up -d スケーリング
# サービスのインスタンス数を指定
docker compose up -d --scale web=3
# 複数サービスをスケール
docker compose up -d --scale web=3 --scale worker=2 ※ ポートマッピングを使用する場合は、ポート番号の競合に注意が必要です。
その他の便利なコマンド
# 別のComposeファイルを指定
docker compose -f docker-compose.prod.yml up -d
# プロジェクト名を指定
docker compose -p myproject up -d
# サービスの設定を表示
docker compose config
# サービスで実行中のプロセスを表示
docker compose top
# サービスを一時停止/再開
docker compose pause
docker compose unpause 実用例: Web + DB構成
version: '3.8'
services:
web:
build: ./web
ports:
- "3000:3000"
environment:
- NODE_ENV=development
- DB_HOST=db
- DB_USER=root
- DB_PASSWORD=secret
volumes:
- ./web:/app
- /app/node_modules
depends_on:
- db
command: npm run dev
db:
image: postgres:15
environment:
POSTGRES_DB: myapp
POSTGRES_USER: root
POSTGRES_PASSWORD: secret
volumes:
- postgres-data:/var/lib/postgresql/data
ports:
- "5432:5432"
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
postgres-data: 起動方法:
# 初回起動(ビルド含む)
docker compose up -d --build
# ログ確認
docker compose logs -f web
# データベースに接続
docker compose exec db psql -U root -d myapp
# 停止と削除
docker compose down 開発時のワークフロー
# 1. サービスを起動
docker compose up -d
# 2. ログを監視
docker compose logs -f
# 3. コードを編集(ボリュームマウントで自動反映)
# 4. 必要に応じてサービスを再起動
docker compose restart web
# 5. コンテナ内でコマンド実行
docker compose exec web npm install new-package
# 6. 作業終了時に停止
docker compose down トラブルシューティング
# 全てを削除して再構築
docker compose down -v
docker compose up -d --build
# 特定サービスのみ再ビルド
docker compose build --no-cache web
docker compose up -d web
# ネットワークの問題を解決
docker compose down
docker network prune
docker compose up -d