⏱️

【速攻】DockerでMySQLとphpMyAdminのコンテナ作成

2023/08/18に公開

初めに

この記事はDockerでMySQLとphpMyAdminのコンテナをサクッと作成する内容になります。簡単な内容ですが、ローカルでDB使いたいけど、わざわざMySQLをダウンロードしたりするのが面倒だったり、ローカル環境を汚したくないとか、サクッとDB使いたいみたいな人には役に立つのではないかと思います。phpmyadminを入れているのはデータベースの中身を確認したり、テーブルの作成・編集、データの追加などを行う際に、毎回mysqlのコマンドを叩くのは面倒だし、そこらへんをGUIで楽にできるphpmyadminを入れています。コードはコピペで使える内容になっていると思うので、コンテナはサクッと作れると思います!

完成コード

Dockerはインストール済みな前提で話をします。
以下のcompose.ymlのコードを作成し、あとはこのファイルが存在するディレクトリでdocker compose upを実行するだけです。

compose.yml
services:
  mysql:
    image: mysql:8.0.27
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: mysql
      MYSQL_DATABASE: db
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      TZ: 'Asia/Tokyo'
    volumes:
      - db-data:/var/lib/mysql
  phpmyadmin:
    image: phpmyadmin
    depends_on:
      - mysql
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOSTS=mysql
      - PMA_USER=root
      - PMA_PASSWORD=mysql
    ports:
      - "3001:80"
volumes:
  db-data:

解説(mysql部分)

image: mysql:8.0.27

→好きなバージョンのイメージを使用してください(docker hub)。

ports:
- "3306:3306"

→特に考えずにデフォルトの3306ポートを使うで問題ないかと思います。

MySQLに関する環境変数は以下のリンクに色々まとまっていますが、自分がどういう感じで設定を書いていったかは少し解説します。
https://qiita.com/pachi-dragon/items/8d248c518eb25cd9cf68

MYSQL_ROOT_PASSWORD: mysql

→MySQLのrootユーザーでログインするためのパスワードをmysqlとしています。これは最低限設定しておかないとエラーで立ち上げに失敗するようです。一応設定しなくても代わりにMYSQL_ALLOW_EMPTY_PASSWORDやMYSQL_RANDOM_ROOT_PASSWORDを設定することで、エラーが起こらないようにはできるようですが、基本はMYSQL_ROOT_PASSWORDを設定するでいいでしょう。

MYSQL_DATABASE: db

→コンテナ作成時にdbという名前のデータベースを作成します。phpmyadminやmysqlコマンドで作成してもいいですが、データベース名が決まっているなら、環境変数に書いて作ってしまってもいいでしょう。

以下のような感じで初めからdbデータベースが作成されていることが確認できます。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db                 |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
MYSQL_USER: user
MYSQL_PASSWORD: password

→デフォルトではrootユーザーのみ作成されますが、この環境変数で任意のユーザーを追加できます。今回の記述だとuserというユーザーでログインするにはpasswordというパスワードを打てばいいということですね。アプリケーションと連携させるときにrootユーザーは使わない方がいいということで、作成していますが、この記事内においてはuserというユーザーを使うタイミングはないです。

TZ: 'Asia/Tokyo'

→タイムゾーンをUTCからJSTに変えることができます。
mysql> show variables like '%time_zone%';で確認できるタイムゾーンはTZ設定前と後で以下のように変わります。
↓TZ設定前

+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | UTC    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.01 sec)

↓TZ設定後

+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | JST    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.00 sec)
volumes:
- db-data:/var/lib/mysql

→データベースを永続化させるために書いています。永続化という言葉で聞くと難しく感じますが、コンテナを新しく作り直してもデータが失われない場所に保存しておくということです。compose.ymlの最後に記載した以下でdb-dataというボリュームを作成し、上のコードの設定ではその保存場所(db-data)と同期させるようなイメージです。

volumes:
  db-data:

ちなみにdocker desktopでボリューム確認すると以下のようになってます(名前はプロジェクト名か何かが反映されてdb-dataではなくなっています)。

この画面ではmysqlのコンテナでこのボリュームが使用されていることが書かれています。

解説(phpmyadmin部分)

depends_on:
- mysql

→mysqlが起動してからphpmyadminのコンテナが起動するようにしています。確認はしていませんが、mysqlのコンテナと接続するような設定にしているので、phpmyadminが先に起動すると接続先が見当たらすエラーが発生すると思われます。
参考→depends_onにも色々設定が書けるらしい)

phpmyadminの環境変数については以下リンクで簡単にまとまっています。
https://www.kryupi.com/dockerのphpmyadminの環境変数は何をしているか/

PMA_ARBITRARY=1

→サーバーをローカル以外にも指定できるようになって、ログイン画面にホスト入力画面が出現するようです。今回の場合はあってもなくてもいいかもしれません。
↓入力画面

- PMA_HOSTS=mysql
- PMA_USER=root
- PMA_PASSWORD=mysql

ホスト先、ユーザー名、パスワードを設定します。これら全て記載すれば、入力画面が出現せず、URL(今回ならhttp://localhost:3001/ )を入力すればすぐにphpmyadminが使用できる画面になります。
mysqlという単語が2回出ているのでややこしくなりますが、PMA_HOSTSのmysqlは接続先、つまりmysqlコンテナという意味になります。PMA_USERではデフォルトで作成されるmysqlのrootユーザーを指定し、PMA_PASSWORDではcompose.ymlのMYSQL_ROOT_PASSWORDで指定したmysqlというrootユーザーでログインするためのパスワードを指定します。

ports:
- "3001:80"

→なんとなく3001番ポートを使用しています。なので http://localhost:3001/ でphpmyadminの画面に遷移します。3001を他の数字にする場合にはURLのポート番号も変更してください。

最後に

以上でサクッとmysqlとphpmyadminのコンテナを作れると思います。phpmyadminが不要ならそこの部分を削除してもらえればと思います。最後まで読んでいただきありがとうございます。

その他の参考リンク

https://qiita.com/furu8ma/items/50718efebee20fd24517
https://gihyo.jp/dev/serial/01/mysql-road-construction-news/0125

Discussion