溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Docker Network的原理是什么

發(fā)布時(shí)間:2021-11-16 14:01:57 來(lái)源:億速云 閱讀:236 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“Docker Network的原理是什么”,在日常操作中,相信很多人在Docker Network的原理是什么問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Docker Network的原理是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

Docker在容器內(nèi)運(yùn)行應(yīng)用程序,這需要在大量不同的網(wǎng)絡(luò)上進(jìn)行通信。這意味著Docker需要很強(qiáng)的網(wǎng)絡(luò)能力。幸運(yùn)的是,Docker有容器-容器網(wǎng)絡(luò)的解決方案,也有連接到已存在網(wǎng)絡(luò)和VLANs的解決方案。后者對(duì)于將app裝箱是非常重要的,這需要和外部系統(tǒng)諸如VM‘s和物理機(jī)上的功能和服務(wù)進(jìn)行通信。

Docker網(wǎng)絡(luò)是基于一個(gè)叫做Container Network Model (CNM)的開源可插拔的架構(gòu)。libnetwork是Docker真實(shí)世界的CNM實(shí)現(xiàn)。它提供了Docker所有的核心網(wǎng)絡(luò)能力。驅(qū)動(dòng)插入libnetwork網(wǎng)絡(luò)以提供特定的網(wǎng)絡(luò)拓?fù)洹?/p>

為創(chuàng)建平滑的開箱即用的體驗(yàn),Docker用一組原生驅(qū)動(dòng)來(lái)處理大多數(shù)通用的網(wǎng)絡(luò)需求。這包含單主機(jī)橋接網(wǎng)絡(luò)、多主機(jī)的overlays,插入已存在VLANs的選項(xiàng)。生態(tài)系統(tǒng)合作者擴(kuò)展了這個(gè),在未來(lái)可能提供他們自己的驅(qū)動(dòng)。

最后,libnetwork提供了本機(jī)服務(wù)發(fā)現(xiàn)和基本容器負(fù)載平衡解決方案。

(一)、理論

在最高層次,Docker網(wǎng)絡(luò)由三個(gè)主要組件:Container Network Model (CNM)、libnetwork、Drivers。

CNM是設(shè)計(jì)規(guī)范。它概括出了Docker網(wǎng)絡(luò)的 基礎(chǔ)構(gòu)建塊。

libenetwork是CNM的實(shí)際實(shí)現(xiàn),被Dokcer使用。用Go語(yǔ)言編寫,實(shí)現(xiàn)了CNM里的核心組件。

Drivers通過(guò)實(shí)現(xiàn)特定的網(wǎng)絡(luò)拓?fù)洌ㄖT如基于VXLAN的overlay網(wǎng)絡(luò))來(lái)擴(kuò)展了模型。

Docker Network的原理是什么

1、Container Network Model (CNM)

每件事都是從設(shè)計(jì)開始。

Docker網(wǎng)絡(luò)的設(shè)計(jì)指導(dǎo)是CNM。它概括出了Docker網(wǎng)絡(luò)的基本構(gòu)建塊,可以從https://github.com/docker/libnetwork/blob/master/docs/design.md讀取到全部規(guī)范。從更高層級(jí)上看,它定義了三個(gè)構(gòu)建塊:Sandboxes、Endpoints、 Networks。
sandbox是一個(gè)隔離的網(wǎng)絡(luò)棧,包括以太網(wǎng)接口、端口、路由表和DNS配置。

Endpoints是虛擬的網(wǎng)絡(luò)接口(E.g. veth),和正常網(wǎng)絡(luò)接口一樣,他們負(fù)責(zé)建立連接。在CNM的情況下,endpoint的工作室連接sandbox到網(wǎng)絡(luò)。

Networks 是802.1d橋接(大多數(shù)通常成為switch)的軟件實(shí)現(xiàn)。因此,他們將需要通信的一系列endpoint進(jìn)行分組并隔離。

Docker Network的原理是什么Docker Network的原理是什么

2、Libnetwork

CNM是設(shè)計(jì)doc,libnetwork是典型實(shí)現(xiàn)。是開源的,用Go編寫,跨平臺(tái),被Docker使用。

在Docker的早起,所有的網(wǎng)絡(luò)代碼存在于daemon,現(xiàn)在所有的核心Docker網(wǎng)絡(luò)代碼存在于libnetwork。libnetwork實(shí)現(xiàn)了定義在CNM中的所有三個(gè)組件。它也實(shí)現(xiàn)了本地服務(wù)發(fā)現(xiàn),基于ingress的容器負(fù)載 均衡、網(wǎng)絡(luò)控制平面和管理平面功能

3、Drivers

如果libnetwork實(shí)現(xiàn)了平面和管理平面,那么驅(qū)動(dòng)實(shí)現(xiàn)了數(shù)據(jù)平面。例如連接性和隔離性完全由驅(qū)動(dòng)控制,它是網(wǎng)絡(luò)對(duì)象的真實(shí)創(chuàng)建。關(guān)系如下:

Docker Network的原理是什么

