詳解五種Docker容器的網(wǎng)絡(luò)模式
Docker 網(wǎng)絡(luò)設(shè)置了容器如何與其他容器和外部服務(wù)通信。為了獲得網(wǎng)絡(luò)訪問(wèn),容器需要是 Docker 網(wǎng)絡(luò)的一部分。容器可以通信的方式取決于它的網(wǎng)絡(luò)連接。Docker 提供了五種標(biāo)準(zhǔn)網(wǎng)絡(luò)模式來(lái)執(zhí)行核心網(wǎng)絡(luò)功能:Bridge(橋接)、Host(主機(jī))、Overlay(重疊)、IPvLAN、Macvlan。
1、橋接網(wǎng)絡(luò)
橋接網(wǎng)絡(luò)在主機(jī)機(jī)器和容器之間形成一個(gè)虛擬橋接。該網(wǎng)絡(luò)上的容器可以相互通信,但與未連接到該網(wǎng)絡(luò)的容器隔離。
圖片
每個(gè)容器都會(huì)獲得一個(gè)獨(dú)一無(wú)二的 IP 地址。通過(guò)與主機(jī)的橋接連接,這些容器還可以相互交互,與本地網(wǎng)絡(luò)(LAN)和 Internet 互聯(lián)。然而,它們不會(huì)以物理設(shè)備的形式出現(xiàn)在 LAN 上。
2、主機(jī)網(wǎng)絡(luò)(Host Network)
使用主機(jī)網(wǎng)絡(luò)模式的容器使用與主機(jī)機(jī)器相同的網(wǎng)絡(luò)設(shè)置,而不會(huì)被隔離。它們沒(méi)有單獨(dú)的 IP 地址。相反,它們使用的任何端口都直接鏈接到主機(jī)網(wǎng)絡(luò)。例如,如果容器進(jìn)程使用端口 8080,則可以通過(guò) 192.168.1.101:8080(即主機(jī)的 IP 地址和端口號(hào))訪問(wèn)它。
圖片
由于應(yīng)用程序容器使用端口 8080,因此不需要端口映射,因?yàn)樵谶@種情況下,容器使用主機(jī)端口。我們的數(shù)據(jù)庫(kù)使用端口 5432,因此可以通過(guò)主機(jī)的 IP 地址和 5432 端口進(jìn)行訪問(wèn)。
3、重疊網(wǎng)絡(luò)(Overlay Network)
重疊網(wǎng)絡(luò)是跨越多個(gè) Docker 主機(jī)的網(wǎng)絡(luò)。它們可以讓這些主機(jī)上的容器相互通信,而無(wú)需操作系統(tǒng)管理路由。
重疊網(wǎng)絡(luò)用于 Docker Swarm 集群。但是,如果有兩個(gè)單獨(dú)運(yùn)行的 Docker 引擎,并且需要直接連接它們的容器,也可以這樣使用它們。
圖片
上圖進(jìn)行了簡(jiǎn)化。在真實(shí)場(chǎng)景中,正如容器一樣,主機(jī)也會(huì)從重疊網(wǎng)絡(luò)獲取虛擬 IP 地址,而且它們的范圍是相同的。
4、IPvLAN 網(wǎng)絡(luò)
IPvLAN 是一種高級(jí)模式,可提供對(duì)容器的 IPv4 和 IPv6 地址進(jìn)行詳細(xì)控制的能力,它還可以處理第 2 層和第 3 層 VLAN 標(biāo)記和路由。
如果你需要將容器服務(wù)連接到已有物理網(wǎng)絡(luò),此模式會(huì)很有用。IPvLAN 網(wǎng)絡(luò)具有自己的接口,其性能可能比基于橋接網(wǎng)絡(luò)的網(wǎng)絡(luò)更好。
圖片
上圖顯示了 IPvLAN 設(shè)置中的所有內(nèi)容,包括容器,都有自己的 IP 地址,并且是網(wǎng)絡(luò)的一部分。
5、Macvlan 網(wǎng)絡(luò)
Macvlan 是一種更高級(jí)的選項(xiàng),讓容器能像網(wǎng)絡(luò)上的物理設(shè)備一樣運(yùn)行。它通過(guò)為每個(gè)容器分配自己的 MAC 地址來(lái)實(shí)現(xiàn)這一點(diǎn)。
對(duì)于此類(lèi)型的網(wǎng)絡(luò),你需要將主機(jī)的一個(gè)物理網(wǎng)絡(luò)接口分配給虛擬網(wǎng)絡(luò)。此外,更廣泛的網(wǎng)絡(luò)還應(yīng)設(shè)置為處理來(lái)自具有大量容器的 Docker 主機(jī)的許多 MAC 地址。
6、使用哪種網(wǎng)絡(luò)類(lèi)型
橋接網(wǎng)絡(luò)適用于大多數(shù)情況。這些網(wǎng)絡(luò)上的容器可以使用 IP 地址和 DNS 名稱(chēng)相互通信。它們還可以連接到互聯(lián)網(wǎng)和本地網(wǎng)絡(luò)。
主機(jī)網(wǎng)絡(luò)在需要直接使用主機(jī)的網(wǎng)絡(luò)接口并且不需要分離容器網(wǎng)絡(luò)時(shí)很有用。此設(shè)置使容器化的應(yīng)用程序像主機(jī)網(wǎng)絡(luò)的一部分一樣運(yùn)行。
重疊網(wǎng)絡(luò)在容器位于不同 Docker 主機(jī)上時(shí)需要直接通信時(shí)是必需的。它們非常適合為了提高可靠性創(chuàng)建分布式應(yīng)用。
在容器需要像網(wǎng)絡(luò)上的物理設(shè)備一樣運(yùn)行時(shí),Macvlan 網(wǎng)絡(luò)很有用,例如監(jiān)控網(wǎng)絡(luò)流量。IPvLAN 網(wǎng)絡(luò)適用于高級(jí)需求,例如對(duì)容器 IP 地址、標(biāo)記和路由的特定控制。
7、創(chuàng)建網(wǎng)絡(luò)
使用 docker network create 命令創(chuàng)建一個(gè)新網(wǎng)絡(luò)。通過(guò)設(shè)置 -d 標(biāo)志來(lái)指定要使用的驅(qū)動(dòng)程序,例如橋接或主機(jī)。如果省略標(biāo)志,將創(chuàng)建一個(gè)橋接網(wǎng)絡(luò)。
在第一個(gè)終端窗口中運(yùn)行以下命令:
docker network create test-network -d bridge
# 輸出是50ed05634f6a3312e56700ef683ca39df44bfc826e2e4da9179c2593c79910f9
創(chuàng)建的網(wǎng)絡(luò) ID 將顯示在終端中。目前,新網(wǎng)絡(luò)還無(wú)法使用,因?yàn)檫€沒(méi)有連接任何容器。
但是,你可以通過(guò)在 docker run 命令中設(shè)置 --network 標(biāo)志將新容器連接到網(wǎng)絡(luò)。在第二個(gè)終端窗口中運(yùn)行以下命令:
docker run -it --rm --name container1 --network test-network busybox:latest
接下來(lái),在第三個(gè)終端窗口中啟動(dòng)另一個(gè) Ubuntu 容器,這次不使用 --network 標(biāo)志:
docker run -it --rm --name container2 busybox:latest
現(xiàn)在,使用它們的名稱(chēng)在兩個(gè)容器之間進(jìn)行通信:
# 在container1中
/ # ping container2
ping: bad address 'container2'
容器尚未加入到同一個(gè)網(wǎng)絡(luò)中,因此它們無(wú)法直接相互通信。
使用第一個(gè)終端窗口將 container2 連接到網(wǎng)絡(luò)中:
docker network connect test-network container2
容器現(xiàn)在共享同一個(gè)網(wǎng)絡(luò),這使它們能夠相互發(fā)現(xiàn):
# 在container1中
/ # ping container2
PING container2 (172.22.0.7): 56 data bytes
64 bytes from 172.22.0.7: seq=0 ttl=64 time=2.205 ms
Docker 可以在不重新啟動(dòng)容器的情況下自由管理網(wǎng)絡(luò)連接。了解了如何在創(chuàng)建容器后連接容器,也可以從它們不再需要參與的網(wǎng)絡(luò)中刪除容器:
docker network disconnect test-network container2
如果想刪除一個(gè)網(wǎng)絡(luò),需要先斷開(kāi)或停止使用該網(wǎng)絡(luò)的所有 Docker 容器,然后將網(wǎng)絡(luò)的 ID 或名稱(chēng)傳遞給 network rm:
docker network rm test-network
總結(jié)
Docker 的網(wǎng)絡(luò)系統(tǒng)為管理容器如何與其他容器、相鄰容器和 Docker 主機(jī)通信提供了多種方式。同一網(wǎng)絡(luò)中的容器可以使用其名稱(chēng)或 IP 地址連接。