今回のお題
今回はdockerネットワークの一つであるbridgeの仕組みについてまとめます。
前回の記事でdockerのネットワークには3種類あるという話をしました。
本記事ではその中でも最も使用頻度の高いbridgeというネットワークの仕組みについて話します。
以下で説明する内容については、コンテナ作成時に自動で設定されるものになります。 手動で実行する方法についても別途取り上げる予定ですが、実際に使用する機会は少ないかもしれません。
目次
- ネットワーク内のコンテナ同士での通信の仕組み
- コンテナとホストOSの通信の仕組み
- コンテナと外部インターネットとの通信の仕組み
ネットワーク内のコンテナ同士での通信の仕組み
ネットワーク内のコンテナ同士での通信は、仮想スイッチと呼ばれる中継地点によって実現している。
すなわち、コンテナ同士で通信する場合には両者の間を直接情報が行き来するのではなく、一度仮想スイッチを経由して情報がやりとりされることになる。
このような通信方式は、内部的には仮想NICと呼ばれる存在によって実現している。
具体的にいうと、コンテナと仮想スイッチはそれぞれ仮想NICと呼ばれる窓口を持ち、これらを出入り口として情報のやり取りが行われている。
コンテナとホストOSの通信の仕組み
コンテナとホストOSの間での通信も基本的な仕組みは変わらない。
ホストOSは仮想NICの代わりに物理NICと呼ばれるNICを持っているのでそれを仮想スイッチと接続することで通信を成立させている。
コンテナと外部インターネットとの通信の仕組み
コンテナから外部インターネットに対してリクエストを送信する場合、発信元IPアドレスおよび宛先IPアドレスは以下のようになる。
宛先 = リクエスト先のグローバルIPアドレス
発信元 = コンテナのプライベートIPアドレス
このような場合には、以下の2つの問題を抱えることになる。
- 上記の情報だけでは、仮想スイッチが転送先を判断することができない
- 上記の宛先IPアドレスは仮想スイッチの属するサブネット内のものではないので、IPアドレスを解釈することができない
- リクエストの受け手が宛先を解釈できない
- リクエストの受取手はグローバルIPアドレスなら理解できるが、上記の情報では発信元IPがプライベートアドレスになっており解釈できない
つまり、プライベートIPとグローバルIPが混在していることによって、仮想スイッチでもリクエスト先でも解釈できない状態になってしまっている。
bridgeではこの状況をデフォルトゲートウェイ
とNAT
によって解決している。
デフォルトゲートウェイとは仮想スイッチが受け取った送信先が同一サブネット内ではない(=仮想スイッチが解釈できない)IPアドレスであった場合のデフォルトの送信先である。
これをホストOSの物理NICのIPアドレスにすることによって、グローバルIPへのリクエストをホストOSへ転送することが可能になる。
NATとはNetwork Address Transferの略であり、プライベートIPとグローバルIPを変換する技術を指す。
コンテナから外部へリクエストが送られる場合には、ホストOSの物理NICをまたぐ際に送信元のアドレスがプライベートIPからグローバルIPに変換されることで、リクエストの受け手が発信元を解釈できるようにしている。