【速攻】DockerでMySQLとphpMyAdminのコンテナ作成
初めに
この記事はDockerでMySQLとphpMyAdminのコンテナをサクッと作成する内容になります。簡単な内容ですが、ローカルでDB使いたいけど、わざわざMySQLをダウンロードしたりするのが面倒だったり、ローカル環境を汚したくないとか、サクッとDB使いたいみたいな人には役に立つのではないかと思います。phpmyadminを入れているのはデータベースの中身を確認したり、テーブルの作成・編集、データの追加などを行う際に、毎回mysqlのコマンドを叩くのは面倒だし、そこらへんをGUIで楽にできるphpmyadminを入れています。コードはコピペで使える内容になっていると思うので、コンテナはサクッと作れると思います!
完成コード
Dockerはインストール済みな前提で話をします。
以下のcompose.ymlのコードを作成し、あとはこのファイルが存在するディレクトリでdocker compose upを実行するだけです。
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に関する環境変数は以下のリンクに色々まとまっていますが、自分がどういう感じで設定を書いていったかは少し解説します。
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の環境変数については以下リンクで簡単にまとまっています。
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が不要ならそこの部分を削除してもらえればと思います。最後まで読んでいただきありがとうございます。
その他の参考リンク
Discussion