個人開発者のための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環境を構築できます。本記事で紹介した方法を組み合わせることで、以下のメリットが得られます:

  1. 簡単なセットアップ(コマンド数行で実行環境構築)
  2. データの永続性(コンテナを削除しても安全)
  3. プロジェクト間の分離(各プロジェクトに最適な環境)
  4. 本番環境との一致(バージョンや設定を本番と合わせられる)
  5. 一元管理(設定ファイルを一箇所で管理)

次回のプロジェクトでは、ぜひ上記のアプローチを試してみてください。開発の効率と品質向上につながるはずです。