鳥頭なのでポート番号を覚えられません
少し語弊があると思いますが、ポート番号自体を覚えられないのではなく、その場で決めた特殊なポート番号が覚えられません。
今どきは1024以下に関わらずなんからの定番ポート番号があります。1521,3000,5432,8080などなど。
これらは事実上のwell-knownポートであり、このサービスはこの番号というのが体に染みついています。特に8080とかはブラウザデバッグするときアドレスとセットで勝手に体が入力してしまう程度に末端神経が毒されています。
何が言いたいのかというと、あるサービスに対してポートフォワードしたとき、そのポート番号をブラウザなりに打ち込んだりするときに少し間が開いてしまいなんか気持ち悪いというだけの話です。
動作を想定している環境
「VagrantとDockerを使って環境に依存せずにChefのお勉強がしたい」で書いたのですが、ぼくは仕事の都合上windowsをキープしないといけません。しかし家での開発はmacでやっています。なので、開発環境をそろえるために仮想環境を用意しているのですが、仮想環境の構築も両環境で統一したいのです。
なので、host -> box(vagrant) -> dockerという3段重ねで環境を作っています。
で、開発中のサービスはdocker上にあります。vagrantはお利巧なので、ポートフォワードなんておしゃれな事をやってくれますが、残念ながら冒頭で書いた通り僕の指がそのお利巧さについていけていません。
だからvagrantをルーターにした
解決策は簡単です。vagrantをルーターにしちゃえばいいだけです。
vagrantで仮想マシンのプロビジョニング時にeth0とdocker0間でパケットをガバガバに転送するようにします。
# ホストから直接dockerコンテナにアクセスできるようにする
sed -ir 's/net\.ipv4\.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf
iptables --flush
iptables --table nat --flush
iptables --delete-chain
iptables --table nat --delete-chain
iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE
iptables --append FORWARD --in-interface docker0 -j ACCEPT
iptables --table nat --append POSTROUTING --out-interface docker0 -j MASQUERADE
iptables --append FORWARD --in-interface eth0 -j ACCEPT
service iptables save
service iptables start
んでもってwindowsやmacのルーティング設定を変更します。
route -p add 172.17.0.0 mask 255.255.255.0 192.168.10.10
こうするとこんな感じのネットワークになります。
ホストから172.17.0.0へのパケットはvagrantがGWになり、vagrantが責任を以てdockerに届けてくれます。
テスト
現在のコンテナIDは945d898e8ead
のようなので、これのIPを調べます。
docker inspect 945 | jq ".[0].NetworkSettings.IPAddress"
今のIPは172.17.0.2だそうです。sshしてみます。クライアントはホスト上のcygwin-sshです。
直接無事sshできました。ポート番号も22のままなので-pオプションも不要です。