docker上でphpmyadminとmysqlを必要最低限の設定だけで接続する
必要最低限の設定でコンテナを作る。
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