環境
- MacOSX Yosemite
- docker 1.9.1
- docker-machine 0.5.3
概要
dockerで作成したコンテナからMacOSXへポートで通信したかったが、docker-machineが間に立ってるので出来なかった。
結論から言うと、docker-machineからMacOSXへSSH port forwardすることで解決した。
docker network
dockerのネットワークはデフォルトで 172.17.0.0
を使用する。
dockerデーモンを起動しているホスト側に通信したい場合、 172.17.0.1
を指定すれば良い。
docker-machine
docker-machineはデフォルトでvirtualboxをプロバイダにして動作する。
virtualbox上にboot2dockerのVMが起動して、そのVMを介してコンテナとやりとりを行っている。
ハマりどころとしては
- (MacOSXでは)
/Users
のみをboot2dockerへマウントする - docker-machineからコンテナへのポートフォワーディングは自動で行ってくれるが、docker-machineホストからコンテナへのポートフォワーディングは行ってくれない(逆も)
docker container(guest) to host OS
前述のとおりコンテナからホスト側には 172.17.0.1
を指定すれば通信出来るが、このホスト側は docker-machine のことを指す。
そのため例えば、「コンテナからMacOSXで起動しているMySQLに接続したい」などの時に困ることとなる(今回はコレ)。
解決策
docker-machine上でSSHポートフォワーディングする
以下、docker-machineの名前が default
としてコマンド例。
$ docker-machine ssh default
Boot2Docker version 1.9.1, build master : cef800b - Fri Nov 20 19:33:59 UTC 2015
Docker version 1.9.1, build a34a1d5
docker@default:~$ ssh -gfNL 3306:localhost:3306 usename@192.168.60.1 -p22 # ユーザ名はMac側のユーザ名
SSHのポートフォワーディングについては詳しくはここでは説明しません(ぐぐれば出てきます)
コレを実行することで、docker-machineへの3306ポートへの接続をMacOSX側の3306ポートへとforwardingすることが出来ます。
MacOSX側のIPが 192.168.60.1
となっていますが、僕はdocker-machineのネットワークを 192.168.60.1/24
に指定して作成したためコレになっています。
$ docker-machine create --driver virtualbox --virtualbox-hostonly-cidr 192.168.60.1/24 default
わからない場合のネットワークの確認方法はいくつかありますが、docker-machine上で確認するのが一番手軽だと思います。
ip addr
とか打ってそれっぽいのがそうです(多分eth1)
解決してないこと
ログインせずに docker-machine ssh default ssh -gfNL 3306:localhost:3306 usename@192.168.60.1 -p22
って実行すると、ttyが繋ぎっぱなしになって帰って来ない
というか、 docker-machine
関係なく(普通のsshでも)帰ってこない……。
向こう側ではちゃんとコマンド実行されてるのになー。なんでだろう。
誰かおしえてください\(^o^)/
おまけ
docker-machineのSSH鍵は ~/.docker/machine/machines/default/
に設置されています(machine名が default
の場合)
コンテナからSSHでdocker-machine側にNOPASSWORDしたい場合は、このディレクトリを ~/.ssh
としてコンテナ側にマウントしてやればOKでした。
$ docker run -v $HOME/.docker/machine/machines/default:/root/.ssh` hoge /bin/bash