目次
Dockerネットワークモード
Docker をインストールすると 3 つのネットワークが自動的に作成され、docker network ls コマンドを使用してこれらのネットワークを一覧表示できます。
[root@docker ~]# docker network ls
docker run を使用してコンテナーを作成する場合、--netオプションを使用してコンテナーのネットワーク モードを指定できます。
Docker には次の 4 つのネットワーク モードがあります。
ホストモード: --net=host を使用して指定します。
コンテナ モード: --net=container:NAME_or_ID を使用して指定します。
なしモード: --net=none を使用して指定します。
ブリッジ モード: --net=bridge を使用して指定します (デフォルト設定)。
1. ホストモード
Docker の最下層は、Linux 名前空間テクノロジーを使用して、PID 名前空間分離プロセス、マウント名前空間分離ファイル システム、ネットワーク名前空間分離ネットワークなどのリソースを分離します。
ネットワーク名前空間は、他のネットワーク名前空間から分離された、ネットワーク カード、ルート、Iptables ルールなどの独立したネットワーク環境を提供します。
Docker コンテナには通常、独立したネットワーク名前空間が割り当てられます。ただし、コンテナーの起動時にホスト モードが使用される場合、コンテナーは独立したネットワーク名前空間を取得せず、ルート ネットワーク名前空間をホストと共有します。コンテナは独自のネットワーク カードを仮想化したり、独自の IP を設定したりすることはなく、ホストの IP とポートを使用します。このネットワーク モードは、セキュリティ上の理由から推奨されません。
192.168.100.131/24 マシン上でホスト モードで WEB アプリケーションを使用して Docker コンテナを起動し、TCP ポート 80 をリッスンします。コンテナ内で ifconfig コマンドを実行してネットワーク環境を表示すると、ホスト上の情報だけが表示されます。
外部からコンテナ内のアプリケーションにアクセスするには、ホスト マシンで直接実行しているのと同じように、NAT 変換を行わずに 192.168.100.131:80 を直接使用できます。
ただし、ファイル システム、プロセス リストなど、コンテナーの他の側面は依然としてホストから分離されています。
[root@docker ~]# docker run -itd --net=host --name=hostbusybox
[root@docker ~]# docker exec -it host ifconfig
[root@docker ~]# ifconfig
注: この 2 つはまったく同じであり、仮想マシンのホストオンリー モードに相当します。
2、コンテナモード
このモードでは、新しく作成されたコンテナがネットワーク ネームスペースをホストと共有するのではなく、既存のコンテナと共有するように指定できます。
新しく作成されたコンテナは、独自のネットワーク カードを作成したり、独自の IP を構成したりすることはありませんが、指定されたコンテナと IP、ポート範囲などを共有します。
同様に、2 つのコンテナーのネットワーク面に加えて、ファイル システムやプロセス リストなどの他のものも依然として分離されています。2 つのコンテナのプロセスは、ネットワーク カード デバイスを介して通信できます。
--net=container:container_id/container_name を使用すると、共通のネットワークを使用する複数のコンテナから認識される IP は同じになります。
[root@docker ~]# docker run -itd --name=con1busybox
[root@docker ~]# docker exec -it con1 ifconfig
[root@docker ~]# docker run -itd --net=container:con1 --name=con2busybox
[root@docker ~]# docker exec -it con2 ifconfig
追伸: 双子と同様に、同じネットワーク カード情報を使用してください。
3 つなしモード
このモードでは、Docker コンテナーには独自のネットワーク名前空間がありますが、Docker コンテナーのネットワーク構成は実行されません。
つまり、この Docker コンテナにはネットワーク カード、IP、ルーティングなどの情報がありません。Dockerコンテナのネットワークカードの追加やIPの設定などは自分で行う必要があります。
--net=none で指定すると、このモードではネットワークは構成されません。
[root@docker ~]# docker run -itd --name=none --net=nonebusybox
[root@docker ~]# docker exec -it none ifconfig
4、ブリッジモード
ブリッジ モードは、 NAT ネットワーク モデルに属する Docker のデフォルトのネットワーク設定です。Docker デーモンが起動すると、docker0 ブリッジ (-b パラメーターで指定) が確立されます。各コンテナーがブリッジ モードの使用を開始すると、Dockerコンテナは仮想ネットワーク インターフェイス (veth ペア) デバイスのペアを作成します。その一端はコンテナのネットワーク名前空間にあり、もう一端は docker0 にあり、コンテナとホスト間の通信を実現します。
ブリッジ モードでは、Docker コンテナと外部ネットワーク間の通信は iptables ルールによって制御されます。これは、Docker ネットワークのパフォーマンスが低下する重要な理由でもあります。
iptables -vnL -t nat を使用してNAT テーブルを表示すると、Chain Docker のコンテナー ブリッジング ルールを確認できます。
[root@docker ~]# iptables -vnL -t nat
5、オーバーレイモード
これは、Docker のネイティブのクロスホスト マルチサブネット ネットワーク モデルです。新しいネットワークを作成するとき、Docker はホスト上にネットワーク ネームスペースを作成します。ネットワーク ネームスペースにはブリッジがあり、ブリッジには vxlan インターフェイスがあります。ネットワークは vxlan ID を占有します。コンテナがネットワークに追加されると、Docker はブリッジ モードと同様に、一対の veth ネットワーク カード デバイスを割り当てます。一方の端はコンテナ内にあり、もう一方の端はローカル ネットワーク ネームスペース内にあります。
コンテナ A、B、および C はすべてホスト A 上にあり、コンテナ D および E はホスト B 上にあります。 ここで、オーバーレイ ネットワーク モデルを通じて、コンテナ A、B、および D は同じサブネット内にあり、コンテナ C と E は同じサブネット内にあります。サブネット内の別の場所にあります。
オーバーレイには vxlan ID があり、値の範囲は 256 ~ 1000 です。vxlan トンネルは、各ネットワーク サンドボックスを同じ ID で接続してサブネットを形成します。