1. 程式人生 > 實用技巧 >Docker網路管理

Docker網路管理

  Docker藉助強大的映象技術,讓應用的分發、部署與管理變得異常便捷。那麼,Docker網路功能又如何,能否滿足各種場景的需求。

1. Docker網路架構

  Docker在1.9版本引入了一整套docker network子命令和跨主機網路支援,這允許使用者可以根據他們應用的拓撲結構建立虛擬網路並將容器接入其對應的網路。為了標準化網路驅動的開發步驟和支援多種網路驅動,Docker公司在libnetwork中使用了CNM。CNM定義了構建容器虛擬化網路的模型,同時還提供了可以用於開發多中網路驅動的標準化介面和元件。

  CNM的三個核心元件:

  • 沙盒:一個沙盒包含了一個容器網路棧的資訊,可以對容器的介面、路由和DNS設定等進行管理。一個沙盒可以有多個端點和多個網路,實現可以是Linux network namespace等類似的機制。
  • 端點:一個端點可以加入一個沙盒和一個網路,端點的實現可以是veth pair等,一個端點只屬於一個網路和一個沙盒。
  • 網路:一個網路是一組可以直接互相連通的端點,網路的實現可以是Linux bridge、VLAN等。一個網路可以包含多個端點。

  libnetwork的五種內建驅動:

  • bridge驅動:Docker預設設定。libnetwork將建立的Docker容器連線到Docker0網橋上,這種模式下容器與外界通訊使用NAT。
  • host驅動:libnetwork將不為Docker建立網路協議棧,容器中的程序處於宿主機網路環境中,和宿主機公用一個network namespace,使用宿主機的網絡卡、IP和埠等資訊。但容器的其他諸如檔案系統、程序列表等還是和宿主機隔離的。這種模式下,容器可以直接使用宿主機IP與外界通訊。
  • overlay驅動:使用這種方式需要額外的配置儲存服務,如Consul、etcd、ZooKeeper。還需要在啟動Docker daemon的時候新增引數來指定所使用的配置儲存服務地址。
  • remote驅動:這個驅動呼叫了使用者自行實現的網路外掛,使libnetwork實現了驅動的可外掛化。
  • null驅動:這種模式下,Docker容器除了networke namespace自帶的loopback網絡卡外,沒有其他任何網絡卡、IP和路由等資訊,需要自行配置,因此給了使用者最大的自由度來定義容器網路環境。

$ sudo docker network create backend
$ sudo docker network create fronted
$ docker network ls

  name為bridge、host、null為三種內建網路,不能刪除。我們發現建立的network是一個網橋裝置,其實更準確來說功能更類似於交換機,如果進入然後我們使用connet命令按照上圖方式連線到網路中去後,con1和con2能夠ping同,con2和con3能夠ping通。如果進入到con2容器中會發現多了一塊網絡卡,其IP和網橋fronted同在一個IP段。所以docker network connect命令會在所連線的容器中建立新的網絡卡,以完成其指定網路的連線。

2. Docker四種網路模式

  建立docker時候指定網路模式實際上就是通過--net指定docker加入哪個網路中去,也就是上面我們通過docker connect ls列舉出來的三種系統網路模式。如果不使用--net引數指定,預設就是bridge模式。

  1. bridge模式

  當我們在一臺機子上裝完docker後,使用ifconfig命令,會發現多了一塊名為docker0的網絡卡,預設網段為172.17.0.1/16,宿主機也會在核心路由表上新增一條到達相應網路的靜態路由,可以通過route -n檢視。所有目的地址為172.17.0.0/16的資料包從docker0網絡卡發出。

  當我們啟動一個容器後,Docker從docker0子網中分配一個IP給容器使用,並設定docker0的IP地址為容器的預設閘道器。在主機上建立一對虛擬網絡卡veth pair裝置,Docker將veth pair裝置的一端放在新建立的容器中,並命名為eth0(容器的網絡卡),另一端放在主機中,以vethxxx這樣類似的名字命名,並將這個網路裝置加入到docker0網橋中。可以通過brctl show命令檢視。這裡簡單提一下veth裝置對,這個是Linux用來連線兩個network namespace的。所以不難想到,docker0其實不僅僅是一個網絡卡裝置了,而是一個網橋,準確的說功能等同於交換機,為連在其上的裝置轉發資料幀,網橋上的veth網絡卡相當於交換機上的埠,這些埠工作在二層,因此不需要配置IP資訊。容器中的資料通過docker0轉發到宿主機的eth0網絡卡上,可以讓容器順利訪問外網和宿主機網路。

  不難想象,預設模式下,各容器因為同處於一個網路中,因此可以互相訪問。而docker0作為一個二層裝置,其上的IP資訊作為連線容器預設閘道器地址的存在。

  Docker提供瞭如下引數幫助使用者自定義docker0設定:

  • --bip=CIDR:設定docker0的IP地址和子網範圍。
  • --fixed-cidr=CIDR:限制Docker容器獲取IP的範圍。
  • -mtu:指定docker0的最大傳輸單元。

 2. Host模式  

  容器將不會虛擬出自己的網絡卡,配置自己的IP等,而是使用宿主機的IP和埠。

3. container模式

  這個模式指定新建立的容器和已經存在的一個容器共享一個 Network Namespace,而不是和宿主機共享。新建立的容器不會建立自己的網絡卡,配置自己的 IP,而是和一個指定的容器共享 IP、埠範圍等。同樣,兩個容器除了網路方面,其他的如檔案系統、程序列表等還是隔離的。兩個容器的程序可以通過 lo 網絡卡裝置通訊。

4. None模式

歡迎關注公眾號

參考連結:

《Docker容器與容器雲第三版》

https://blog.csdn.net/suchahaerkang/article/details/84570488