個人開発者のためのDocker MySQLセットアップガイド
はじめに
ウェブアプリ開発において、データベース環境の構築は避けて通れない作業です。特に個人開発では「ローカルにDBを構築するのが面倒」という悩みはよくあるものです。この記事では、VPSの開発用DBを使うことの是非から始めて、Dockerを使った簡単なMySQL環境の構築方法、そして複数プロジェクトでの管理方法までをご紹介します。
VPSの開発用DBを使うべきか?
VPSにある開発用DBをローカル開発で使用することは一般的ではありませんが、状況によっては有効な選択肢となります。
メリット
- チーム全員が同じデータを共有できる
- 本番環境に近い設定でテストできる
- ローカルへのDB設定・構築が不要
デメリット
- インターネット接続が必要で、接続が遅くなる可能性がある
- VPSに障害が起きた場合、開発が止まる
- セキュリティリスク(適切なセキュリティ設定が必要)
個人開発の場合は、ローカルにDB環境を構築する方が多くのメリットがあります。では、その構築方法を見ていきましょう。
Dockerを使った簡単なMySQL環境の構築
Dockerを使えば、コマンド数行でMySQLを立ち上げることができます。以下は基本的なDocker Compose設定です。
version: '3.8' services: db: image: mysql:8.0 container_name: local_mysql restart: always environment: MYSQL_ROOT_PASSWORD: root_password # root用パスワード MYSQL_DATABASE: dev_db # 初期DB名 MYSQL_USER: dev_user # 開発用ユーザー MYSQL_PASSWORD: dev_password # 開発用パスワード ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci # PHPMyAdmin(Web用DB管理ツール) phpmyadmin: image: phpmyadmin/phpmyadmin container_name: local_phpmyadmin depends_on: - db environment: PMA_HOST: db MYSQL_ROOT_PASSWORD: root_password ports: - "8080:80" volumes: mysql_data:
これをdocker-compose.ymlとして保存し、docker-compose up -dコマンドを実行するだけで、MySQLサーバーとPHPMyAdminが起動します。
プロジェクト管理アプローチ
開発者として複数のプロジェクトを扱う場合、2つのアプローチがあります:
1. 一つのコンテナ内で複数のDB
一つのMySQLコンテナ内に複数のデータベースを作成する方法。
version: '3.8' services: db: image: mysql:8.0 container_name: local_mysql restart: always environment: MYSQL_ROOT_PASSWORD: root_password MYSQL_DATABASE: project_a_db MYSQL_USER: dev_user MYSQL_PASSWORD: dev_password ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql - ./init:/docker-entrypoint-initdb.d command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci volumes: mysql_data:
そして、追加のデータベースを作成するための初期化SQLファイル(./init/create_dbs.sql):
-- プロジェクトB用のDBとユーザー作成 CREATE DATABASE IF NOT EXISTS project_b_db; CREATE USER IF NOT EXISTS 'project_b_user'@'%' IDENTIFIED BY 'project_b_pass'; GRANT ALL PRIVILEGES ON project_b_db.* TO 'project_b_user'@'%'; -- プロジェクトC用のDBとユーザー作成 CREATE DATABASE IF NOT EXISTS project_c_db; CREATE USER IF NOT EXISTS 'project_c_user'@'%' IDENTIFIED BY 'project_c_pass'; GRANT ALL PRIVILEGES ON project_c_db.* TO 'project_c_user'@'%'; FLUSH PRIVILEGES;
2. プロジェクトごとに別コンテナ
特に、本番環境のMySQLバージョンがプロジェクトごとに異なる場合は、各プロジェクト用に別のMySQLコンテナを作成するのがベストプラクティスです。
version: '3.8' services: # プロジェクトA用 (MySQL 8.0) project_a_db: image: mysql:8.0 container_name: project_a_mysql environment: MYSQL_ROOT_PASSWORD: root_password MYSQL_DATABASE: project_a_db MYSQL_USER: project_a_user MYSQL_PASSWORD: project_a_pass ports: - "3306:3306" volumes: - project_a_data:/var/lib/mysql command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci # プロジェクトB用 (MySQL 5.7) project_b_db: image: mysql:5.7 container_name: project_b_mysql environment: MYSQL_ROOT_PASSWORD: root_password MYSQL_DATABASE: project_b_db MYSQL_USER: project_b_user MYSQL_PASSWORD: project_b_pass ports: - "3307:3306" # 別のポート番号を使用 volumes: - project_b_data:/var/lib/mysql # PHPMyAdmin (全DBの管理用) phpmyadmin: image: phpmyadmin/phpmyadmin container_name: phpmyadmin environment: PMA_HOSTS: project_a_db,project_b_db PMA_PORTS: 3306,3306 MYSQL_ROOT_PASSWORD: root_password ports: - "8080:80" depends_on: - project_a_db - project_b_db volumes: project_a_data: project_b_data:
データの永続性
Dockerを使う大きな利点の一つは、データの永続性です。Docker volumeを使用すると、コンテナを削除して再作成してもデータは保持されます。
volumes: - project_a_data:/var/lib/mysql # project_a_dataという名前のvolume
これにより、データは特定のディレクトリ(Linuxの場合は/var/lib/docker/volumes/など)に保存されます。
コンテナの削除と再作成:
# コンテナの削除(データは保持) docker-compose down # コンテナの再作成 docker-compose up -d
ただし、完全にデータを削除する場合は:
# volumeも含めて全削除 docker-compose down -v
開発環境の一元管理
複数プロジェクトで使用する開発環境は、プロジェクトとは別の場所で一元管理するのが良いでしょう。以下のような構成がおすすめです:
~/docker-dev-env/ # 開発環境用のDocker設定ディレクトリ ├── docker-compose.yml # メインの設定ファイル ├── init-scripts/ # 初期化スクリプト │ ├── project_a/ │ │ └── init.sql │ └── project_b/ │ └── init.sql ├── config/ # DB設定ファイル │ ├── mysql5.7/ │ │ └── my.cnf │ └── mysql8.0/ │ └── my.cnf └── .env # 環境変数(パスワードなど)
環境変数を使った設定例:
version: '3.8' # docker-compose.yml services: project_a_db: image: mysql:8.0 container_name: project_a_mysql environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${PROJECT_A_DB_NAME} MYSQL_USER: ${PROJECT_A_DB_USER} MYSQL_PASSWORD: ${PROJECT_A_DB_PASSWORD} ports: - "${PROJECT_A_PORT}:3306" volumes: - project_a_data:/var/lib/mysql - ./init-scripts/project_a:/docker-entrypoint-initdb.d - ./config/mysql8.0/my.cnf:/etc/mysql/conf.d/my.cnf command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci project_b_db: image: mysql:5.7 container_name: project_b_mysql environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${PROJECT_B_DB_NAME} MYSQL_USER: ${PROJECT_B_DB_USER} MYSQL_PASSWORD: ${PROJECT_B_DB_PASSWORD} ports: - "${PROJECT_B_PORT}:3306" volumes: - project_b_data:/var/lib/mysql - ./init-scripts/project_b:/docker-entrypoint-initdb.d - ./config/mysql5.7/my.cnf:/etc/mysql/conf.d/my.cnf # 以下略
対応する.envファイル:
# .env MYSQL_ROOT_PASSWORD=secure_root_password # Project A PROJECT_A_DB_NAME=project_a_db PROJECT_A_DB_USER=project_a_user PROJECT_A_DB_PASSWORD=project_a_pass PROJECT_A_PORT=3306 # Project B PROJECT_B_DB_NAME=project_b_db PROJECT_B_DB_USER=project_b_user PROJECT_B_DB_PASSWORD=project_b_pass PROJECT_B_PORT=3307 # PHPMyAdmin PHPMYADMIN_PORT=8080
まとめ
Dockerを使うことで、個人開発者でも簡単かつ効率的にMySQL環境を構築できます。本記事で紹介した方法を組み合わせることで、以下のメリットが得られます:
- 簡単なセットアップ(コマンド数行で実行環境構築)
- データの永続性(コンテナを削除しても安全)
- プロジェクト間の分離(各プロジェクトに最適な環境)
- 本番環境との一致(バージョンや設定を本番と合わせられる)
- 一元管理(設定ファイルを一箇所で管理)
次回のプロジェクトでは、ぜひ上記のアプローチを試してみてください。開発の効率と品質向上につながるはずです。