ドッカーネットワークモデルを導入します

I.概要

  ネットワークドライバのドッキングウィンドウがドッキングウィンドウによると、多くの方法がある の公式ウェブサイトの アドレスのネットワーク与えられたプログラム6、すなわちあります:ブリッジ、ホスト、オーバーレイ、macvlan 、いずれも、ネットワークのプラグイン、 それぞれのネットワークはもちろん、アプリケーションの、独自の特性を持っているがこのような複数のホスト上のインタードッカー容器クロスホスト通信、オーバーレイ、このパターンがソリューションを提供することができるmacvlan他のホストにできない場合、容器を必要とし、デフォルトのドッカーがブリッジモードで使用され、そして場合のような異なるシーンドッキングウィンドウのコンテナ輸送。ブリッジ、ホスト、なし、コンテナ:本論文では、ドッキングウィンドウ単一ホストの通信いくつかの通信モードについて説明します 。
  スタートコンテナのネットワーク選択は--networkを指定されたパラメータで指定され、デフォルトのオプションでは、ブリッジを使用していない場合は、--netと略記することができます。

二、ブリッジモードのネットワーク

入門

   ドッキングウィンドウブリッジモードがデフォルトモードネットワークである、ときドッカープロセスが開始され、それが自動的に、ホスト上のデフォルトの配布ネットワークセグメント172.17.0.0/16を仮想ブリッジdocker0を作成し、実際に橋のLinuxで、ソフトウェアは、Aとして理解することができますスイッチは自動的に転送し、任意のカード間のパケットは、その上に取り付けられることができます。
    あなたは、コンテナ、IPアドレス割り当てdocker0からコンテナのサブネットを作成する場合、およびeth0の名前のコンテナのネットワークカードなどの容器に、仮想ネットワークデバイスのvethデバイスをペアを作成し、別の(また、指定--ipを使用することができます)同じレイヤ2ネットワーク内のホスト名とdocker0上のブリッジで知られている装置は、そのような架橋方法ホスト上のすべてのコンテナを介して、コマンドbrctlショーvethXXXとして見ることができるされるように、容器と容器と容器ホストとの間で相互に通信することができ、以下では、通信の詳細を説明します。(シモンズ:ここでの通信は、単一のマスタ通信コンテナです)

vethについて

    vethは、仮想ネットワークデバイスで、仮想イーサネットの頭文字です。それが作成されたときに、常に2つの仮想NIC(VETHピア)形、と対に来て、ネットワークカード上のデータ・パケットも、それならば、対応するカードと相互に直接転送することができる:それはすることを特徴とします2枚のネットワークカードが同じ名前空間ではありません。:これは、記事VETHに推奨され  https://segmentfault.com/a/1190000009251098

コンテナとコンテナの間の通信

BS1は、コンテナの開始とそのIPアドレスが172.17.0.2、デフォルトゲートウェイ172.17.0.1で表示します。そして、このブリッジは、ゲートウェイアドレスdocker0アドレスは次のとおりです。

私たちは、対応するコンテナだけのvethカードでdocker0ブリッジカードを参照してください。

同様に、容器BS2の開始で、IPアドレスが172.17.0.3、docker0もゲートウェイ172.17.0.1です。

この時点で、docker0はveth7833d44のデバイスのvEth BS2以上になります。

 

容器BS1ピング172.17.0.3(BS2容器)容器BS1において、我々は、ルーティングルールに従って、eth0のからのパケットは、ブリッジのvEth docker0に、これを対応するアクセスのveth(veth0737c95)を転送する場合パケットがスイッチとMACアドレス172.17.0.3を見つけるためにブロードキャストARP要求の役割を果たし、docker0でdocker0今回到着したが、今回BS2を別のvethがdocker0上の機器をつなぐと、ARP要求を受信したとき、彼は自分自身を発見しました172.17.0.3、MACアドレス、この時間とBS2コンテナBS1でBS1への回答は、通信することができ、あなたはBS1でのMACアドレスとキャッシュ172.17.0.3を表示することができます。

