Dockerのネットワーク構成

こんにちは、サイオステクノロジー技術部 武井です。Dockerのネットワークが気になったのでちょっと調べてみました。

以下のコマンドで簡単なコンテナを起動して、内部のネットワークを調べてみました。PHPが動作するWebサーバーを立ち上げて、-pオプションで80番をポートフォワードします。

こんな構成になっているようです。

Screen Shot 2018-09-13 at 11.51.45

仮想ブリッジが内部にあり、veth(Virtual Ethernet Pair)が仮想ブリッジにつながっていて、そのペアにコンテナ側のインターフェースがいます。 vethは仮想的なネットワークインターフェースで、異なるnamespaceにあるインターフェース同士をつなぐことが出来ます。

つまり、仮想ブリッジを介して、コンテナ同士がL2のレイヤーでつながっています。

試しに見てみました。

 

docker0という仮想ブリッジがあるのが見えました。仮想ブリッジは172.17.0.1というIPアドレスを持っていました。

また、vethca38e86というのが、vethのインターフェースで、コンテナ側のネットワークインターフェースとケーブルで繋がっているようなイメージです。

こちらも以下のコマンドで見てみました。

仮想ブリッジに先程のvethca38e86のインターフェースが接続されているのがわかります。

物理NICと仮想ブリッジは通信は、OSの機能でルーティングされます。以下のコマンドで見てみましたが、172.17.0.0/16宛の通信がdocker0(仮想ブリッジのインターフェース)にルーティングされているのがわかります。

iptablesの設定も見てみました。

以下のPREROUTINGチェインで、物理NICの80番ポート宛への通信の宛先を、コンテナのIPアドレスの80番あてへとDNATしているようです。

ローカルのインターフェース宛に届いたパケットは、独自定義のチェインDOCKERに飛んで、2番めのチェインでは、送信元のインターフェースがdoker0(仮想ブリッジのインターフェース)ではないので、そのまま3番目のチェインに飛んで、そこで宛先が80/tcpの通信は、コンテナのIPアドレスの80番にDNATしているという感じだと思います、多分。

こんな感じで、コンテナまでパケットが届くんだということがわかりました。

物理的に以下のようなネットワークを、仮想ブリッジやiptablesなどの機能でエミュレートしているのだと思います、多分。

Screen Shot 2018-09-13 at 11.51.31

以上です。今回は備忘録というかメモ的な感じですみません(´・ω・`)

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメント投稿

メールアドレスは表示されません。


*