一 引言
當 Docker 啟動時,會自動在主機上創建一個名為 docker0 虛擬網橋,這實際上就是 Linux 的一個 bridge,可以理解為一個軟件交換機。它會在掛載到它的網口之間進行轉發。
系統會為這個 docker0 分配一個私有網段的ip。如ip地址為172.17.0.1子網掩碼為255.255.0.0。
當我們創建一個新的容器時,同時會創建了一對veth pair接口(即對等接口,當數據包發送到一個接口時,另外一個接口也可以收到相同的數據包)。這對接口一端在容器內,即 eth0;另一端在本地並被掛載到 docker0 網橋,名稱以 veth 開頭。通過這種方式,主機可以跟容器通信,容器之間也可以相互通信。
二 驗證過程

可以看到隨機生成了兩個名稱為veth9454074和vethe9b7cb1的interfaces。

查看容器的網絡信息

docker inspect tomcat2

可以看到,容器內有一個名為eth0的網絡接口,ip為172.17.0.2。

可以看出來,在容器中輸出的路由信息,由172.17.0.0/16可知子網掩碼是255.255.0.0。由此可知,docker的docker0 虛擬網橋和容器里的eth0都是屬於同一個子網的。
這些網絡配置和使用docker inspect查詢出來的也是一致的。
同時可以驗證,容器(tomcat1)與容器(tomcat2)之間,主機與容器之間,容器與主機之間的網絡都是聯通的。
通過分析,上面的網絡拓撲如下:
三 網絡配置的過程
所以,Docker完成以上網絡配置的過程大致是這樣的
1 在主機上創建一對虛擬網卡veth pair設備。
2 Docker將veth pair設備的一端放在新創建的容器中,並命名為eth0。另一端放在主機中,以veth*這樣類似的名字命名,並將這個網絡設備加入到docker0網橋中。
3 從docker0子網中分配一個IP給容器使用,並設置docker0的IP地址為容器的默認網關。