使用Docker的macvlan為容器提供橋接網絡及跨主機通訊


對於了解Docker容器網絡的朋友,我想對虛擬機的網絡也不會陌生,畢竟我們是跟隨這個時代一起學習和進步的人。相比VM,Docker的網絡也在逐步走向成熟,本文主要針對其中的macvlan做下簡單的介紹。

Why macvlan?

首先我們去對比下VM和Docker中不同的網絡,這樣會比較清楚。

VM Docker
NAT bridge
Bridged macvlan, overlay等
Host-only bridge

NAT

VM中的NAT對應Docker中的bridge,雖然叫bridge,但和VM的bridged網絡卻不一樣,其原理是在宿主機上虛出一塊網卡bridge0,然后所有容器會橋接在這塊網卡的網段上。默認情況下容器能訪問外部網絡,但外部網絡無法訪問容器,因此需要通過暴露容器端口的方式(docker run -p)讓外部網絡訪問容器內的服務。此時docker會在宿主機上建立一條NAT路由規則,將子網中容器內的服務通過端口轉發(port forwarding)的方式暴露給外部網絡。當bridge網絡下不去暴露任何端口,那么基本上等同於VM的Host-only網絡。

Bridged

橋接網絡帶來的好處是,不需要通過NAT的端口映射即可實現容器內服務的暴露,當容器橋接到物理網絡時,容器就是物理網絡中的一台主機,使得容器間及容器與物理主機間實現互通。上面提到Docker中默認的bridge並不是真正的橋接網絡,而Docker的網絡是可以靈活自定義的,可以通過多種方式實現真正的橋接。其中可以通過overlay網絡驅動實現,多主機多容器的橋接,但需要依賴額外的key-value服務來保存網絡拓撲信息。另外一些第三方工具也能夠實現橋接模式,如pipework等。橋接網絡可以使容器網絡部署簡單化,因此Docker官方在1.12版本之后引入了macvlan網絡驅動,這樣我們可以更簡單的為容器配置橋接網絡。

Macvlan

顧名思義,macvlan的原理是在宿主機物理網卡上虛擬出多個子網卡,通過不同的MAC地址在數據鏈路層(Data Link Layer)進行網絡數據轉發的,它是比較新的網絡虛擬化技術,需要較新的內核支持(Linux kernel v3.9–3.19 and 4.0+)。

Using macvlan

docker network create -d macvlan \
    --subnet=192.168.1.0/24 \
    --gateway=192.168.1.1  \
    -o parent=enp4s0 mcv

# 解釋:
# 1.創建macvlan網絡,使用macvlan網絡驅動
# 2.指定要橋接的網絡地址
# 3.指定網關
# 4.設置要在宿主機上那塊網卡上建立虛擬子網卡

# 測試 docker run
--net=mcv --ip=192.168.1.99 -itd alpine /bin/sh # 運行容器,指定剛建好的macvlan網絡,並制定IP地址。
# 如果不指定IP,會通過IPAM分配IP,默認是從192.
168.1.2開始分配。
# 注意,分配時並不會判斷地址沖突,可以通過docker的network命令去指定分配方式,這里不做贅述。 docker run
--net=mcv -it --rm alpine /bin/sh # 運行另外一個容器,進行連通性測試 ping 192.168.1.99 ping 192.168.1.1

 

另外,macvlan還支持802.1q trunk等更為復雜的網絡拓撲結構,大家可以深入學習。

 

[via] Get started with Macvlan network driver

[via] Linux 上虛擬網絡與真實網絡的映射

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM