MySQL
phpMyadmin
docker
docker-compose

phpMyAdmin on docker が便利すぎる

More than 1 year has passed since last update.

Docker使ってWEBシステムを開発している場合、コンテナでMySQLサーバーを起動することが定石だと思います。
で、このDBの中身をGUI的に操作したい場合、3306ポートをEXPOSEしちゃう?

....そんな必要はありません!

DBをGUI的に操作するコンテナ、つまりphpMyAdminコンテナがあればいいんです!

phpMyAdminの公式Docker imageのページはこちら
https://hub.docker.com/r/phpmyadmin/phpmyadmin/

公式ならほぼ安心ですが、Docker imageには危険なexploitが埋め込まれていたりすることもあるので、Dockerfileも念のため確認しておきます。

https://hub.docker.com/r/phpmyadmin/phpmyadmin/~/dockerfile/

やっぱalpineベースなんですね〜。万全を期すならばこのDockerfileを自前でビルドでしょう。
Dockerfileをダウンロードしてしかるべきところに格納し、docker build 、もしくはdocker-compose.ymlに追記してdocker-compose buildするだけなんでまったく面倒ではありません。
でも公式イメージなんで、pullするだけでも大丈夫ですね。:smile:

docker-compose.ymlにphpMyAdminの定義を追加する

ではさっそく使ってみましょう。
たとえば、docker-compose.ymlでMySQLをこんな風に定義している場合

docker-compose.yml
# その他のコンテナの定義
 .
 .
 .

# MySQLコンテナ
mysql:
  image: mysql:5.7
  volumes:
    - "./mysql:/var/lib/mysql"
  environment:
    - MYSQL_ROOT_PASSWORD=password

これに、ちょちょいとphpMyAdminのコンテナを追加

docker-compose.yml
mysql:
  image: mysql:5.7
  volumes:
    - "./mysql:/var/lib/mysql"
  environment:
    - MYSQL_ROOT_PASSWORD=password

phpmyadmin:
  image: phpmyadmin/phpmyadmin
  environment:
    - PMA_ARBITRARY=1
    - PMA_HOST=mysql
    - PMA_USER=root
    - PMA_PASSWORD=password
  links:
    - mysql
  ports:
     - 8080:80
  volumes:
     - /sessions

蛇足:一応公式の指示どおりにcompose.ymlを書きましたがこのままだとdata volumeの残骸が増え続ける可能性があるので、sessionsは明示的にホストのディレクトリに結びつけた方いいかもしれません。たとえば

  volumes:
     - "./phpmyadmin/sessions:/sessions"

とか。ここではこのままいきます。

composeでコンテナ起動

docker-compose up -d

ブラウザでhttp://localhost:8080にアクセス

php.png

無事localhostでphpMyAdminが表示されました!

なにが素晴らしいって思い立ってからここまで到達するのに10分も経っていないということ。
PCやMacにMySQLのクライアント入れるよりお手軽ではないでしょうか。Docker以降、WEBサービスを手元で動作させるハードルが劇的に下がっていると感じます。

Dockerって素晴らしいですね〜。