Docker的網絡實現基本原理是利用了linux 的網絡命令空間和虛擬網絡設備,因為Linux 通過在內核中進行數據復制來實現虛擬接口之間的數據轉發,即發送接口的發送緩存中的數據包將直接復制到接收接口的接收緩存中,而無須通過外部物理設備進行交換,Docker 中的網絡接口默認都是虛擬接口,虛擬接口的最大優勢就是轉發效率極高。對于本地系統和容器內系統,虛擬接口與一個正常的以太網卡相比并無區別,只是它的速度要快得多。Docker 的網絡實現物理拓撲圖如圖1 所示。
圖 1 Docker 的網絡實現物理拓撲圖
可以發現,不同容器之間的網絡建立了連接并實現了各主機之間的通信,這是通過 Docker 網橋 docker 實現的。網橋是一個二層的虛擬網絡設備,能把若干個網絡接口連接起來,以使得接口之間的報文能夠互相轉發。
我們來具體看一下 Docker 創建一個容器的時候,會具體執行哪些操作
(1)創建一對虛擬接口,分別放到本地 Docker 宿主機和新容器的命名空間中。
(2)本地 Docker 宿主機一端的虛擬接口連接到默認的 docker網橋或指定網橋上,并具有一個以 “虛擬接口”開頭的唯一名字,例如虛擬接口1。
(3)容器這邊的虛擬接口將放到新創建的容器中,并修改名字為“虛擬接口2”,這個接口只在容器的命令空間中可見。
(4)Docker 宿主機從自身的網絡可用地址中獲取一個空閑地址分配給容器的“虛擬接口2”(例如 172.17.2.2/16)。
(5)完成這些操作以后,容器就可以使用它能看到的“虛擬接口2”虛擬網卡來訪問外部網絡(SNAT),或者外部網絡訪問新建容器(DNAT)。SNAT 和 DNAT 機制通過 Docker 宿主機本身的防火墻來實現。