1. 程式人生 > >自己學Docker:13.Docker網路模式1--預設模式bridge模式

自己學Docker:13.Docker網路模式1--預設模式bridge模式

當 Docker 啟動時,會自動在主機上建立一個名為 docker0 虛擬網橋,這實際上就是 Linux 的一個 bridge,可以理解為一個軟體交換機。它會在掛載到它的網口之間進行轉發。
這裡寫圖片描述
系統會為這個docker0 分配一個私有網段的ip。如ip地址為172.17.0.1子網掩碼為255.255.0.0。

當我們建立一個新的容器時,同時會建立了一對veth pair介面(即對等介面,當資料包傳送到一個介面時,另外一個介面也可以收到相同的資料包)。這對介面一端在容器內,即 eth0;另一端在本地並被掛載到 docker0 網橋,名稱以 veth 開頭。通過這種方式,主機可以跟容器通訊,容器之間也可以相互通訊。

過程分析

下面,來驗證這個問題。
先建立兩個容器:

sudo docker run -itd -P tomcat
sudo docker run -itd -P tomcat

這裡寫圖片描述
可以看到隨機生成了兩個名稱為veth0e50c02和vethbb96690的interfaces。

檢視主機網橋配置(brctl可以通過sudo apt install bridge-utils命令安裝):

brctl show

這裡寫圖片描述
兩個容器的網路埠都掛載到了docker0上。

sudo docker ps

檢視執行的docker容器。
這裡寫圖片描述

sudo docker inspect 419988cde703
sudo
docker inspect 4cc78bf3d858

可以看到兩個容器的網路資訊,由於輸出較多,這裡只列出網路資訊相關部分。
這裡寫圖片描述
這裡寫圖片描述
可以看出,這裡兩個容器的閘道器都是172.17.0.1,即docker在物理主機上建立的 docker0 虛擬網橋。ip地址分別為172.17.0.2和172.17.0.3。

進入到容器419988cde703中

這裡寫程式碼片

通過在容器中執行下面的命令,可以檢視容器的網路資訊。

ip addr show

這裡寫圖片描述
可以看到,容器內有一個名為eth0的網路介面,ip為172.17.0.1。

檢視容器轉發資訊

ip route show

這裡寫圖片描述
可以看出來,在容器中輸出的路由資訊,由172.17.0.0/16可知子網掩碼是255.255.0.0。由此可知,docker的docker0 虛擬網橋和容器裡的eth0都是屬於同一個子網的。
這些網路配置和使用docker inspect查詢出來的也是一致的。

同時可以驗證,容器(419988cde703)與容器(4cc78bf3d858)之間,主機與容器之間,容器與主機之間的網路都是聯通的。
這裡寫圖片描述

通過分析,上面的網路拓撲如下:
這裡寫圖片描述

網路配置的過程

所以,Docker完成以上網路配置的過程大致是這樣的:

  1. 在主機上建立一對虛擬網絡卡veth pair裝置。
  2. Docker將veth pair裝置的一端放在新建立的容器中,並命名為eth0。另一端放在主機中,以veth*這樣類似的名字命名,並將這個網路裝置加入到docker0網橋中。
  3. 從docker0子網中分配一個IP給容器使用,並設定docker0的IP地址為容器的預設閘道器。