docker中容器的四種網絡模式詳解

在docker中有四種網絡模式,bridge 橋接模式、host 模式、container 模式和 none 模式 啓動容器時可以使用 –net 參數指定,默認是橋接模式。
docker網絡的初始化過程
這裏寫圖片描述

這裏寫圖片描述

Bridge橋接方式

實現的步驟如下
(1) Docker Daemon 利用 veth pair 技術,在宿主機上創建兩個虛擬網絡接口設備,假設爲 veth0 和 veth1。而 veth pair 技術的特性可以保證無論哪一個 veth 接收到網絡報文,都會將報文傳輸給另一方。
(2) Docker Daemon 將 veth0 附加到 Docker Daemon 創建的 docker0 網橋上。保證宿主機的網絡報文可以發往 veth0;
(3) Docker Daemon 將 veth1 添加到 Docker Container 所屬的 namespace 下,並被改名爲 eth0。 如此一來,保證宿主機的網絡報文若發往 veth0,則立即會被 eth0 接收,實現宿主機到 Docker Container 網絡的聯通性;同時,也保證 Docker Container 單獨使用 eth0,實現容器網絡環境的隔離性。
bridge 橋接模式下的 Docker Container 在使用時,並非爲開發者包辦了一切。最明顯的是, 該模式下 Docker Container 不具有一個公有 IP,即和宿主機的 eth0 不處於同一個網段。導致 的結果是宿主機以外的世界不能直接和容器進行通信。雖然 NAT 模式經過中間處理實現了 這一點,但是 NAT 模式仍然存在問題與不便,如:容器均需要在宿主機上競爭端口,容器 內部服務的訪問者需要使用服務發現獲知服務的外部端口等。另外 NAT 模式由於是在三層 網絡上的實現手段,故肯定會影響網絡的傳輸效率。
大致的過程圖:
這裏寫圖片描述

Host 網絡模式

host 模式是 bridge 橋接模式很好的補充。採用 host 模式的 Docker Container,可以直接使用 宿主機的 IP 地址與外界進行通信,若宿主機的 eth0 是一個公有 IP,那麼容器也擁有這個公 有 IP。同時容器內服務的端口也可以使用宿主機的端口,無需額外進行 NAT 轉換。當然, 有這樣的方便,肯定會損失部分其他的特性,最明顯的是 Docker Container 網絡環境隔離性 的弱化,即容器不再擁有隔離、獨立的網絡棧。另外,使用 host 模式的 Docker Container 雖 然可以讓容器內部的服務和傳統情況無差別、無改造的使用,但是由於網絡隔離性的弱 化,該容器會與宿主機共享競爭網絡棧的使用;另外,容器內部將不再擁有所有的端口資 源,原因是部分端口資源已經被宿主機本身的服務佔用,還有部分端口已經用以 bridge 網 絡模式容器的端口映射。
大致的結構圖:
這裏寫圖片描述

Container 網絡模式:

(1) 查找 other container(即需要被共享網絡環境的容器)的網絡 namespace;
(2) 將新創建的 Docker Container(也是需要共享其他網絡的容器)的 namespace,使用 other container 的 namespace。
Docker Container 的 other container 網絡模式,可以用來更好的服務於容器間的通信。 在這種模式下的 Docker Container 可以通過 localhost 來訪問 namespace 下的其他容器,傳輸 效率較高。雖然多個容器共享網絡環境,但是多個容器形成的整體依然與宿主機以及其他 容器形成網絡隔離。另外,這種模式還節約了一定數量的網絡資源。但是需要注意的是,它並沒有改善容器與宿主機以外世界通信的情況。
這裏寫圖片描述

None 網絡模式:

網絡環境爲 none,即不爲 Docker Container 任何的網絡環境。一旦 Docker Container 採用了 none 網絡模式,那麼容器內部就只能使用 loopback 網絡設備,不會再有其他的網絡資源。 可以說 none 模式爲 Docker Container 做了極少的網絡設定,但是俗話說得好“少即是多”,在 沒有網絡配置的情況下,作爲 Docker 開發者,才能在這基礎做其他無限多可能的網絡定製 開發。這也恰巧體現了 Docker 設計理念的開放。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章