對於瞭解Docker容器網絡的朋友,我想對虛擬機的網絡也不會陌生,畢竟咱們是跟隨這個時代一塊兒學習和進步的人。相比VM,Docker的網絡也在逐步走向成熟,本文主要針對其中的macvlan作下簡單的介紹。linux
首先咱們去對比下VM和Docker中不一樣的網絡,這樣會比較清楚。docker
VM | Docker |
NAT | bridge |
Bridged | macvlan, overlay等 |
Host-only | bridge |
VM中的NAT對應Docker中的bridge,雖然叫bridge,但和VM的bridged網絡卻不同,其原理是在宿主機上虛出一塊網卡bridge0,而後全部容器會橋接在這塊網卡的網段上。默認狀況下容器能訪問外部網絡,但外部網絡沒法訪問容器,所以須要經過暴露容器端口的方式(docker run -p)讓外部網絡訪問容器內的服務。此時docker會在宿主機上創建一條NAT路由規則,將子網中容器內的服務經過端口轉發(port forwarding)的方式暴露給外部網絡。當bridge網絡下不去暴露任何端口,那麼基本上等同於VM的Host-only網絡。網絡
橋接網絡帶來的好處是,不須要經過NAT的端口映射便可實現容器內服務的暴露,當容器橋接到物理網絡時,容器就是物理網絡中的一臺主機,使得容器間及容器與物理主機間實現互通。上面提到Docker中默認的bridge並非真正的橋接網絡,而Docker的網絡是能夠靈活自定義的,能夠經過多種方式實現真正的橋接。其中能夠經過overlay網絡驅動實現,多主機多容器的橋接,但須要依賴額外的key-value服務來保存網絡拓撲信息。另一些第三方工具也可以實現橋接模式,如pipework等。橋接網絡可使容器網絡部署簡單化,所以Docker官方在1.12版本以後引入了macvlan網絡驅動,這樣咱們能夠更簡單的爲容器配置橋接網絡。ide
顧名思義,macvlan的原理是在宿主機物理網卡上虛擬出多個子網卡,經過不一樣的MAC地址在數據鏈路層(Data Link Layer)進行網絡數據轉發的,它是比較新的網絡虛擬化技術,須要較新的內核支持(Linux kernel v3.9–3.19 and 4.0+)。工具
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 上虛擬網絡與真實網絡的映射ui