はじめに
ローカル開発で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 mysql | MySQLのログを追跡 |
docker compose exec mysql mysql -u devuser -p devdb | MySQLに接続 |
docker compose exec redis redis-cli | Redis CLIに接続 |
docker compose ps | コンテナの状態確認 |
docker compose restart redis | 特定サービスの再起動 |
データ永続化
Named Volumes vs Bind Mounts
| 方式 | 用途 | 例 |
|---|---|---|
| Named Volume | DB等のデータ永続化 | mysql-data:/var/lib/mysql |
| Bind Mount | ソースコードの同期 | ./src:/app/src |
Named Volumeはdocker compose down後もデータが残りますが、-v フラグを付けると削除されます。
ヘルスチェックとdepends_on
サービス間の起動順序を制御するには、healthcheck と depends_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全体のディスク使用量
関連記事
- Kubernetesの基本 - コンテナオーケストレーションの次のステップとしてKubernetesの基礎を解説しています。
- GitHub Actionsの基本的な書き方 - Docker Composeで構築した環境をCI/CDパイプラインに統合する方法の基礎を解説しています。
- トランザクションの分離レベルと防げる不整合 - MySQLのトランザクション分離レベルについて詳しく解説しています。
- PrismaとMySQLのタイムゾーン不整合問題 - Docker上のMySQLでよく遭遇するタイムゾーン問題と対策を解説しています。