🔰はじめての方へ

【Docker】docker-compose.ymlの書き方がわからない!rootと一般ユーザーの違いを初心者向けに解説

Docker
記事内に広告が含まれています。
スポンサーリンク

はじめに

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 でローカルで動かす方法については、

頑張って下記記事にまとめたのでご参照ください!

【データベース×Docker】PHPサイトをローカルで動かす環境を作る方法|Nginx| 各コード説明
はじめにWeb制作をしていると、こんな場面がありませんか?コードを書いたけど、レンタルサーバーにアップロードしないと動作確認できないデータベースを使うページを作ったけど、ローカルで確認する方法がわからないPHPファイルをブラウザで開いても、…

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は初回起動時に、自動で次の処理を行います。

  1. root(管理者)を作成
  2. lp_database というデータベースを作成
  3. lp_user という一般ユーザーを作成
  4. lp_user にパスワード「0000」を設定
  5. 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_USERMYSQL_PASSWORD を省略して、rootだけで運用するパターンです。

rootにできるか、root以外の名前で専用ユーザーを作る必要があるか

設定root にできるか
MYSQL_ROOT_PASSWORD自由に設定できる(root でもOK)
MYSQL_DATABASE自由に設定できる(root でもOK、ただしDB名としてわかりにくい
MYSQL_USERroot は使えない(既に存在するため)
MYSQL_PASSWORDMYSQL_USER を省略するなら不要

ローカル開発なら パターン1 がシンプルでおすすめです。


本番環境と同じ名前にする必要はある?

ありません。

DockerのMySQLと、本番サーバーのMySQLは別物です。

本番サーバー
↓
lp_database

Docker
↓
test_database

でも問題ありません。

ただし、本番と同じ名前にしておくと、

接続設定を書き換える箇所が少なくなるため、管理しやすいというメリットがあります。


まとめ

設定項目役割
MYSQL_ROOT_PASSWORD管理者(root)のパスワード
MYSQL_DATABASE作成するデータベース名
MYSQL_USER一般ユーザー名
MYSQL_PASSWORD一般ユーザーのパスワード
PMA_USERphpMyAdminでログインするユーザー
PMA_PASSWORDそのユーザーのパスワード

初心者の頃は、

「なんでこんなに設定があるの?」

と感じるかもしれません。

私自身もかなり混乱しました。(今も混乱する場面があります・・・)

root = 管理者(社長)

MYSQL_USER = 一般ユーザー(社員)

と考えると、少し理解しやすくなります。

Dockerは、こうしたデータベースの初期設定まで自動でやってくれる便利なツールです。

最初は難しく感じますが、一つずつ理解していけば大丈夫です!