はじめに
Dockerを使ってPHP + MySQL環境を構築していると、こんな設定を見かけることがあります。
// docker-compose.yml
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: lp_database
MYSQL_USER: lp_user
MYSQL_PASSWORD: 0000
さらに、phpMyAdminにはこんな設定があります。
phpmyadmin:
image: phpmyadmin/phpmyadmin
environment:
PMA_HOST: db
PMA_USER: root
PMA_PASSWORD: root
私は最初、
「なんでパスワードが2種類あるの?」
「rootって何?」
「phpMyAdminだけrootなのはなぜ?」
と、とても混乱しました。
今回は、Docker初心者の方向けに、この設定の意味をわかりやすく解説します。
データベースを使ったPHPサイトを Docker でローカルで動かす方法については、
頑張って下記記事にまとめたのでご参照ください!

rootとは?
簡単に言うと、
root = MySQLの管理者(社長)
です。
会社に例えると、こんなイメージです。
root(管理者)
つまり、「何でもできる人」です。
MYSQL_USERとは?
一方で、
MYSQL_USER: lp_user
MYSQL_PASSWORD: 0000...
(※ lp_usert というのは私が考えた名前です。)
で作成されるユーザーは、
一般ユーザー(一般社員)
です。
一般ユーザー
PHPからデータベースへ接続するときは、こちらを使うことが一般的です。
root と MYSQL_USER の違い
db:
environment:
MYSQL_ROOT_PASSWORD: root # ← 管理者アカウント(最初から存在する)
MYSQL_DATABASE: lp_database # ← 作成するデータベース名
MYSQL_USER: lp_user # ← 追加で作るユーザー
MYSQL_PASSWORD: 000 # ← そのユーザーのパスワード
Dockerは初回起動時に何をしているの?
例えば、以下の設定だった場合、
db:
image: mysql:8.0
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: lp_database
MYSQL_USER: lp_user
MYSQL_PASSWORD: 0000
(※ lp_database , lp_usert , 0000 というのは私が考えたものです)
Dockerは初回起動時に、自動で次の処理を行います。
- root(管理者)を作成
- lp_database というデータベースを作成
- lp_user という一般ユーザーを作成
- lp_user にパスワード「0000」を設定
- lp_database を利用できる権限を lp_user に付与
つまり、Dockerが「データベースの初期設定」を代わりにやってくれているのです。
phpMyAdminだけrootなのはなぜ?
phpMyAdminは、データベースを管理するためのツールです。
そのため、
phpmyadmin:
image: phpmyadmin/phpmyadmin
ports:
- "8080:80"
environment:
PMA_HOST: db
PMA_USER: root
PMA_PASSWORD: root
depends_on:
- db
としているケースがよくあります。
rootでログインすると、
などができます。
管理画面として使うなら、rootの方が便利なのです。
PHPからは誰で接続するの?
PHPでは、一般ユーザーを使うことが多いです。
new PDO(
'mysql:host=db;dbname=lp_database',
'lp_user',
'0000'
);
つまり、
phpMyAdmin
root(管理者)
PHP
lp_user(一般ユーザー)
という役割分担になります。
なぜrootでPHP接続しないの?
もちろん、rootでも接続できます。
しかし、
new PDO(
'mysql:host=db;dbname=lp_database',
'root',
'root'
);
としてしまうと、
PHP側のプログラムが「何でもできる状態」になります。
もし不具合や不正アクセスがあった場合、
などができてしまう可能性があります。
そのため、実務では必要最低限の権限を持つ一般ユーザーを利用することが多いです。
データベース名やユーザー名は変更する必要がある?
例えば、
MYSQL_DATABASE: my_database
MYSQL_USER: my_user
MYSQL_PASSWORD: my_password
のままでも動作します。
ただし、
MYSQL_DATABASE: lp_database
MYSQL_USER: lp_user
のようにしておくと、
「これはLP用のデータベースだな」
と後から見返した時にわかりやすくなります。
つまり、
❌ Dockerを動かすため
⭕ 自分が管理しやすくするため
です。
ローカル開発ならこんな書き方でOK
ローカル開発ならrootだけでシンプルに書いてもOKです。
db:
image: mysql:8.0
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: root
volumes:
- db_data:/var/lib/mysql
MYSQL_USER と MYSQL_PASSWORD を省略して、rootだけで運用するパターンです。
rootにできるか、root以外の名前で専用ユーザーを作る必要があるか
| 設定 | root にできるか |
|---|---|
MYSQL_ROOT_PASSWORD | 自由に設定できる(root でもOK) |
MYSQL_DATABASE | 自由に設定できる(root でもOK、ただしDB名としてわかりにくい) |
MYSQL_USER | root は使えない(既に存在するため) |
MYSQL_PASSWORD | MYSQL_USER を省略するなら不要 |
ローカル開発なら パターン1 がシンプルでおすすめです。
本番環境と同じ名前にする必要はある?
ありません。
DockerのMySQLと、本番サーバーのMySQLは別物です。
本番サーバー
↓
lp_database
Docker
↓
test_database
でも問題ありません。
ただし、本番と同じ名前にしておくと、
接続設定を書き換える箇所が少なくなるため、管理しやすいというメリットがあります。
まとめ
| 設定項目 | 役割 |
|---|---|
| MYSQL_ROOT_PASSWORD | 管理者(root)のパスワード |
| MYSQL_DATABASE | 作成するデータベース名 |
| MYSQL_USER | 一般ユーザー名 |
| MYSQL_PASSWORD | 一般ユーザーのパスワード |
| PMA_USER | phpMyAdminでログインするユーザー |
| PMA_PASSWORD | そのユーザーのパスワード |
初心者の頃は、
「なんでこんなに設定があるの?」
と感じるかもしれません。
私自身もかなり混乱しました。(今も混乱する場面があります・・・)
root = 管理者(社長)
MYSQL_USER = 一般ユーザー(社員)
と考えると、少し理解しやすくなります。
Dockerは、こうしたデータベースの初期設定まで自動でやってくれる便利なツールです。
最初は難しく感じますが、一つずつ理解していけば大丈夫です!

