Docker Composeによるローカル開発環境構築:MySQL・Redis・MinIO

Docker Composeを使ってMySQL、Redis、MinIOを含むローカル開発環境を構築する方法を、docker-compose.ymlの書き方からデータ永続化、ヘルスチェックまで実践的に解説します。

はじめに

ローカル開発でMySQL、Redis、オブジェクトストレージなどのミドルウェアを手動でインストール・設定するのは、環境差異やバージョン管理の面で問題が生じがちです。Docker Composeを使えば、docker compose up の一コマンドで再現可能な開発環境を即座に構築できます。

本記事では、MySQL・Redis・MinIO(S3互換オブジェクトストレージ)を含む実用的な開発環境をDocker Composeで構築する方法を解説します。

docker-compose.ymlの基本構造

Docker Composeの設定ファイルは主に3つのセクションで構成されます。

services: # コンテナの定義
  web:
    image: nginx
    ports:
      - "8080:80"

volumes: # データ永続化のためのボリューム
  db-data:

networks: # カスタムネットワーク
  backend:

各サービスの設定

MySQL

services:
  mysql:
    image: mysql:8.0
    container_name: dev-mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-rootpass}
      MYSQL_DATABASE: ${MYSQL_DATABASE:-devdb}
      MYSQL_USER: ${MYSQL_USER:-devuser}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD:-devpass}
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s
    command: >
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_unicode_ci
      --default-time-zone=+09:00

default-time-zone=+09:00 を設定することで、JSTでの日時管理が可能です。

Redis

redis:
  image: redis:7-alpine
  container_name: dev-redis
  ports:
    - "6379:6379"
  volumes:
    - redis-data:/data
  healthcheck:
    test: ["CMD", "redis-cli", "ping"]
    interval: 10s
    timeout: 5s
    retries: 5
  command: redis-server --appendonly yes

--appendonly yes でAOF(Append Only File)永続化を有効にし、データの耐久性を確保します。

MinIO(S3互換ストレージ)

minio:
  image: minio/minio:latest
  container_name: dev-minio
  environment:
    MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin}
    MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin}
  ports:
    - "9000:9000" # API
    - "9001:9001" # Console
  volumes:
    - minio-data:/data
  healthcheck:
    test: ["CMD", "mc", "ready", "local"]
    interval: 10s
    timeout: 5s
    retries: 5
  command: server /data --console-address ":9001"

MinIOはAWS S3互換のAPIを提供するため、本番でS3を使うアプリケーションのローカル開発に最適です。

完成版 docker-compose.yml

services:
  mysql:
    image: mysql:8.0
    container_name: dev-mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-rootpass}
      MYSQL_DATABASE: ${MYSQL_DATABASE:-devdb}
      MYSQL_USER: ${MYSQL_USER:-devuser}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD:-devpass}
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s
    command: >
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_unicode_ci
      --default-time-zone=+09:00

  redis:
    image: redis:7-alpine
    container_name: dev-redis
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
    command: redis-server --appendonly yes

  minio:
    image: minio/minio:latest
    container_name: dev-minio
    environment:
      MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin}
      MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin}
    ports:
      - "9000:9000"
      - "9001:9001"
    volumes:
      - minio-data:/data
    healthcheck:
      test: ["CMD", "mc", "ready", "local"]
      interval: 10s
      timeout: 5s
      retries: 5
    command: server /data --console-address ":9001"

volumes:
  mysql-data:
  redis-data:
  minio-data:

よく使うコマンド

コマンド説明
docker compose up -dバックグラウンドで起動
docker compose down停止・コンテナ削除
docker compose down -v停止・ボリュームも削除
docker compose logs -f mysqlMySQLのログを追跡
docker compose exec mysql mysql -u devuser -p devdbMySQLに接続
docker compose exec redis redis-cliRedis CLIに接続
docker compose psコンテナの状態確認
docker compose restart redis特定サービスの再起動

データ永続化

Named Volumes vs Bind Mounts

方式用途
Named VolumeDB等のデータ永続化mysql-data:/var/lib/mysql
Bind Mountソースコードの同期./src:/app/src

Named Volumeはdocker compose down後もデータが残りますが、-v フラグを付けると削除されます。

ヘルスチェックとdepends_on

サービス間の起動順序を制御するには、healthcheckdepends_on を組み合わせます。

services:
  app:
    build: .
    depends_on:
      mysql:
        condition: service_healthy
      redis:
        condition: service_healthy

condition: service_healthy を指定すると、依存サービスのヘルスチェックが通るまでアプリの起動を待機します。

環境変数の管理

.env ファイルを docker-compose.yml と同じディレクトリに置くと、自動的に読み込まれます。

# .env
MYSQL_ROOT_PASSWORD=my_secure_password
MYSQL_DATABASE=myapp
MYSQL_USER=appuser
MYSQL_PASSWORD=app_secure_password
MINIO_ROOT_USER=minio_admin
MINIO_ROOT_PASSWORD=minio_secure_password

.env ファイルは .gitignore に追加し、バージョン管理には .env.example(値なし)を含めてください。

Tips

プロファイルによるサービスの選択的起動

すべてのサービスが常に必要とは限りません。プロファイルを使えば選択的に起動できます。

services:
  minio:
    profiles: ["storage"]
    image: minio/minio:latest
    # ...
docker compose up -d                    # mysql, redisのみ
docker compose --profile storage up -d  # minioも含む

ボリュームのクリーンアップ

不要なボリュームが溜まると、ディスクを圧迫します。

docker volume ls                  # ボリューム一覧
docker volume prune               # 未使用ボリュームを削除
docker system df                  # Docker全体のディスク使用量

関連記事

参考文献