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