以下のような2つの以上の容器の図の間のプロセス間通信です。

 

コンテナと外部の通信ネットワーク

同样的,介绍了容器与容器间的通讯,容器与主机间的通讯就容易理解了,如果在容器bs1 ping 另一个主机10.168.0.3,它发出去的数据包经过docker0网桥流向eth0,eth0在将数据包转发给与之相通的10.168.0.3,于是bs1就能和其主机节点进行通讯了。当然如果这个地址不是其他主机节点而是公网地址,只要eth0能到达,容器bs1都能与之通讯。以下是其示意图:

宿主机与容器通讯

当宿主机访问容器时,数据包从docker0流入到与容器对应的veth设备,在经容器的eth0到达到主机中,示意图如下:

 

外部访问容器

默认情况,其他外部网络(宿主机以外)无法访问到容器内的端口,通常的做法是使用-p或者-P选项(使用方法参考docker基础篇)来暴露容器中的端口到宿主机上,外部网络通过访问宿主机的端口从而访问到容器端口。本质上来说,该方式是通过iptables规则转发实现的,例如以下启动nginx容器并使用宿主机的8080映射到容器内部80端口:

查看其对应的iptables规则:

上述规则表明当访问宿主机的8080端口时,NAT到容器中的172.17.0.4的80中。

自定义网桥

除了使用默认docker0作网桥以为还可以使用docker network 相关命令自定义网桥,以下将创建一个br1的网络,子网是172.30.0.0/16,网关为172.30.0.1:

查看docker网络:

查看对应网桥:

此时运行一个容器指明网络使用br1,此时的容器地址使用的是172.30.0.0段的网络,此时使用的网桥为br-9e5b3fba2e11,如下:

三、host网络模式

Host模式使用是在容器启动时候指明--network host,此时容器共享宿主机的Network Namespace,容器内启动的端口直接是宿主机的端口,并且容器不会创建网卡和IP,直接使用宿主机的网卡和IP,但是容器内的其他资源是隔离的,如文件系统、用户和用户组。这种模式的好处就是效率高,因为不需要额外的网络开始,直接使用宿主机网络。同样启动一个nginx,此时共享主机网络:

此时连入容器内部直接能看到docker0与宿主机网卡:

以上的host网络模式下的示意图:

四、container网络模式

理解了host模式就很容易理解container模式,host模式是容器共享宿主机的Network Namespace,而container模式即共享已存在的容器的Network Namespace,此时这两容器共同使用同一网卡、主机名、IP地址,容器间通讯可直接通过lo回环接口通讯,但是其他名称空间是隔离的,例如User、Mount。如果你了解kubernetes中的pod的话,pod内的网络也是靠这样的共享方式来实现的。

这里启动一个bs-1容器,IP地址为172.17.0.2:

此时再运行一个容器共享bs-1的网络,此时在bs-2的容器同样看到的是bs1的网卡:

示意图:

五、none网络模式

使用--network none选项指定其网络模式,在该模式下虽然容器有着自己的Network Namespace,但是容器内没有网卡、IP、路由信息,只有一个lo回环接口。如果需要网络配置则需要用户手动进行配置网卡、ip以及路由信息,通常这样的容器用于承担某些无需网络介入的工作,如离线任务、备份等。启动一个none网络模式的容器如下:

示意图:

 

总结

  本文着重对docker 单主机网络中默认bridge网络模式做了较多介绍,其核心是通过docker0网桥+Veth Pair设备实现,而host、container模式都是“共享”方式实现,host网络模式是容器共享宿主机Network Namespace,continer网络模式是容器共享已存在的容器的Network Namespace,none模式则是网络封闭状态,容器内使用lo接口通讯。

おすすめ

転載: www.cnblogs.com/beyang/p/11934541.html