dockerでmysqlを作成する際の手順について
ディレクトリ構造
Plaintext
.
├── docker-compose.yml
└── db/
├── conf.d/
│ └── my.cnf # MySQLの詳細設定
└── init/
├── 01_schema.sql # 1: テーブル作成
└── 02_data.sql # 2: 初期データ(別ファイル化)
初期化ファイルの準備
ファイルの先頭に番号をつけることで、実行順序を制御します。
01_schema.sql
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
02_data.sql
INSERT INTO users (name) VALUES ('Qiita太郎'), ('Docker次郎');
MySQL設定ファイル (db/conf.d/my.cnf)
日本語環境に合わせて文字コードとタイムゾーンを最適化します。
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default-time-zone = 'Asia/Tokyo'
[client]
default-character-set=utf8mb4
docker-compose.yml の記述
YAML
services:
db:
image: mysql:8.0
container_name: mysql-dev-container
platform: linux/amd64
restart: always
# 外部(IntelliJ等)から接続するためのポート
ports:
- "3306:3306"
# 基本設定
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: my_app_db
MYSQL_USER: dev_user
MYSQL_PASSWORD: dev_password
TZ: 'Asia/Tokyo'
# ホストとコンテナの同期
volumes:
- ./db/init:/docker-entrypoint-initdb.d # SQLの自動実行
- ./db/conf.d:/etc/mysql/conf.d # 設定ファイルの反映
- mysql_data:/var/lib/mysql # データの永続化
volumes:
mysql_data:
運用のポイント
初期化が走らない場合: 既にボリュームが存在していると、SQLは実行されません。docker-compose down -v でボリュームを一度破棄して再起動してください。
ログの確認方法: 起動中に何が起きているかは docker-compose logs -f db で確認できます。
docker-compose.yml の詳細解説
Docker Composeは、複数のコンテナの「起動オプション」を一つのファイルに集約したものです。
| 項目 | 詳細な役割 |
|---|---|
| platform: linux/amd64 | M1/M2/M3 Mac(ARM)でMySQLを動かす際、これを指定しないと「イメージがOSと一致しない」という警告やエラーが出ることがあります。互換性を保つためのおまじないです。 |
| environment | MYSQL_ROOT_PASSWORDは必須です。MYSQL_DATABASEを指定すると、起動時にその名前のDBが空の状態で自動作成されます。 |
| volumes | 最重要項目です 「./db/init:/docker-entrypoint-initdb.d: 初期化SQLの注入。」 「./db/conf.d:/etc/mysql/conf.d: 設定ファイルの反映。」 「mysql_data:/var/lib/mysql: コンテナを消してもデータが消えないようにホスト側に保存。』 |
| restart: always | PCの再起動時や、エラーでコンテナが落ちた際に自動で再立ち上げを行う設定です。 |
db/conf.d/my.cnf の詳細解説
MySQL本体の挙動をカスタマイズする設定ファイルです。Dockerでは、設定ファイルを直接書き換えるのではなく、/etc/mysql/conf.d に独自の .cnf ファイルを配置(マウント)することで、デフォルト設定を上書きするのが一般的です。
Ini, TOML
[mysqld]
# 文字コード設定。utf8mb4は絵文字なども扱える現代の標準設定です。
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
# タイムゾーンの設定
default-time-zone = 'Asia/Tokyo'
[client]
# MySQLクライアントから接続する際のデフォルト文字コード
default-character-set=utf8mb4
environmentの変数を別だしする方法
- 直接 docker-compose.yml に書く(基本)
先ほどの例のように、ファイル内に直接値を記述します。
・メリット: 構造が分かりやすく、自分だけで試すなら一番早い。
・デメリット: Gitなどにアップロードするとパスワードが丸見えになる。
YAML
environment:
MYSQL_ROOT_PASSWORD: my_strong_password
- .env ファイルを使う(推奨・応用)
docker-compose.yml と同じ階層に .env という名前のファイルを作り、そこで変数として管理します。Docker Composeは起動時に自動でこのファイルを読み込みます。
プロジェクト構成
.
├── .env <-- ここにパスワードを書く
└── docker-compose.yml <-- 変数名だけを書く
.env の中身
# key=value 形式で記述
DB_ROOT_PASS=root_password
DB_USER=dev_user
DB_PASS=dev_password
docker-compose.yml の書き方
${変数名} という形式で記述します。
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS}
MYSQL_USER: ${DB_USER}
MYSQL_PASSWORD: ${DB_PASS}
- OSの環境変数から読み込む
PC(ホスト側)のターミナルで export DB_ROOT_PASS=password と設定されている場合、Docker Composeはそれを利用することも可能です。
セキュリティ:パスワードの管理について
パスワードを docker-compose.yml に直接書くと、GitHub等にプッシュした際に漏洩するリスクがあります。
実務や公開用プロジェクトでは .env ファイル を使用しましょう。
.env ファイルを作成し、MYSQL_ROOT_PASSWORD=password のように定義。
docker-compose.yml では ${MYSQL_ROOT_PASSWORD} と記述して参照。
.gitignore に .env を追加して、Gitの管理から外す。
AWSでdocekerの環境変数を管理するためには
1. AWS ECS (Fargateなど) を使う場合
ECSの「タスク定義」には、環境変数を設定する項目があります。ここで設定した値は、コンテナ内のOS環境変数として自動的に注入されます。
docker-compose.yml の書き方:
値を直接書かずに、変数名だけを記述します。これにより、ホスト(AWS環境)の環境変数をそのままコンテナへ引き継ぎます。
services:
db:
image: mysql:8.0
environment:
# 値を書かないことで、ホスト側の環境変数を自動で読み込む
- MYSQL_ROOT_PASSWORD
- MYSQL_DATABASE
2. Secrets Manager / Parameter Store を使う場合(推奨)
パスワードなどの機密情報は、AWSの専用サービスで管理するのがベストプラクティスです。
ECSの場合:
タスク定義の secrets セクションで、Parameter StoreのARNを指定します。
メリット: docker-compose.yml やコンテナ定義にパスワードが一切残らないため、非常に安全です。