notebook

都内でWEB系エンジニアやってます。

dockerコンテナ内部からポートフォワーディングしているポートへアクセスする

開発で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用のポートへつなぎに行きたいという例でうまくいきませんでした

詳しくは省いて図にしましたがこんな感じです

f:id:swfz:20190428235131p:plain

  • ホスト側でのフォワーディング
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にできればアクセスできそう?ということで調べてみました

  • 参考

sshでポートフォワード - アシアルブログ

blog.asial.co.jp

ローカルフォワード時に -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できること多いのでこれからも活用していきたい