1. 程式人生 > >Docker網路管理(容器的四種網路模式)

Docker網路管理(容器的四種網路模式)

下面,我們來學習Docker的網路管理。
Docker 在啟動時會建立一個虛擬網橋 docker0,預設地址為 172.17.0.1/16,容器啟動後都會被橋接到 docker0 上,並自動分配到一個 IP 地址 .
  • docker0預設地址
    在這裡插入圖片描述
  • 網橋
    在這裡插入圖片描述
  • 容器橋接docker0後,自動分配ip地址
    在這裡插入圖片描述

一、容器的四種網路模式

Docker在建立容器時有四種網路模式,bridge為預設不需要用–net去指定,其他三種模式需要在建立容器時使用–net去指定。
  • bridge模式,使用–net=bridge指定,預設設定。
  • none模式,使用–net=none指定。
  • host模式,使用–net=host指定。
  • container模式,使用–net=container:容器名稱或ID指定
以下是docker網路初始化過程:

在這裡插入圖片描述
在這裡插入圖片描述

1、Bridge 橋接模式

在這裡插入圖片描述

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 模式由於是在三層網路上的實現手段,故肯定會影響網路的傳輸效率。

2、Host 模式

在這裡插入圖片描述

Host 網路模式

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

3、Container 模式

在這裡插入圖片描述

Container 網路模式

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

4、None 模式

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

在 none 網路模式下分配固定 ip:
netns 是在 linux 中提供網路虛擬化的一個專案,使用 netns 網路空間虛擬化可以在本地虛擬化出多個網路環境,目前 netns 在 lxc 容器中被用來為容器提供網路。使用 netns 建立的網路空間獨立於當前系統的網路空間,其中的網路裝置及 iptables 規則等都是獨立的,就好像進入了另外一個網路一樣。

二、Docker的四種模式部署

1、Bridge 橋接模式
[[email protected] ~]# docker run -it --name vm1 ubuntu

在這裡插入圖片描述在這裡插入圖片描述

2、Host 模式
[[email protected] ~]# docker run -it --name vm2 ubuntu

在這裡插入圖片描述在這裡插入圖片描述

[[email protected] ~]# docker run -it --name vm3 --net host ubuntu

在這裡插入圖片描述
在這裡插入圖片描述

3、Container 模式
[[email protected] ~]# docker run -it --name vm4 --net container:vm3 ubuntu
[[email protected] ~]# docker run -it --name vm5 --net container:vm1 ubuntu

在這裡插入圖片描述

4、None 模式
[[email protected] ~]# docker run -it --name vm6 --net none ubuntu

在這裡插入圖片描述


補充:

[[email protected]ation51 ~]# docker ps    

在這裡插入圖片描述

[[email protected] ~]# docker rm -f `docker ps -aq`    ##刪除所有執行的容器

在這裡插入圖片描述