Docker 使用 macvlan 實現跨主機網路通訊
一、背景
macvlan 本身是 linux kernel 模組,是一種網絡卡虛擬化技術;
它允許在同一個物理網絡卡上配置多個 MAC 地址,即多個 interface,每個 interface 可以配置自己的 IP。
macvlan 的最大優點是效能極好,它不需要建立 Linux bridge,而是直接通過以太 interface 連線到物理網路。
二、實驗容器 macvlan 網路
因為我們需要模擬跨主機容器通訊,因此需要兩臺機器,每個機器擁有自己的網絡卡,連到同一網路
首先,分別開啟兩臺機器網絡卡的混雜模式 (注意替換 ens160 為你的實際物理網絡卡介面名稱)
如果你使用的虛擬機器,注意在虛擬機器網路設定也要開啟允許混雜模式選項
# ip link set ens160 promisc on
然後,分別在兩臺機器上建立容器 macvlan 網路
# docker network create -d macvlan --subnet=10.20.14.0/24 --gateway=10.20.14.254 -o parent=ens160 mac_net1
這裡的網路資訊跟物理網絡卡所在網路資訊一致,parent 指明使用的物理網絡卡介面
然後,分別在兩臺機器上執行容器,使用 macvlan 網路
Host 1:
# docker run -it --ip=10.20.14.150 --network=mac_net1 busybox sh
Host 2:
# docker run -it --ip=10.20.14.151 --network=mac_net1 busybox sh
我們從 Host 1 內的容器 ping Host 2 內的容器
可以看到通訊正常!
一個 interface 只能建立一個 macvlan,如果想在一塊物理網絡卡建立多個 macvlan,可以使用 sub-interface
我們使用類似如下命令建立 sub-interface 裝置
# ip link add link ens160 name ens160.1 type vlan id 1
# ip addr add 10.20.14.226/24 brd 10.20.14.255 dev ens160.1
# ip link set dev ens160.1 up
刪除命令:
# ip link set dev ens160.1 down
# ip link delete ens160.1
檢視裝置:
# ip addr