👌

docker上でphpmyadminとmysqlを必要最低限の設定だけで接続する

2021/04/08に公開

必要最低限の設定でコンテナを作る。

version: "3"
services:
  mysql:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=password
  
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    ports:
       - 8080:80

これでdocker-compose upする。
127.0.0.0:8080にアクセスすると......

ユーザ名とパスワードを入力し、エンター。すると......

接続できません。
エラー自体は二つ出ていますが、どちらも言っていることは同じようです。
どのデータベースに接続すればいいの!?という感じでしょうか。
そこで、

version: "3"
services:
  mysql:
    image: mysql:5.7
    environment:
        - MYSQL_ROOT_PASSWORD=password
  
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
+    environment:
+      - PMA_HOST=mysql
    ports:
       - 8080:80

PMA_HOSTでホストを指定します。
$ docker-compose down
でコンテナを終了&削除し、再度
$ docker-compose up
すると......

ログインできました。
考えてみれば当たり前ですね。dockerにおいてそれぞれのコンテナは「サーバー」の役割を果たします。
上記の例は「phpmyadmin」というサーバーと、「mysql」というサーバーを立てたことに相当します。
アプリケーションサーバー(上記の例ではphpmyadmin)からデータベースサーバー(mysql)へとアクセスしたい時に、データベースサーバーがどこにあるかを知らなければ、アプリケーションサーバーはアクセスしようがありません。
いわば最初の例では、アプリケーションサーバーがデータベースサーバーのIPアドレスを理解していない状態だったといえます。

そこで二つ目の例では、PMA_HOSTを指定してやる(アプリケーションサーバーにデータベースサーバーの位置を知らせてやる)ことで、二者間の接続がうまくいったのでしょう。

しかも、二つ目のソースをよく見ると、
PMA_HOST=mysql
と、コンテナ名でホストを指定しています。
これはdocker-composeが自動的に名前解決をしてくれるからです。mysql(あるいはあなたのデータベースコンテナ名)と記述するだけで、docker-compose(が作ったnetwork)がコンテナを見つけ、phpmyadminコンテナに渡してくれるのです。便利ですね。

というわけで必要最低限の記述でphpmyadminをmysqlと接続してみました。
次は必要最低限の構成でLAMP環境を構築していきたいと思います。

Discussion