Docker有幾個(gè)內(nèi)置驅(qū)動(dòng),也稱之為原生驅(qū)動(dòng)或本地驅(qū)動(dòng),在Linux上包括bridge, overlay和macvlan。在Windows上包括nat, overlay, transparent, and l2bridge。

第三方也可以寫Docker網(wǎng)絡(luò)驅(qū)動(dòng),他們稱之為遠(yuǎn)程驅(qū)動(dòng)( remote drivers)。每一個(gè)驅(qū)動(dòng)負(fù)責(zé)網(wǎng)絡(luò)上 所有資源的真實(shí)創(chuàng)建和管理。

為了滿足復(fù)雜的高流動(dòng)性環(huán)境的需求,libnetwork運(yùn)行同時(shí)有多個(gè)網(wǎng)絡(luò)驅(qū)動(dòng)器處于激活狀態(tài)。意味著Docker環(huán)境可以是異構(gòu)網(wǎng)絡(luò)。
(二)、單主機(jī)橋接網(wǎng)絡(luò)

Docker網(wǎng)絡(luò)最簡(jiǎn)單的類型是單主機(jī)橋接網(wǎng)絡(luò)(2層橋接網(wǎng)絡(luò))。Linux上的Docker用內(nèi)置的橋接驅(qū)動(dòng)創(chuàng)建了單主機(jī)橋接網(wǎng)絡(luò)。下圖顯示了兩個(gè)Docker主機(jī)有同樣的本地橋接網(wǎng)絡(luò)叫做“mynet”。盡管網(wǎng)絡(luò)一樣,但他們是獨(dú)立隔離的網(wǎng)絡(luò),意味著容器不能直接通信,因?yàn)樗麄冊(cè)诓煌木W(wǎng)絡(luò)上。

Docker Network的原理是什么

每一個(gè)Docker主機(jī)都有一個(gè)缺省的單主機(jī)橋接網(wǎng)絡(luò),在Linux叫“bridge”,在Windows上叫“nat”,缺省情況下,所有新容器將會(huì)附著到這個(gè)網(wǎng)絡(luò)。除非使用--network標(biāo)志重寫。可以使用命令:docker network ls,如下所示:

Docker Network的原理是什么

通過(guò)docker network inspect<network-name|network-id>,可以查看網(wǎng)絡(luò)的詳細(xì)情況。
Docker Network的原理是什么
在Linux主機(jī)上,使用橋接驅(qū)動(dòng)構(gòu)建的Docker網(wǎng)絡(luò)是基于battlehardened linux橋接技術(shù),其在Linux內(nèi)核中已經(jīng)存在了多余15年。這意味著高性能且極度穩(wěn)定。也意味著可以使用標(biāo)準(zhǔn)的Linux工具庫(kù)。例如ip link show docker0。

Docker缺省“bridge”網(wǎng)絡(luò)和Linux內(nèi)核中的“docker0”橋接的關(guān)系如下:

Docker Network的原理是什么Docker Network的原理是什么

由于所有新創(chuàng)建的容器被注冊(cè)在嵌入式的Docker DNS服務(wù)中,因此在相同網(wǎng)絡(luò)中的其他容器可以通過(guò)名字進(jìn)行解析。
注:Linux中缺省的橋接網(wǎng)絡(luò)不支持通過(guò)Docker DNS服務(wù)進(jìn)行名字解析,所有其他用戶定義的橋接網(wǎng)絡(luò)支持。

Docker Network的原理是什么

單主機(jī)橋接網(wǎng)絡(luò)僅用于本地開發(fā)和很小的應(yīng)用程序。因?yàn)閮H有一個(gè)單一容器可以綁定到主機(jī)上的任何端口。這意味著沒有其他的容器將會(huì)使用主機(jī)上的端口5000。

(三)、多主機(jī)overlay網(wǎng)絡(luò)

下一節(jié)將著重介紹多主機(jī)overlay網(wǎng)絡(luò),所以這里只做簡(jiǎn)短介紹。

overlay網(wǎng)絡(luò)是多主機(jī)的。他們?cè)试S一個(gè)單一網(wǎng)絡(luò)跨多個(gè)主機(jī),使得在不同主機(jī)上的容器可以再二層進(jìn)行通信。他們很適合于容器-容器通信,包括僅容器應(yīng)用程序。

Docker為overlay網(wǎng)絡(luò)提供了一個(gè)原生驅(qū)動(dòng)。這使得創(chuàng)建他們非常簡(jiǎn)單,僅 在docker network create命令后 增加--d overlay 標(biāo)志。

(四)、連接到已存在網(wǎng)絡(luò)

連接已裝箱app到外部系統(tǒng)和物理網(wǎng)絡(luò)的能力是很重要的。一個(gè)通用的例子是部分裝箱app,裝箱的部分需要一種方式去和運(yùn)行在外部物理網(wǎng)絡(luò)和VLANs中的非裝箱部分進(jìn)行通信??紤]到這一點(diǎn),創(chuàng)建了內(nèi)置的MACVLAN網(wǎng)絡(luò)。通過(guò)給定每一個(gè)容器他們自己的MAC和IP地址,使得容器成為已存在網(wǎng)絡(luò)上的一等公民。

