Docker 網路管理

百聯達發表於2017-10-24
一:簡介



1. CNM(Container Network Model):定義了構建容器虛擬化網路的模型,同時還提供了可以用於開發多種網路驅動的標準化介面和元件。CNM中主要有沙盒(sandbox,端點(endpoint)和網路(network)三種元件。

2. Docker daemon透過呼叫libnetwork對外提供的API完成網路的建立和管理等功能。Libnetwork中則使用了CNM來完成網路功能的提供。

二:CNM核心元件

1.沙盒:一個沙盒包含了一個容器網路棧的資訊。沙盒可以對容器的介面,路由和DNS設定等進行管理。一個沙盒可以有多個端點和多個網路。

2.端點:一個端點可以加入一個沙盒和一個網路;一個端點只可以屬於一個網路並且只屬於一個沙盒。

3.網路:一個網路是一組可以直接互相聯通的端點。

 

三:libnetwork內建驅動

1. bridge驅動:此驅動為Docker的預設設定,使用這個驅動的時候,libnetwork將建立出來的Docker容器連線到Docker網橋上。作為最常規的模式,bridge模式已經可以滿足Docker容器最基本的使用。然而其與外界的通訊使用NAT(Network Address Translation,網路地址轉換),增加了通訊的複雜性,在複雜場景下使用會有諸多限制。

2. host驅動:使用這種驅動的時候,libnetwork將不為Docker建立網路協議棧(指網路中各層協議的總和,其形象的反映了一個網路中檔案傳輸的過程:由上層協議到底層協議,再由底層協議到上層協議)即不會建立獨立的network namespace. Docker容器中的程式處於宿主機的網路環境中,相當於Docker容器和宿主機公用同一個network namespace,使用宿主機的網路卡,IP和埠等資訊。但是,容器其他方面,如檔案系統,程式列表等還是和宿主機隔離的。Host模式很好地解決了容器與外界通訊的地址轉換問題,可以直接使用宿主機的IP進行通訊,不存在虛擬化網路帶來的額外效能負擔。但是host驅動也降低了容器與容器之間,容器與宿主機之間網路層面的隔離性,引起網路資源的競爭與衝突。因此可以認為host驅動適用於對於容器叢集規模不大的場景。

3. overlay驅動:

此驅動採用IETF標準的VXLAN方式,並且是VXLAN中被普遍認為最合適大規模的雲端計算虛擬化環境的SDN controller模式。在使用的過程中,需要一個額外的配置儲存服務,例如Consul,etcdZooKeeper.還需要在啟動Docker daemon的時候額外新增引數來指定所使用的配置儲存服務地址。

4. remote驅動:

這個驅動實際上並未做真正的網路服務實現,而是呼叫了使用者自行實現的網路驅動外掛,使libnetwork實現了驅動的可外掛化,更好地滿足了使用者的多種需求。使用者只要根據libnetwork提供的協議標準,實現其所要求的各個介面並向Docker daemon進行註冊。

5. null驅動:使用這種驅動的時候,Docker容器擁有自己的network namespace,但是並不為Docker容器進行任何網路配置。也就是說,這個Docker容器除了network namespace自帶的loopback網路卡外,沒有其他任何網路卡,IP,路由等資訊。需要使用者為Docker容器新增網路卡,配置IP等。這種模式如果不進行特定的配置是無法正常使用的,但是優點也非常明顯,它給了使用者最大的自由度來自定義容器的網路環境。

 
四:舉例



示例中,使用Docker預設的bridge驅動進行演示,組成一個網路拓撲的應用。

1.  它有兩個網路,backend network為後端網路,frontend network為前端網路,兩個網路互不聯通

         2.Container1和container3各擁有一個端點,並且分別加入到後端網路和前端網路中。而container2則有兩個端點。

除了backendfrontend之外,還有3Docker daemon預設建立的網路,預設網路無法使用docker network rm 進行刪除。

 

docker run -it --name container1 --net backend centos

docker run -it --name container2 --net backend centos

docker run -it --name container3 --net frontend centos



docker network connect frontend container2

Docker network connect命令會在所連線的容器中建立新的網路卡,以完成其與所指定網路的連線。

 

五:bridge驅動實現機制分析

 

1.  docker0網橋: linux安裝完Docker之後,宿主機上多了一塊名為docker0的網路卡。每個容器中都會有兩塊網路卡l0eth0. L0是容器的迴環網路卡;eth0即為容器與外界通訊的網路卡,它和宿主機上的網橋docker0在同一個網段。



1.  iptables規則:Docker安裝完成後,將預設在宿主機系統上增加一些iptables規則,以用於Docker容器和容器之間及和外界的通訊。

2.  Docker容器的DNS和主機名:同一個Docker映象可以啟動多個Docker容器,它們的主機名並不一樣,實際上容器中的/etc/hostname,/etc/hosts,/etc/resolv.conf 會被虛擬檔案覆蓋掉。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28624388/viewspace-2146300/,如需轉載,請註明出處,否則將追究法律責任。

相關文章