??? docker網(wǎng)絡(luò)架構(gòu)是建立在一個(gè)接口集合之上,該接口集合被稱為容器網(wǎng)絡(luò)模型(Container Networking Mode,CNM)。設(shè)計(jì)CNM的目的是提供程序的可移植性。? 網(wǎng)絡(luò)模型結(jié)構(gòu)圖如下:

CNM結(jié)構(gòu)
CNM包含下面三部分:
Sandbox?— sandbox包含container的網(wǎng)絡(luò)棧配置,比如container的接口管理、路由表和DNS設(shè)置??梢酝ㄟ^(guò)Linux network space實(shí)現(xiàn)sandbox。Sandbox可以包含源于過(guò)個(gè)網(wǎng)絡(luò)的多個(gè) endpoint。
Endpoint?— Endpoint用于把Sandbox加入Network. Endpoint將程序到netork的實(shí)際連接剝離開(kāi)。這有助于維護(hù)可移植性,service可以使用不同類型的網(wǎng)絡(luò)驅(qū)動(dòng)接口而不必關(guān)心是如何連接到network。
Network?— 就OSI模型而言,CNM沒(méi)有指定具體的網(wǎng)絡(luò)。Network可以通過(guò)Linux bridge、VLAN等方式實(shí)現(xiàn)。Network匯集了相互間有連通性的多個(gè)endpoints。如果endpoint沒(méi)有連接到network,那么和network間就沒(méi)有連通性。
CNM驅(qū)動(dòng)接口
CNM提供了兩種可插拔的、開(kāi)放的接口:
1. Network
? ? Drivers?— docker 網(wǎng)絡(luò)驅(qū)動(dòng)使得network正常運(yùn)行。當(dāng)前docker engine或者cluster可以使用多個(gè)網(wǎng)絡(luò)驅(qū)動(dòng),但是每個(gè)Docker network只能通過(guò)一個(gè)網(wǎng)絡(luò)驅(qū)動(dòng)實(shí)例化。目前有兩種CNM網(wǎng)絡(luò)驅(qū)動(dòng):
??? 本地網(wǎng)絡(luò)驅(qū)動(dòng)(Native Network Drivers)?— dockers自身提供的本地網(wǎng)絡(luò)驅(qū)動(dòng),它屬于docker engine的一部分。有多種驅(qū)動(dòng)可以選擇,比如overlay networks、local bridges。
??? 遠(yuǎn)程網(wǎng)絡(luò)驅(qū)動(dòng)(Remote Network Drivers)?— 遠(yuǎn)程網(wǎng)絡(luò)驅(qū)動(dòng)是由社區(qū)或者其它供應(yīng)商創(chuàng)建。
2. IPAM
? ? Drivers?— docker擁有一個(gè)本地IP地址管理驅(qū)動(dòng),如果沒(méi)有指定network和endpoint,那么它會(huì)為之提供默認(rèn)子網(wǎng)或地址。也可以通過(guò)network、container和service創(chuàng)建命令手動(dòng)分配IP地址。也存在Remote IPAM drivers,并且提供對(duì)當(dāng)前IPAM工具的集成。

Docker本地網(wǎng)絡(luò)驅(qū)動(dòng)器
??? Docker本地網(wǎng)絡(luò)驅(qū)動(dòng)是Dockers Engine的一部分,它不需要額外的模塊。它們通過(guò)docker network命令調(diào)用。下表列出了native network drivers:
Host---使用host驅(qū)動(dòng), container使用主機(jī)的網(wǎng)絡(luò)棧。因?yàn)闆](méi)有命名空間隔離,所有主機(jī)的所有接口都可以被container直接使用。
Bridge---Bridge驅(qū)動(dòng)在主機(jī)上創(chuàng)建一個(gè)可以被docker管理的Linux 網(wǎng)橋。 默認(rèn)情況下,網(wǎng)橋上的container可以相互通信。通過(guò)bridge驅(qū)動(dòng)也可以配置外部訪問(wèn)container。
Overlay---Overlay驅(qū)動(dòng)創(chuàng)建一個(gè)overlay 網(wǎng)絡(luò),它支持多主機(jī)網(wǎng)絡(luò)。它聯(lián)合使用本地的Linux bridge和vxlan 來(lái)覆蓋基于物理網(wǎng)絡(luò)container-to-container通信。
MACVLAN---Macvlan驅(qū)動(dòng)使用MACVLAN 橋接模式在container接口和主機(jī)接口間建立連接。它能給container提供可以在物理網(wǎng)絡(luò)路由的IP地址。
None---None驅(qū)動(dòng)給予container自身網(wǎng)絡(luò)棧和網(wǎng)絡(luò)命名空間,但是并沒(méi)有在container內(nèi)部配置接口。?由于沒(méi)有額外的配置,container對(duì)主機(jī)網(wǎng)絡(luò)棧是完全隔離的。
網(wǎng)絡(luò)范圍
??? 在docker network ls的輸出結(jié)果中,dockers網(wǎng)絡(luò)驅(qū)動(dòng)有一個(gè)“范圍”的概念。有兩種:local和swarm。
1. Local驅(qū)動(dòng)在主機(jī)范圍內(nèi)提供連通性和網(wǎng)絡(luò)服務(wù)(比如DNS和IPAM)。
2. Swarm驅(qū)動(dòng)跨swarm集群提供連通性和網(wǎng)絡(luò)范服務(wù)。