Docker Network的原理是什么
積極的一面,MACVLAN性能 是好的,因?yàn)樗恍枰M(jìn)行端口映射或者額外的橋接,通過(guò)主機(jī)接口就可以連接容器接口。然而,反面來(lái)看,它需要主機(jī)的NIC處于promiscuous模式,這在大多數(shù)公共云平臺(tái)式 是不允許的。因此MACVLAN非常適合你自己的企業(yè)數(shù)據(jù)中心網(wǎng)絡(luò),但是不能在公共云工作。

在下屬圖片和假設(shè)例子的幫助下,讓我們更深的進(jìn)行理解。

Docker Network的原理是什么


現(xiàn)在,我們?cè)黾右粋€(gè)Docker主機(jī),如下所示:

Docker Network的原理是什么

我們現(xiàn)在有一個(gè)需求,將一個(gè)容器(app服務(wù))插入到VLAN100中。這樣做,我們使用macvlan創(chuàng)建一個(gè)新的Docker網(wǎng)絡(luò)。然而,macvlan需要我們告訴它一些關(guān)于網(wǎng)絡(luò)的事情。比如子網(wǎng)信息、網(wǎng)關(guān)、可以分配給容器的IP范圍、主機(jī)所使用的接口或者子接口。

創(chuàng)建一個(gè)叫做“macvlan100”的MACVLAN網(wǎng)絡(luò),將會(huì)把容器連接到VLAN 100.命令如下:

docker network create -d macvlan --subnet=10.0.0.0/24 --ip-range=10.0.00/25 --gateway=10.0.0.1 -o parent=eth0.100 macvlan100

上述命令執(zhí)行完后,如下所示:
Docker Network的原理是什么

MACVLAN使用標(biāo)準(zhǔn)的Linux子接口,你可以使用你將要連接的VLAN的ID來(lái)給他們打標(biāo)簽。在上述例子中,我們將要連接到VLAN 100,所以我們用.100(etho.100)來(lái)給子接口打標(biāo)簽。

我們也可以使用--ip-range標(biāo)志來(lái)告訴MACVLAN 網(wǎng)絡(luò)哪些IP地址的子集可以分配給容器。這個(gè)范圍的地址為Docker保留是很重要的,不能被其他的節(jié)點(diǎn)或者DHCP服務(wù)器使用。
執(zhí)行命令:docker container run -d --name mactainer1 --network macvlan100 alpine sleep 1d,此時(shí)網(wǎng)絡(luò)結(jié)構(gòu)如下:

Docker Network的原理是什么

注意:上述的基礎(chǔ)網(wǎng)絡(luò)VLAN 100并不能看到任何MACVLAN,它僅能看見帶有MAC和IP地址的容器。

現(xiàn)在,我們獲得了一個(gè)MACVLAN,用它將一個(gè)新容器連接到一個(gè)已存在的VLAN。Docker MACVLAN驅(qū)動(dòng)是構(gòu)建在同名的Linux內(nèi)核上 。它支持VLAN的trunk功能。這意味著我們可以創(chuàng)建多個(gè)MACVLAN網(wǎng)絡(luò),在相同的Docker主機(jī)上按照如下方式連接容器。

Docker Network的原理是什么

(五)、服務(wù)發(fā)現(xiàn)

除核心網(wǎng)絡(luò)之外,libnetwork也 提供了一些重要的網(wǎng)絡(luò)服務(wù)。

服務(wù)發(fā)現(xiàn)允許所有的容器和Swarm服務(wù)通過(guò)名稱來(lái)互相定位。唯一的需求是他們?cè)谙嗤木W(wǎng)絡(luò)上。這利用了Docker的嵌入式DNS服務(wù),也為每個(gè)容器提供了一個(gè)DNS解析器。如下圖所示,c1容器通過(guò)名稱來(lái)ping c2容器。

Docker Network的原理是什么

(六)、Ingress網(wǎng)絡(luò)

Swarm支持兩種發(fā)布模式,可以使得服務(wù)訪問集群外主機(jī):Ingress mode (default)、Host mode。

通過(guò)ingress模式發(fā)布的服務(wù)可以被swarm中的任何一個(gè)節(jié)點(diǎn)訪問—甚至節(jié)點(diǎn)沒有 運(yùn)行服務(wù)副本。通過(guò)主機(jī)模式發(fā)布的服務(wù)僅能通過(guò)運(yùn)行服務(wù)副本的節(jié)點(diǎn)訪問。下圖顯示了這兩種 模式的不同。

Docker Network的原理是什么

Ingress 模式是常用模式。其使用叫做Service Mesh或Swarm Mode Service Mesh的4層路由mesh,下圖顯示了外部請(qǐng)求到暴露在ingress模式中服務(wù)的基本流向。

Docker Network的原理是什么

到此,關(guān)于“Docker Network的原理是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI