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