Docker

Docker Compose入門|複数コンテナをまとめて管理する

Docker Docker Compose コンテナ

Docker Compose入門
複数コンテナをまとめて管理する

Docker Composeを使えば、WebアプリとDB等の複数コンテナをYAMLファイル1つで定義し、コマンド1つで起動・停止できます。
この記事では、docker-compose.ymlの書き方から実践的な構成まで解説します。

こんな人向けの記事です

  • 複数のDockerコンテナをまとめて管理したい
  • docker-compose.ymlの書き方を知りたい
  • Webアプリ + DB の開発環境を構築したい

Step 1Docker Composeとは

Docker Composeは、複数のDockerコンテナの構成を docker-compose.yml(または compose.yml)に定義し、一括管理するツールです。

Docker Compose V2
Docker Compose V2 では docker-compose コマンドの代わりに docker compose(ハイフンなし)を使います。
最新のDocker Desktopには V2 が含まれています。

Step 2docker-compose.ymlの基本構造

docker-compose.yml
services:
  web:
    build: .                    # Dockerfileの場所
    ports:
      - "8000:8000"             # ホスト:コンテナ
    volumes:
      - .:/app                  # ソースコードをマウント
    depends_on:
      - db                      # dbが先に起動する
    environment:
      - DATABASE_URL=postgres://user:pass@db:5432/mydb

  db:
    image: postgres:16          # 公式イメージを使用
    volumes:
      - db_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=pass
      - POSTGRES_DB=mydb

volumes:
  db_data:                      # 名前付きボリューム
キー役割
services各コンテナ(サービス)の定義
buildDockerfileからビルド
image既存のイメージを使用
portsポートのマッピング
volumesファイルのマウント
depends_on起動順序の依存関係
environment環境変数の設定

Step 3基本コマンド

コマンド動作
docker compose upコンテナ起動(フォアグラウンド)
docker compose up -dコンテナ起動(バックグラウンド)
docker compose up --buildビルドしてから起動
docker compose downコンテナ停止・削除
docker compose psコンテナ一覧
docker compose logsログ表示
docker compose logs -f webwebサービスのログをリアルタイム表示
docker compose exec web bashwebコンテナに入る
docker compose restartコンテナ再起動
docker compose down -v はデータを消す
-v オプションを付けると、名前付きボリューム(DBデータ等)も削除されます。
開発中のDBデータが消えるので注意してください。

Step 4実践:Django + PostgreSQL

Dockerfile
FROM python:3.13-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .

CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
docker-compose.yml
services:
  web:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - .:/app
    depends_on:
      - db
    environment:
      - DEBUG=True
      - DB_HOST=db
      - DB_NAME=django_db
      - DB_USER=django
      - DB_PASSWORD=secret

  db:
    image: postgres:16
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=django_db
      - POSTGRES_USER=django
      - POSTGRES_PASSWORD=secret

volumes:
  postgres_data:
ターミナル
# 起動
docker compose up --build -d

# マイグレーション
docker compose exec web python manage.py migrate

# 管理者作成
docker compose exec web python manage.py createsuperuser

Step 5便利な設定

.env ファイルで環境変数を管理

.env
POSTGRES_USER=django
POSTGRES_PASSWORD=secret
POSTGRES_DB=django_db
docker-compose.yml
services:
  db:
    image: postgres:16
    env_file:
      - .env

ヘルスチェック

docker-compose.yml
services:
  db:
    image: postgres:16
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U django"]
      interval: 5s
      timeout: 5s
      retries: 5

  web:
    depends_on:
      db:
        condition: service_healthy

まとめ

  • docker-compose.yml で複数コンテナを一括定義
  • docker compose up -d で起動、down で停止
  • volumes でデータ永続化、depends_on で起動順制御
  • .env ファイルでパスワード等の環境変数を管理
  • healthcheck でサービスの準備完了を待てる