開発でdockerのコンテナからdockerを動かしているVMのプロセスにアクセスしたいみたいなよくあるパターンで少しハマったので残しておきます
単純なホストへのアクセスであればextra_hosts
だけでOKでした
- docker-compose.yml
app: extra_hosts: - "devhost:$DOCKER_HOST_IP"
この設定を行うとコンテナ内の/etc/hosts
に設定が追加されてホスト側のVMへアクセスできるようになります
こんな感じでホスト側の80ポートへアクセスできます
$ docker-compose exec app /bin/bash # curl devhost
楽勝じゃん!とおもっていたのですが
今回アクセスしたいのはローカルポートフォワードで開けているMySQL用のポートへつなぎに行きたいという例でうまくいきませんでした
詳しくは省いて図にしましたがこんな感じです
- ホスト側でのフォワーディング
ssh -l vagrant -L 13306:database-host.com:3306 login_name@gateway.com
よく見たらLocalAddressが127.0.0.1
になっていました
$ netstat -ltnp Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:13306 0.0.0.0:* LISTEN 26953/ssh
なるほど、ということはこのLocalAddressが0.0.0.0
にできればアクセスできそう?ということで調べてみました
- 参考
ローカルフォワード時に -g
をつけて0.0.0.0
でLISTENするようにします
ssh -l vagrant -g -L 13306:database-host.com:3306 login_name@gateway.com
LocalAddressが変わったか確認してみます
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:13306 0.0.0.0:* LISTEN 1766/ssh
LocalAddressが0.0.0.0
に変わっています
- コンテナ側
一番最初に設定したextra_hosts
で設定したホスト名にアクセスすると無事アクセスできるようになりました
# mysql -uhoge -P 13306 -h devhost -p mysql>
ばっちり!
まとめ
- dockerのextra_hostsこの機会に知れてよかった
- port forwardingできること多いのでこれからも活用していきたい