Docker 網(wǎng)絡(luò)機(jī)制不僅構(gòu)建了容器之間以及與外部服務(wù)間的高效通信橋梁,還通過靈活的配置選項(xiàng)滿足了不同應(yīng)用場(chǎng)景下的網(wǎng)絡(luò)隔離與互聯(lián)需求。每個(gè)Docker容器在啟動(dòng)時(shí),都可以選擇或指定加入到一個(gè)或多個(gè)Docker網(wǎng)絡(luò)中,這些網(wǎng)絡(luò)可以是Docker自動(dòng)創(chuàng)建的默認(rèn)網(wǎng)絡(luò)(如bridge模式網(wǎng)絡(luò)),也可以是用戶根據(jù)需要自定義的網(wǎng)絡(luò)(如overlay網(wǎng)絡(luò),用于支持跨主機(jī)容器通信)。
1. Docker 網(wǎng)絡(luò)
Docker 附帶了一個(gè)較為強(qiáng)大的網(wǎng)絡(luò)管理系統(tǒng),這個(gè)系統(tǒng)被設(shè)計(jì)得既直觀又靈活,旨在簡化容器、Docker 宿主機(jī)以及外部網(wǎng)絡(luò)之間的復(fù)雜通信過程。該系統(tǒng)不僅提供了網(wǎng)絡(luò)配置、監(jiān)控和故障排除的工具,還允許用戶根據(jù)具體需求選擇最適合的網(wǎng)絡(luò)類型,從而實(shí)現(xiàn)高效的資源利用和增強(qiáng)的安全性。
Docker 為核心網(wǎng)絡(luò)功能提供了5個(gè)標(biāo)準(zhǔn)網(wǎng)絡(luò)驅(qū)動(dòng)程序:
- Bridge
- Host
- Overlay
- IPvLAN
- Macvlan
Docker 網(wǎng)絡(luò)管理系統(tǒng)通過隔離不同網(wǎng)絡(luò)來增強(qiáng)容器的安全性。每個(gè)網(wǎng)絡(luò)都可以視為一個(gè)獨(dú)立的虛擬網(wǎng)絡(luò)環(huán)境,容器之間的通信被限制在它們所加入的網(wǎng)絡(luò)內(nèi)部。此外,系統(tǒng)還支持網(wǎng)絡(luò)策略(如防火墻規(guī)則)的配置,以進(jìn)一步控制容器間的流量和訪問權(quán)限,防止?jié)撛诘陌踩{。
網(wǎng)絡(luò)管理系統(tǒng)還提供了豐富的監(jiān)控和調(diào)試工具,幫助用戶實(shí)時(shí)了解網(wǎng)絡(luò)狀態(tài)、流量分布和潛在問題。通過這些工具,用戶可以快速定位并解決網(wǎng)絡(luò)延遲、丟包等常見問題,確保容器化應(yīng)用的穩(wěn)定運(yùn)行。另外。Docker 網(wǎng)絡(luò)管理系統(tǒng)支持動(dòng)態(tài)網(wǎng)絡(luò)配置,允許用戶在運(yùn)行時(shí)修改網(wǎng)絡(luò)設(shè)置,而無需停止或重啟容器。這一特性大大提高了應(yīng)用的靈活性和可擴(kuò)展性。
1.1 橋接網(wǎng)絡(luò)(Bridge Network)
橋接網(wǎng)絡(luò)在主機(jī)系統(tǒng)與容器環(huán)境之間構(gòu)筑起一座虛擬的聯(lián)通橋梁,確保網(wǎng)絡(luò)上的容器能夠無縫地進(jìn)行相互通信,同時(shí)與未加入此網(wǎng)絡(luò)的容器保持隔離狀態(tài),維護(hù)了網(wǎng)絡(luò)環(huán)境的清晰邊界。
圖片
每個(gè)容器均被賦予了一個(gè)獨(dú)特的IP地址,這一設(shè)計(jì)不僅促進(jìn)了容器間的獨(dú)立識(shí)別與交互,還通過與主機(jī)的橋接連接,賦予了容器訪問本地局域網(wǎng)(LAN)乃至互聯(lián)網(wǎng)的能力。然而,值得注意的是,盡管這些容器能夠參與網(wǎng)絡(luò)交互,但它們并不以物理實(shí)體的形式直接暴露于LAN之中,確保了網(wǎng)絡(luò)架構(gòu)的靈活性與安全性。
1.2 主機(jī)網(wǎng)絡(luò)(host network)
采用主機(jī)網(wǎng)絡(luò)模式的容器,其網(wǎng)絡(luò)配置完全融入了宿主機(jī)的網(wǎng)絡(luò)環(huán)境中,實(shí)現(xiàn)了無隔離的網(wǎng)絡(luò)共享。這些容器不再擁有獨(dú)立的IP地址,而是直接利用宿主機(jī)的網(wǎng)絡(luò)堆棧進(jìn)行通信。因此,當(dāng)容器中的進(jìn)程監(jiān)聽于某一端口(如8888端口)時(shí),該端口即被視為宿主機(jī)的一部分,外部用戶可通過宿主機(jī)的IP地址(如192.168.1.101)及相應(yīng)端口號(hào)(6666)直接訪問到容器內(nèi)的服務(wù),無需進(jìn)行復(fù)雜的端口映射配置。
圖片
同理,若數(shù)據(jù)庫服務(wù)在容器內(nèi)監(jiān)聽于3300端口,該服務(wù)同樣能夠通過宿主機(jī)的IP地址結(jié)合3300端口號(hào)被外部訪問,體現(xiàn)了主機(jī)網(wǎng)絡(luò)模式下容器與宿主機(jī)網(wǎng)絡(luò)的高度融合。
值得注意的是,在主機(jī)網(wǎng)絡(luò)模式下,容器發(fā)出的任何網(wǎng)絡(luò)活動(dòng)都將直接以宿主機(jī)的身份進(jìn)行,這使得從網(wǎng)絡(luò)層面難以區(qū)分這些活動(dòng)是由宿主機(jī)還是容器發(fā)起的,進(jìn)一步強(qiáng)調(diào)了該模式在簡化網(wǎng)絡(luò)配置的同時(shí),也需對(duì)網(wǎng)絡(luò)安全和隔離性進(jìn)行額外考量。
1.3 覆蓋網(wǎng)絡(luò)
覆蓋網(wǎng)絡(luò)(Overlay Networks)是構(gòu)建于多個(gè)Docker主機(jī)之上的虛擬網(wǎng)絡(luò)架構(gòu),它們巧妙地跨越了物理界限,使得分布在不同Docker主機(jī)上的容器能夠無縫地進(jìn)行相互通信,這一過程無需依賴底層操作系統(tǒng)的路由管理。這種網(wǎng)絡(luò)模式極大地提升了跨主機(jī)容器通信的靈活性與效率。
圖片
在Docker Swarm集群環(huán)境中,覆蓋網(wǎng)絡(luò)被廣泛應(yīng)用于實(shí)現(xiàn)容器間的網(wǎng)絡(luò)互聯(lián),但它們的用途并不局限于集群場(chǎng)景。即使面對(duì)兩個(gè)獨(dú)立運(yùn)行的Docker Engine實(shí)例,且存在直接通信需求的容器間,覆蓋網(wǎng)絡(luò)同樣能夠大顯身手,允許用戶在不依賴Docker Swarm完整集群功能的前提下,自行構(gòu)建出類似集群環(huán)境的網(wǎng)絡(luò)互聯(lián)能力,從而實(shí)現(xiàn)了網(wǎng)絡(luò)配置的靈活定制與擴(kuò)展。
尤為值得一提的是,在覆蓋網(wǎng)絡(luò)環(huán)境中,不僅容器能夠獲取到虛擬IP地址以實(shí)現(xiàn)跨主機(jī)通信,就連Docker主機(jī)本身也有機(jī)會(huì)獲得同一網(wǎng)段內(nèi)的虛擬IP地址。這一設(shè)計(jì)使得網(wǎng)絡(luò)拓?fù)涓忧逦?,管理更為便捷,同時(shí)也為復(fù)雜的分布式應(yīng)用架構(gòu)提供了堅(jiān)實(shí)的網(wǎng)絡(luò)支撐。
1.4 IPvLAN 網(wǎng)絡(luò)
IPvLAN 提供了一種高度靈活且強(qiáng)大的機(jī)制,允許對(duì)容器內(nèi)的 IPv4 和 IPv6 地址進(jìn)行精細(xì)化的配置與控制。它不僅限于地址分配,還深入處理第二層(L2)和第三層(L3)的VLAN標(biāo)記與路由邏輯,確保了網(wǎng)絡(luò)流量的高效管理與隔離。
圖片
在需要將容器化服務(wù)無縫集成至現(xiàn)有物理網(wǎng)絡(luò)架構(gòu)的場(chǎng)景中,IPvLAN 展現(xiàn)出了其獨(dú)特的優(yōu)勢(shì)與便利性。通過為容器網(wǎng)絡(luò)分配獨(dú)立的接口,它實(shí)現(xiàn)了與物理網(wǎng)絡(luò)更為緊密且高效的連接,其性能表現(xiàn)往往優(yōu)于傳統(tǒng)的基于橋接的網(wǎng)絡(luò)配置,為容器化應(yīng)用提供了更低的延遲和更高的吞吐量。
在 IPvLAN 的配置下,每個(gè)容器都被賦予了獨(dú)立的 IP 地址,并作為網(wǎng)絡(luò)的一個(gè)直接成員存在,這種設(shè)計(jì)既保證了容器間的相互獨(dú)立性,又促進(jìn)了它們與物理網(wǎng)絡(luò)之間的無縫通信,為構(gòu)建復(fù)雜、高性能的混合云環(huán)境奠定了堅(jiān)實(shí)的基礎(chǔ)。
1.5 Macvlan 網(wǎng)絡(luò)
Macvlan 賦予容器以類似于網(wǎng)絡(luò)中物理設(shè)備的身份進(jìn)行運(yùn)作的能力,其核心在于為每個(gè)容器分配一個(gè)獨(dú)一無二的 MAC 地址。這一設(shè)計(jì)使得容器在網(wǎng)絡(luò)層面上表現(xiàn)得如同直接連接在物理網(wǎng)絡(luò)上的獨(dú)立設(shè)備一般,極大地增強(qiáng)了容器間以及與外部網(wǎng)絡(luò)交互的靈活性和效率。
圖片
為了支持這種網(wǎng)絡(luò)類型,用戶需要將主機(jī)上的一個(gè)物理網(wǎng)絡(luò)接口(如以太網(wǎng)接口)作為資源分配給虛擬網(wǎng)絡(luò),以此作為容器接入網(wǎng)絡(luò)的橋梁。隨著 Docker 主機(jī)上容器數(shù)量的增加,管理并維護(hù)大量 MAC 地址成為了一個(gè)挑戰(zhàn)。因此,構(gòu)建一個(gè)能夠高效處理眾多 MAC 地址的擴(kuò)展性網(wǎng)絡(luò)架構(gòu)顯得尤為重要,以確保網(wǎng)絡(luò)環(huán)境的穩(wěn)定性和性能。通過精心規(guī)劃和管理,Macvlan 能夠?yàn)榇笮腿萜骰瘧?yīng)用提供強(qiáng)大而靈活的網(wǎng)絡(luò)支持。
2. 使用哪種類型的Docker網(wǎng)絡(luò)
橋接網(wǎng)絡(luò)因其廣泛的適用性和便捷性,成為了大多數(shù)容器化部署場(chǎng)景下的首選。這些網(wǎng)絡(luò)構(gòu)建了一個(gè)虛擬環(huán)境,使得容器之間能夠利用 IP 地址和 DNS 名稱輕松實(shí)現(xiàn)相互通信,同時(shí)保持與互聯(lián)網(wǎng)及本地網(wǎng)絡(luò)的順暢連接,滿足了多樣化的網(wǎng)絡(luò)需求。
對(duì)于特定場(chǎng)景,如要求容器直接利用主機(jī)的網(wǎng)絡(luò)接口,且無需額外網(wǎng)絡(luò)隔離時(shí),主機(jī)網(wǎng)絡(luò)模式則顯得尤為合適。此模式下,容器化應(yīng)用程序仿佛成為了主機(jī)網(wǎng)絡(luò)體系中的一部分,直接共享網(wǎng)絡(luò)資源,簡化了配置并提升了效率。
而覆蓋網(wǎng)絡(luò)則是跨越多臺(tái) Docker 主機(jī)實(shí)現(xiàn)容器間直接通信的關(guān)鍵技術(shù)。它們?yōu)闃?gòu)建分布式系統(tǒng)提供了強(qiáng)大的支持,通過增強(qiáng)系統(tǒng)的可靠性和擴(kuò)展性,成為提升應(yīng)用性能和服務(wù)質(zhì)量的理想選擇。
此外,當(dāng)應(yīng)用場(chǎng)景需要對(duì)容器進(jìn)行更為精細(xì)化的網(wǎng)絡(luò)控制,比如要求容器在網(wǎng)絡(luò)中表現(xiàn)得如同物理設(shè)備一般(例如,用于網(wǎng)絡(luò)流量監(jiān)控),Macvlan 網(wǎng)絡(luò)便展現(xiàn)出了其獨(dú)特的價(jià)值。而 IPvLAN 網(wǎng)絡(luò)則更進(jìn)一步,專為滿足高級(jí)網(wǎng)絡(luò)管理需求而設(shè)計(jì),允許用戶對(duì)容器的 IP 地址、VLAN 標(biāo)簽及路由策略實(shí)施精確的定制化配置,以滿足最為嚴(yán)苛的網(wǎng)絡(luò)環(huán)境要求。
3. Docker網(wǎng)絡(luò)的使用示例
以橋接網(wǎng)絡(luò)為例。使用 docker network create 命令就可以創(chuàng)建新的Docker網(wǎng)絡(luò),通過設(shè)置-d 標(biāo)志來指定的網(wǎng)絡(luò)類型,例如橋接網(wǎng)絡(luò)或主機(jī)網(wǎng)絡(luò)。如果省略該標(biāo)志,則默認(rèn)創(chuàng)建橋接網(wǎng)絡(luò)。
在一個(gè)終端窗口中運(yùn)行以下命令:
$ docker network create kd-network -d bridge
創(chuàng)建網(wǎng)絡(luò)完成后會(huì)得到網(wǎng)絡(luò)ID ,因?yàn)闆]有連接任何容器,新的網(wǎng)絡(luò)目前還沒啥用。但是可以通過使用 docker run 命令設(shè)置 -- network 標(biāo)志 將新容器附加到網(wǎng)絡(luò)。
$ docker run -it --rm --name container1 --network kd-network busybox:latest
這時(shí)如果啟動(dòng)另一個(gè) Ubuntu 容器,這次沒有 -- network 標(biāo)志:
$ docker run -it --rm --name container2 busybox:latest
這些容器還不在同一個(gè)網(wǎng)絡(luò)中,因此它們不能直接相互通信,可以將 Container 2連接到網(wǎng)絡(luò):
$ docker network connect test-network container2
這些容器現(xiàn)在共享一個(gè)網(wǎng)絡(luò),能夠彼此發(fā)現(xiàn)。Docker 允許在不重新啟動(dòng)容器的情況下自由地管理網(wǎng)絡(luò)連接,還可以將容器從它們不再需要參與的網(wǎng)絡(luò)中移除:$ docker network disconnect test-network container2
而且,所做的任何更改都將立即生效。如果想刪除一個(gè)網(wǎng)絡(luò),斷開或停止所有使用它的 Docker 容器,也非常方便:$ docker network rm test-network
4. 一句話小結(jié)
Docker 的網(wǎng)絡(luò)子系統(tǒng)提供了多樣化的策略,用以精細(xì)地管理容器間的通信方式、它們與相鄰容器的互操作性,以及它們與 Docker 主機(jī)之間的交互。在同一網(wǎng)絡(luò)域內(nèi)的容器,能夠靈活地通過各自的名稱或分配的 IP 地址建立連接,這種設(shè)計(jì)極大地簡化了網(wǎng)絡(luò)配置,并促進(jìn)了容器間的無縫協(xié)作。
盡管 Docker 容器間的網(wǎng)絡(luò)隔離程度相較于傳統(tǒng)虛擬機(jī)(VM)而言顯得較為寬松,但 Docker 依然提供了諸如 macvlan 這樣的高級(jí)網(wǎng)絡(luò)模式,使得容器能夠在網(wǎng)絡(luò)層面表現(xiàn)得如同物理設(shè)備一般,直接參與網(wǎng)絡(luò)流量的轉(zhuǎn)發(fā)與處理,從而滿足了特定場(chǎng)景下對(duì)網(wǎng)絡(luò)深度集成與靈活控制的需求。