適当にやったらできたけどこんなんでいいのかわからない。。。
用途: 例えば開発環境用サーバにdockerをinstallしていて、社内のネットワークからコンテナ内に直接ssh したい場合など。
ちなみにdockerにはポートマッピングの機能があって、hostのX番に接続したらコンテナYのZ番に転送する、みたいなことが出来るがこのエントリはその話ではない。
準備
- dockerホスト 192.168.0.1
- コンテナのprivate network 172.17.0.0/16
- docker の install
- iptables で外からコンテナのNWへのアクセスの際にNATする設定を追加
- ログインしたい外部の端末 192.168.0.2
- 静的ルーティングを足しておく
- route add -net 172.17.0.0/16 gw 192.168.0.1
ホストサーバ
# iptables -t nat -A POSTROUTING --protocol all --source 192.168.0.0/24 \ --destination 172.17.0.0/16 --jump MASQUERADE
ログインしたい端末
routing 足す
# route add -net 172.17.0.0/16 gw 192.168.0.1
tcpdumpで見てたらわかるけど、iptablesでNATさせないと外からコンテナ宛にはパケットが届くけどコンテナから外側のNW(この例だと192.168.0.0/24) に直接出て行こうとするので通信できない。
本当にやりたいこと(だけど出来なかったこと)はコンテナにホストと同じネットワークのアドレスを割り当てて(ブリッジさせて)そのIPに直接ログインしたい
例えば開発用のdockerコンテナにグローバルIPを割り当てて外部から直接アクセスしたい、みたいな。
bridge を気合いで設定する、もしくは以下のpipework を使えばできそうなことが書いているが。。。
Connect a container to a local physical interface Let's pretend that you want to run two Hipache instances, listening on real interfaces eth2 and eth3, using specific (public) IP addresses. Easy!
pipework eth2 $(docker run -d hipache /usr/sbin/hipache) 50.19.169.157
pipework eth3 $(docker run -d hipache /usr/sbin/hipache) 107.22.140.5
やってみたけどdockerホストからすらpipeworkで割り当てたIP宛に通信できなかったので一旦あきらめる。