ifconfigで使えそうなIPを確認
$ ifconfig docker0: inet 172.17.0.1 eth0: [グローバルIP] lo: 127.0.0.1
コンテナからホストにアクセスする際に使えそうなアドレスはこのあたりか。
コンテナ作って疎通確認
まずは、Alpineあたりの軽量コンテナで疎通確認してみる。
参考:http://nobutaka-saito.hatenadiary.jp/entry/2018/04/18/080050
$ docker run --rm -it alpine:3.7 /bin/sh (以下コンテナ内) / # wget -O - http://127.0.0.1 Connecting to 127.0.0.1 (127.0.0.1:80) wget: can't connect to remote host (127.0.0.1): Connection refused / # wget -O - http://172.17.0.1 (apache2のデフォルトindex.htmlの内容が表示) / # wget -O - http://[グローバルIP]/ (apache2のデフォルトindex.htmlの内容が表示)
ということなので、VPSのグローバルIPか、”docker0″として作られているIPアドレスに対してなら、コンテナからホストに通信できるようだ。
MariaDBのコンテナ作って疎通確認
クライアントだけあれば良いんだが、コンテナ探すのが面倒なんで、MariaDBのイメージを使用。
$ docker run -it --network host --rm mariadb mysql -h172.17.0.1 -uphpmyadmin -p ERROR 2002 (HY000): Can't connect to MySQL server on '172.17.0.1' (115) $ docker run -it --rm mariadb mysql -h172.17.0.1 -uphpmyadmin -p ERROR 2002 (HY000): Can't connect to MySQL server on '172.17.0.1' (115)
ただ、上記の方法で、コンテナから別ホストのMySQLに接続できるようなことがDocker Hubのページに書いてあったが、2002エラーで接続できない。
このエラー、ローカルのMySQLが起動してないのにアクセスしようとして起きるのと、エラーコードが一緒。
これじゃあコンテナ側に問題あるのか、ホスト側の設定なのか、全くわからん。
AlpineのコンテナにMySQLのクライアント入れてリトライ
$ docker run --rm -it alpine:3.7 /bin/sh (以下コンテナ内) / # apk add mysql mysql-client / # mysql -h 172.17.0.1 -u phpmyadmin -p Enter password: ERROR 2003 (HY000): Can't connect to MySQL server on '172.17.0.1' (111 "Connection refused")
今度は、エラーメッセージが変わった。
コンテナ→ホストにpingは飛んでいるので、ホストのMariaDB側で弾いているんだろうことがわかった。
## mariaDBに他サーバーからアクセスできるユーザーを追加 MariaDB [(none)]> GRANT ALL ON *.* TO user@'%' IDENTIFIED BY 'password' WITH GRANT OPTION; # vi /etc/mysql/mariadb.conf.d/50-server.cnf bind-address = 172.17.0.1 #この行を追記 # service mysql restart (以下コンテナ内) / # mysql -h 172.17.0.1 -u user -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 32 Server version: 10.1.44-MariaDB-0ubuntu0.18.04.1 Ubuntu 18.04 Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
これで、やっとアクセスできた!