容器虛擬網卡與網橋docker0虛擬網卡的veth pair的配對


一)基本知識:

Docker 安裝時會自動在 host 上創建三個網絡:none,host,和bridge;詳細說明可參考其它文檔。我們可用 docker network ls 命令查看:

基於DRIVER是bridge的網絡都會有一個對應的linux bridge被創建:

在默認環境中,一個名為docker0的linux bridge自動被創建好了,其上有一個 docker0 內部接口,IP地址為172.17.0.1/16:

再用docker network inspect指令查看bridge網絡:其Gateway就是網卡/接口docker0的IP地址:172.17.0.1。

總結起來:network的名字是bridge,而對應的linux bridge的名字是docker0。

 

二)容器創建時IP地址的分配:

Docker 創建一個容器的時候,會執行如下操作:

 • 創建一對虛擬接口/網卡,也就是veth pair,分別放到本地主機和新容器中;
 • 本地主機一端橋接到默認的 docker0 或指定網橋上,並具有一個唯一的名字,如 vetha596da4;
 • 容器一端放到新容器中,並修改名字作為 eth0,這個網卡/接口只在容器的名字空間可見;
 • 從網橋可用地址段中(也就是與該bridge對應的network)獲取一個空閑地址分配給容器的 eth0,並配置默認路由到橋接網卡 vetha596da4。
完成這些之后,容器就可以使用 eth0 虛擬網卡來連接其他容器和其他網絡。
如果不指定--network,創建的容器默認都會掛到 docker0 上,使用本地主機上 docker0 接口的 IP 作為所有容器的默認網關。

當有多個容器創建后,容器網絡拓撲結構如下:

這時就會出現如何識別docker0的虛擬網卡和容器的對應關系,例如,圖示中有兩個容器和docker0中的兩個接口:

 

三)容器和docker0的虛擬網卡的配對:

先在host中查看接口IP地址信息:

並沒有IP地址,但接口名字后面有@ifxx的后綴。

再進入容器26ce9efe0412(鏡像 ubuntu-with-iptool)中查看IP地址信息:

eth0中出現了編號4和后綴@if5的信息,隱約與主機中編號5和if4的接口有對應關系。

可以利用ethtool來確認這種對應關系:分別在host和container中運行指令"ethtool -S <interface>":

可以清楚地看出來:

host中index=5的接口/網卡vetha596da4的peer inferface index是4;

container中index=4的網卡eth0的peer interface index是5。

注:

1) 該方法同樣適用於建立在其它bridge上的容器。

2) ethtool -S <interface>中如果interface名字帶上后綴就會報錯:

root@Ubuntu01:~# ethtool -S vetha596da4@if4
Cannot get stats strings information: No such device

 3) ethtool -i <interface>可查看interface的詳細信息。

參考鏈接:

https://www.cnblogs.com/CloudMan6/p/6220469.html
https://github.com/moby/moby/issues/14666
https://backreference.org/2013/06/20/some-notes-on-veth-interfaces/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM