一)基本知識:
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/