docker部署Macvlan實現(xiàn)跨主機網(wǎng)絡(luò)通信的實現(xiàn)
基本概念:
Macvlan工作原理:
Macvlan是Linux內(nèi)核支持的網(wǎng)絡(luò)接口。要求的Linux內(nèi)部版本是v3.9–3.19和4.0+;通過為物理網(wǎng)卡創(chuàng)建Macvlan子接口,允許一塊物理網(wǎng)卡擁有多個獨立的MAC地址和IP地址。虛擬出來的子接口將直接暴露在相鄰物理網(wǎng)絡(luò)中。從外部看來,就像是把網(wǎng)線隔開多股,分別接受了不同的主機上一樣;物理網(wǎng)卡收到包后,會根據(jù)收到包的目的MAC地址判斷這個包需要交給其中虛擬網(wǎng)卡。
當(dāng)容器需要直連入物理網(wǎng)絡(luò)時,可以使用Macvlan。Macvlan本身不創(chuàng)建網(wǎng)絡(luò),本質(zhì)上首先使宿主機物理網(wǎng)卡工作在‘混雜模式',這樣物理網(wǎng)卡的MAC地址將會失效,所有二層網(wǎng)絡(luò)中的流量物理網(wǎng)卡都能收到。接下來就是在這張物理網(wǎng)卡上創(chuàng)建虛擬網(wǎng)卡,并為虛擬網(wǎng)卡指定MAC地址,實現(xiàn)一卡多用,在物理網(wǎng)絡(luò)看來,每張?zhí)摂M網(wǎng)卡都是一個單獨的接口。
使用Macvlan需要注意以下幾點:
- 容器直接連接物理網(wǎng)絡(luò),由物理網(wǎng)絡(luò)負(fù)責(zé)分配IP地址,可能的結(jié)果是物理網(wǎng)絡(luò)IP地址被耗盡,另一個后果是網(wǎng)絡(luò)性能問題,物理網(wǎng)絡(luò)中接入的主機變多,廣播包占比快速升高而引起的網(wǎng)絡(luò)性能下降問題;
- 宿主機上的某張網(wǎng)上需要工作在‘混亂模式'下;
- 前面說到,工作在混亂模式下的物理網(wǎng)卡,其MAC地址會失效,所以,此模式中運行的容器并不能與外網(wǎng)進行通信,但是不會影響宿主機與外網(wǎng)通信;
- 從長遠(yuǎn)來看bridge網(wǎng)絡(luò)與overlay網(wǎng)絡(luò)是更好的選擇,原因就是虛擬網(wǎng)絡(luò)應(yīng)該與物理網(wǎng)絡(luò)隔離而不是共享。
項目環(huán)境:
兩臺docker主機:(centos7)
docker01: 172.16.1.30
docker02: 172.16.1.31
項目操作:
實例一:macvlan跨主機單網(wǎng)絡(luò)解決方案:
docker01:
(1)開啟ens33網(wǎng)卡的混雜模式,開啟網(wǎng)卡的多個虛擬interface(接口)
[root@sqm-docker01 ~]# ip link set ens33 promisc on
##查看網(wǎng)卡的狀態(tài): [root@sqm-docker01 ~]# ip link show ens33
(2)創(chuàng)建macvlan網(wǎng)絡(luò):
[root@sqm-docker01 ~]# docker network create -d macvlan --subnet 172.16.100.0/24 --gateway 172.16.100.1 -o parent=ens33 mac_net1
參數(shù)解釋:
-o: 綁定在哪張網(wǎng)卡之上(基于ens33網(wǎng)卡)
(3)基于剛創(chuàng)建的網(wǎng)絡(luò)運行一個容器:
[root@sqm-docker01 ~]# docker run -itd --name box1 --ip 172.16.100.10 --network mac_net1 busybox
docker02:(與docker01相同操作)
開啟混雜模式 [root@sqm-docker02 ~]# ip link set ens33 promisc on [root@sqm-docker02 ~]# ip link show ens33
//創(chuàng)建macvlan網(wǎng)絡(luò) [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網(wǎng)卡的,所以宿主機上的ens33網(wǎng)卡必須能夠相互通信。這種方式只能夠ping通ip地址,是無法ping通容器名的。
實例二:macvlan跨主機多網(wǎng)絡(luò)解決方案:
(1)首先查看主機內(nèi)核的8021q模塊:
[root@sqm-docker01 ~]# modinfo 8021q
##如果沒有查看到該模塊,需要執(zhí)行以下命令進行加載: [root@sqm-docker01 ~]# modprobe 8021q
開啟路由轉(zhuǎn)發(fā): [root@sqm-docker01 ~]# echo "net.ipv4.ip_forward = 1" > /etc/sysctl.conf [root@sqm-docker01 ~]# sysctl -p net.ipv4.ip_forward = 1
(2)修改網(wǎng)絡(luò)配置信息:
docker01:
[root@sqm-docker01 ~]# cd /etc/sysconfig/network-scripts/ [root@sqm-docker01 network-scripts]# ls
[root@sqm-docker01 network-scripts]# vim ifcfg-ens33
基于ens33網(wǎng)卡進行創(chuàng)建子網(wǎng)卡:
[root@sqm-docker01 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33.10 #網(wǎng)卡名稱自定義 [root@sqm-docker01 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33.20
-p:表示保留原有屬性(權(quán)限)
//修改ens33.10網(wǎng)卡: [root@sqm-docker01 network-scripts]# vim ifcfg-ens33.10 ##只保留以下選項:
//修改ens33.20網(wǎng)卡: [root@sqm-docker01 network-scripts]# vim ifcfg-ens33.20 配置與ens33.10相同,只需修改ip地址:
(3)啟動子網(wǎng)卡:
[root@sqm-docker01 network-scripts]# ifup ifcfg-ens33.10 [root@sqm-docker01 network-scripts]# ifup ifcfg-ens33.20
//查看網(wǎng)絡(luò)信息 [root@sqm-docker01 network-scripts]# ifconfig
(4)基于ens33.10和ens33.20創(chuàng)建macvlan網(wǎng)絡(luò):
注意:網(wǎng)段不同,網(wǎng)絡(luò)名稱不同
[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)基于以上網(wǎng)絡(luò)分別運行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操作相同,注意網(wǎng)段的相同,但主機ip得不同。
#以下操作將不做解釋:
開啟路由轉(zhuǎn)發(fā): [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
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持本站。
[root@sqm-docker02 network-scripts]# ifup ifcfg-ens33.10 [root@sqm-docker02 network-scripts]# ifup ifcfg-ens33.20
//創(chuàng)建macvlan網(wǎng)絡(luò):[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環(huán)境的話,由于VMware虛擬機的原因,必須將兩臺主機默認(rèn)的NAT模式修改為橋接模式才能夠正常通信)
test3與test1通信(相同網(wǎng)段):
test4與test2通信(相同網(wǎng)段):
排錯思路:如果部署完主機間無法通信的話,首先確認(rèn)防火墻或iptables規(guī)則是否關(guān)閉或放行,是否禁用selinux,其次排查ens33的網(wǎng)卡配置文件及其子網(wǎng)卡內(nèi)容是否修改錯誤,最后排查你創(chuàng)建macvlan網(wǎng)絡(luò)是是否網(wǎng)段定義錯誤,或者在運行容器是否ip地址指定不正確。
----------------------macvlan多網(wǎng)絡(luò)跨主機實現(xiàn)通信部署完畢---------------------
擴展知識點:
假設(shè)我們運行了一個t1容器,然后t2容器使用t1容器的網(wǎng)絡(luò)棧。
[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容器中也可以看到此服務(wù):
以上就是部署網(wǎng)絡(luò)棧的基本內(nèi)容,自己也不是經(jīng)常用到,就是為了實現(xiàn)其他容器能夠共享其中一個容器中的資源。
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。