上一節咱們建立了 macvlan 並部署了容器,本節詳細分析 macvlan 底層網絡結構。docker
macvlan 不依賴 Linux bridge,brctl show
能夠確認沒有建立新的 bridge。網絡
查看一下容器 bbox1 的網絡設備:spa
除了 lo,容器只有一個 eth0,請注意 eth0 後面的 @if4
,這代表該 interface 有一個對應的 interface,其全局的編號爲 4
。根據 macvlan 的原理,咱們有理由猜想這個 interface 就是主機的 enp0s9,確認以下:code
可見,容器的 eth0 就是 enp0s9 經過 macvlan 虛擬出來的 interface。容器的 interface 直接與主機的網卡鏈接,這種方案使得容器無需經過 NAT 和端口映射就能與外網直接通訊(只要有網關),在網絡上與其餘獨立主機沒有區別。當前網絡結構如圖所示:ip
macvlan 會獨佔主機的網卡,也就是說一個網卡只能建立一個 macvlan 網絡,不然會報錯:部署
但主機的網卡數量是有限的,如何支持更多的 macvlan 網絡呢?get
好在 macvlan 不只能夠鏈接到 interface(如 enp0s9),也能夠鏈接到 sub-interface(如 enp0s9.xxx)。虛擬機
VLAN 是現代網絡經常使用的網絡虛擬化技術,它能夠將物理的二層網絡劃分紅多達 4094 個邏輯網絡,這些邏輯網絡在二層上是隔離的,每一個邏輯網絡(即 VLAN)由 VLAN ID 區分,VLAN ID 的取值爲 1-4094。it
Linux 的網卡也能支持 VLAN(apt-get install vlan
),同一個 interface 能夠收發多個 VLAN 的數據包,不過前提是要建立 VLAN 的 sub-interface。容器
好比但願 enp0s9 同時支持 VLAN10 和 VLAN20,則需建立 sub-interface enp0s9.10 和 enp0s9.20。
在交換機上,若是某個 port 只能收發單個 VLAN 的數據,該 port 爲 Access 模式,若是支持多 VLAN,則爲 Trunk 模式,因此接下來實驗的前提是:
enp0s9 要接在交換機的 trunk 口上。不過咱們用的是 VirtualBox 虛擬機,則不須要額外配置了。
若是你們想了解更多 Linux VLAN 實踐,可參看 CloudMan 《天天5分鐘玩轉 OpenStack》中的相關章節。
下面演示如何在 enp0s9.10 和 enp0s9.20 上建立 macvlan 網絡。
首先編輯 host1 和 host2 的 /etc/network/interfaces,配置 sub-
auto enp0s9
iface enp0s9 inet manual
auto enp0s9.10
iface enp0s9.10 inet manual
vlan-raw-device enp0s9
auto enp0s9.20
iface enp0s9.20 inet manual
vlan-raw-device enp0s9
而後啓用 sub-interface:
ifup enp0s9.10
ifup enp0s9.20
建立 macvlan 網絡:
docker network create -d macvlan --subnet=172.16.10.0/24 --gateway=172.16.10.1 -o parent=enp0s9.10 mac_net10
docker network create -d macvlan --subnet=172.16.20.0/24 --gateway=172.16.20.1 -o parent=enp0s9.20 mac_net20
在 host1 中運行容器:
docker run -itd --name bbox1 --ip=172.16.10.10 --network mac_net10 busybox
docker run -itd --name bbox2 --ip=172.16.20.10 --network mac_net20 busybox
在 host2 中運行容器:
docker run -itd --name bbox3 --ip=172.16.10.11 --network mac_net10 busybox
docker run -itd --name bbox4 --ip=172.16.20.11 --network mac_net20 busybox
當前網絡結構如圖所示:
這四個容器之間的連通性如何?下一節咱們將詳細討論 macvlan 網絡的連通和隔離特性。