Macvlan工做原理:linux
- Macvlan是Linux內核支持的網絡接口。要求的Linux內部版本是v3.9–3.19和4.0+;
- 經過爲物理網卡建立Macvlan子接口,容許一塊物理網卡擁有多個獨立的MAC地址和IP地址。虛擬出來的子接口將直接暴露在相鄰物理網絡中。從外部看來,就像是把網線隔開多股,分別接受了不一樣的主機上同樣;
- 物理網卡收到包後,會根據收到包的目的MAC地址判斷這個包須要交給其中虛擬網卡。
當容器須要直連入物理網絡時,可使用Macvlan。Macvlan自己不建立網絡,本質上首先使宿主機物理網卡工做在‘混雜模式’,這樣物理網卡的MAC地址將會失效,全部二層網絡中的流量物理網卡都能收到。接下來就是在這張物理網卡上建立虛擬網卡,併爲虛擬網卡指定MAC地址,實現一卡多用,在物理網絡看來,每張虛擬網卡都是一個單獨的接口。docker
- 使用Macvlan須要注意如下幾點:
- 容器直接鏈接物理網絡,由物理網絡負責分配IP地址,可能的結果是物理網絡IP地址被耗盡,另外一個後果是網絡性能問題,物理網絡中接入的主機變多,廣播包占比快速升高而引發的網絡性能降低問題;
- 宿主機上的某張網上須要工做在‘混亂模式’下;
- 前面說到,工做在混亂模式下的物理網卡,其MAC地址會失效,因此,此模式中運行的容器並不能與外網進行通訊,可是不會影響宿主機與外網通訊;
- 從長遠來看bridge網絡與overlay網絡是更好的選擇,緣由就是虛擬網絡應該與物理網絡隔離而不是共享。
兩臺docker主機:(centos7)
docker01: 172.16.1.30
docker02: 172.16.1.31vim
docker01:centos
(1)開啓ens33網卡的混雜模式,開啓網卡的多個虛擬interface(接口) [root@sqm-docker01 ~]# ip link set ens33 promisc on
##查看網卡的狀態: [root@sqm-docker01 ~]# ip link show ens33
(2)建立macvlan網絡: [root@sqm-docker01 ~]# docker network create -d macvlan --subnet 172.16.100.0/24 --gateway 172.16.100.1 -o parent=ens33 mac_net1
參數解釋:
-o: 綁定在哪張網卡之上(基於ens33網卡)網絡
(3)基於剛建立的網絡運行一個容器: [root@sqm-docker01 ~]# docker run -itd --name box1 --ip 172.16.100.10 --network mac_net1 busybox
docker02:(與docker01相同操做)ide
開啓混雜模式 [root@sqm-docker02 ~]# ip link set ens33 promisc on [root@sqm-docker02 ~]# ip link show ens33
//建立macvlan網絡 [root@sqm-docker02 ~]# docker network create -d macvlan --subnet 172.16.100.0/24 --gateway 172.16.100.1 -o parent=ens33 mac_net1
//運行一個容器: [root@sqm-docker02 ~]# docker run -itd --name box2 --network mac_net1 --ip 172.16.100.20 busybox
(4)測試兩個主機間的兩個容器相互通訊:性能
注意事項:
能ping通的緣由是兩個容器都是基於真實的ens33網卡的,因此宿主機上的ens33網卡必須可以相互通訊。這種方式只可以ping通ip地址,是沒法ping通容器名的。測試
(1)首先查看主機內核的8021q模塊: [root@sqm-docker01 ~]# modinfo 8021q
##若是沒有查看到該模塊,須要執行如下命令進行加載: [root@sqm-docker01 ~]# modprobe 8021q
開啓路由轉發: [root@sqm-docker01 ~]# echo "net.ipv4.ip_forward = 1" > /etc/sysctl.conf [root@sqm-docker01 ~]# sysctl -p net.ipv4.ip_forward = 1
(2)修改網絡配置信息:
docker01:centos7
[root@sqm-docker01 ~]# cd /etc/sysconfig/network-scripts/ [root@sqm-docker01 network-scripts]# ls
[root@sqm-docker01 network-scripts]# vim ifcfg-ens33
3d
基於ens33網卡進行建立子網卡:
[root@sqm-docker01 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33.10 #網卡名稱自定義 [root@sqm-docker01 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33.20
-p:表示保留原有屬性(權限)
//修改ens33.10網卡: [root@sqm-docker01 network-scripts]# vim ifcfg-ens33.10 ##只保留如下選項:
//修改ens33.20網卡: [root@sqm-docker01 network-scripts]# vim ifcfg-ens33.20 配置與ens33.10相同,只需修改ip地址:
(3)啓動子網卡:
[root@sqm-docker01 network-scripts]# ifup ifcfg-ens33.10 [root@sqm-docker01 network-scripts]# ifup ifcfg-ens33.20
//查看網絡信息 [root@sqm-docker01 network-scripts]# ifconfig
(4)基於ens33.10和ens33.20建立macvlan網絡:
注意:網段不一樣,網絡名稱不一樣
[root@sqm-docker01 ~]# docker network create -d macvlan --subnet 172.16.200.0/24 --gateway 172.16.200.1 -o parent=ens33.10 mac_net10 [root@sqm-docker01 ~]# docker network create -d macvlan --subnet 172.16.210.0/24 --gateway 172.16.210.1 -o parent=ens33.20 mac_net20
(5)基於以上網絡分別運行2個容器:
[root@sqm-docker01 ~]# docker run -itd --name test1 --ip 172.16.200.10 --network mac_net10 busybox [root@sqm-docker01 ~]# docker run -itd --name test2 --ip 172.16.210.10 --network mac_net20 busybox
部署docker02:
基本與docker01操做相同,注意網段的相同,但主機ip得不一樣。
#如下操做將不作解釋:
開啓路由轉發: [root@sqm-docker01 ~]# echo "net.ipv4.ip_forward = 1" > /etc/sysctl.conf [root@sqm-docker01 ~]# sysctl -p net.ipv4.ip_forward = 1
[root@sqm-docker02 network-scripts]# pwd /etc/sysconfig/network-scripts [root@sqm-docker02 network-scripts]# vim ifcfg-ens33
[root@sqm-docker02 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33.10 [root@sqm-docker02 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33.20
[root@sqm-docker02 network-scripts]# vim ifcfg-ens33.10
[root@sqm-docker02 network-scripts]# vim ifcfg-ens33.20
[root@sqm-docker02 network-scripts]# ifup ifcfg-ens33.10 [root@sqm-docker02 network-scripts]# ifup ifcfg-ens33.20
//建立macvlan網絡: [root@sqm-docker02 ~]# docker network create -d macvlan --subnet 172.16.200.0/24 --gateway 172.16.200.1 -o parent=ens33.10 mac_net10 [root@sqm-docker02 ~]# docker network create -d macvlan --subnet 172.16.210.0/24 --gateway 172.16.210.1 -o parent=ens33.20 mac_net20
//運行容器(ip地址不一樣): [root@sqm-docker02 ~]# docker run -itd --name test3 --network mac_net10 --ip 172.16.200.11 busybox [root@sqm-docker02 ~]# docker run -itd --name test4 --network mac_net20 --ip 172.16.210.11 busybox
//確保容器正常運行
:
(6)測試容器之間可以跨主機通訊:(注意:若是你是vmware環境的話,因爲VMware虛擬機的緣由,必須將兩臺主機默認的NAT模式修改成橋接模式纔可以正常通訊)
test3與test1通訊(相同網段):
test4與test2通訊(相同網段):
排錯思路:若是部署完主機間沒法通訊的話,首先確認防火牆或iptables規則是否關閉或放行,是否禁用selinux,其次排查ens33的網卡配置文件及其子網卡內容是否修改錯誤,最後排查你建立macvlan網絡是是否網段定義錯誤,或者在運行容器是否ip地址指定不正確。
----------------------macvlan多網絡跨主機實現通訊部署完畢---------------------
擴展知識點:
假設咱們運行了一個t1容器,而後t2容器使用t1容器的網絡棧。
[root@sqm-docker03 ~]# docker run -itd --name t1 busybox [root@sqm-docker03 ~]# docker exec t1 ip a
[root@sqm-docker03 ~]# docker run -it --name t2 --network container:t1 busybox
//接下來在t1容器中操做: [root@sqm-docker03 ~]# docker exec -it t1 bin/sh
而後在t2容器中也能夠看到此服務:
以上就是部署網絡棧的基本內容,本身也不是常常用到,就是爲了實現其餘容器可以共享其中一個容器中的資源。
———————— 本文至此結束,感謝閱讀 ————————