亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Docker容器跨主機多網段通信解決方案

發布時間:2020-06-29 19:21:15 來源:網絡 閱讀:1701 作者:warrent 欄目:云計算

一、MacVlan的概念

實現Docker的跨主機網絡通信的方案有很多,比如在之前博文中寫到的通過部署consul服務實現Docker容器跨主機通信 ,而這篇博文將Macvlan寫下來

Macvlan工作原理:

  • Macvlan是Linux內核支持的網絡接口。要求的Linux內部版本是v3.9–3.19和4.0+;
  • 通過為物理網卡創建Macvlan子接口,允許一塊物理網卡擁有多個獨立的MAC地址和IP地址。虛擬出來的子接口將直接暴露在相鄰物理網絡中。從外部看來,就像是把網線隔開多股,分別接受了不同的主機上一樣;
  • 物理網卡收到包后,會根據收到包的目的MAC地址判斷這個包需要交給其中虛擬網卡。

當容器需要直連入物理網絡時,可以使用Macvlan。Macvlan本身不創建網絡,本質上首先使宿主機物理網卡工作在‘混雜模式’,這樣物理網卡的MAC地址將會失效,所有二層網絡中的流量物理網卡都能收到。接下來就是在這張物理網卡上創建虛擬網卡,并為虛擬網卡指定MAC地址,實現一卡多用,在物理網絡看來,每張虛擬網卡都是一個單獨的接口。

使用Macvlan有幾點需要注意:

  • 容器直接連接物理網絡,由物理網絡負責分配IP地址,可能的結果是物理網絡IP地址被耗盡,另一個后果是網絡性能問題,物理網絡中接入的主機變多,廣播包占比快速升高而引起的網絡性能下降問題;
  • 宿主機上的某張網上需要工作在‘混亂模式’下;
  • 前面說到,工作在混亂模式下的物理網卡,其MAC地址會失效,所以,此模式中運行的容器并不能與外網進行通信,但是不會影響宿主機與外網通信;
  • 從長遠來看bridge網絡與overlay網絡是更好的選擇,原因就是虛擬網絡應該與物理網絡隔離而不是共享。

工作示意圖如下:

Docker容器跨主機多網段通信解決方案

二、配置實例

實例1(實現容器基于macvlan的單網段跨主機通信):

實現效果:

  • 兩臺centos 7.5,分別運行著docker服務;
  • 兩臺docker服務器創建相同的一個MacVlan網絡,使docker服務器上的容器可以實現跨主機通信。

開始配置:
(1)第一臺docker服務器配置如下:

[root@docker ~]# ip link set ens33 promisc on    #開啟ens33網卡的混雜模式。
#也就是開啟網卡的多個虛擬interface(接口)  
[root@docker ~]# ip link show ens33    #確定查看的信息包含以下標紅的字樣
2: ens33: <BROADCAST,MULTICAST,'PROMISC',UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether 00:0c:29:2f:89:cb brd ff:ff:ff:ff:ff:ff
[root@docker ~]# docker network create -d macvlan --subnet 172.22.16.0/24 --gateway 172.22.16.1 -o parent=ens33 mac_net1
#創建macvlan網絡,指定網段、網關等信息,“-o”指定綁定在哪張網卡之上
[root@docker ~]# docker run -tid --name box1 --ip 172.22.16.10 --network mac_net1 busybox
#基于新創建的macvlan網絡運行一個容器,并指定其IP。

確認運行的容器的IP地址:
Docker容器跨主機多網段通信解決方案
(1)第二臺docker服務器配置如下(與第一臺docker服務器的配置基本相似):

[root@docker02 ~]# ip link set ens33 promisc on      #開啟ens33網卡的混雜模式。
[root@docker02 ~]#  ip link show ens33      #確定查看的信息包含以下標紅的字樣
2: ens33: <BROADCAST,MULTICAST,'PROMISC',UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether 00:0c:29:c6:57:bc brd ff:ff:ff:ff:ff:ff
[root@docker02 ~]# docker network create -d macvlan --subnet 172.22.16.0/24 --gateway=172.22.16.1 -o parent=ens33 mac_net1
#創建一個與第一臺docker服務器的網段、網關相同的macvlan。并綁定到物理網卡上。
#為了可以直觀的看出其他docker服務器上的macvlan和第這臺是在同一個網段的。
#所以,建議設置的網絡名稱一樣。
[root@docker02 ~]# docker run -tid --name box2 --ip 172.22.16.11 --network mac_net1 busybox
#運行一個容器,并指定是基于macvlan網絡的
#注意,其IP地址不要與其他docker服務器上的容器IP地址沖突

確認運行的容器的IP地址:
Docker容器跨主機多網段通信解決方案

使用第二臺docker服務器上的容器box2對第一臺docker服務器上的容器box1進行ping測試:

Docker容器跨主機多網段通信解決方案

OK,跨主機的容器通信就通過macvlan實現了。由于使用混雜模式會造成物理網卡的MAC地址失效,所以容器并不能通過此模式進行與外網的通信。

實例2(基于macvlan的跨主機網絡多網段的解決方案)

實現的效果如下:

  • 兩臺centos 7.5,分別運行著docker服務;
  • 每臺宿主機創建了兩個MacVlan網段供容器使用(172.10.16.0/24和172.20.16.0/24);
  • 第一臺docker服務器上運行容器bbox1和bbox2,第二臺docker服務器運行容器bbox3和bbox4。
  • 最終實現跨主機的同網段容器互相通信。

開始配置:
(1)第一臺docker服務器配置如下:

[root@docker ~]# ip link set ens33 promisc on    #開啟ens33網卡的混雜模式。
#也就是開啟網卡的多個虛擬interface(接口)  
[root@docker ~]# ip link show ens33    #確定查看的信息包含以下標紅的字樣
2: ens33: <BROADCAST,MULTICAST,'PROMISC',UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether 00:0c:29:2f:89:cb brd ff:ff:ff:ff:ff:ff
[root@docker ~]# modinfo 8021q    #查看是否加載8021q模塊,如果有信息返回,則表示該模塊已經加載

modinfo 8021q命令返回的信息如下:
Docker容器跨主機多網段通信解決方案

[root@docker ~]# modprobe 8021q     #若沒有加載8021q模塊,則執行此命令
[root@docker ~]# cd /etc/sysconfig/network-scripts/
[root@docker network-scripts]# vim ifcfg-ens33     #更改物理網卡配置
            ...............#省略部分內容
BOOTPROTO=manual        #將此配置項該為“manual”,也是手動的意思
            ...............#省略部分內容
#更改完成后,保存退出即可
[root@docker network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33.10   #將網卡配置文件復制一份
# “-p”表示保留文件原本的屬性
[root@docker network-scripts]# vim ifcfg-ens33.10     #更改復制出來的配置文件如下

BOOTPROTO=none
NAME=ens33.10       #注意更改名稱
DEVICE=ens33.10     #注意更改名稱
ONBOOT=yes
IPADDR=192.168.10.10    #給虛擬網卡設置一個IP
PREFIX=24
GATEWAY=192.168.10.2
VLAN=yes
#更改完成后,保存退出即可,注意,以上的IP與容器將要使用的IP并不是同一網段
[root@docker network-scripts]# cp ifcfg-ens33.10 ifcfg-ens33.20
[root@docker network-scripts]# vim ifcfg-ens33.20    #編輯如下
BOOTPROTO=none
NAME=ens33.20       #注意更改名稱
DEVICE=ens33.20       #注意更改名稱
ONBOOT=yes
IPADDR=192.168.30.10    #注意,此處的IP與ens33.10并不在同一網段
PREFIX=24
GATEWAY=192.168.30.2
VLAN=yes
#更改完成后,保存退出即可 
[root@docker network-scripts]# ifdown ens33;ifup ens33   #重啟網卡,使更改生效
[root@docker network-scripts]# ifup ens33.10    #開啟ens33.10
[root@docker network-scripts]# ifup ens33.20    #開啟ens33.20
[root@docker ~]# docker network create -d macvlan --subnet 172.10.16.0/24 --gateway 172.10.16.1 -o parent=ens33.10 mac_net10
#創建一個macvlan網絡,給其定義一個網段、網關及綁定到ens33.10
[root@docker ~]# docker network create -d macvlan --subnet 172.20.16.0/24 --gateway 172.20.16.1 -o parent=ens33.20 mac_net20
#創建一個macvlan網絡,給其定義一個網段、網關及綁定到ens33.20
#接下來分別基于剛剛創建的macvlan網絡運行一個容器
[root@docker ~]# docker run -itd --name bbox1 --network mac_net10 --ip 172.10.16.10 busybox
#基于網絡mac_net10運行一個容器,并指定其IP
[root@docker ~]# docker run -itd --name bbox2 --network mac_net20 --ip 172.20.16.20 busybox
#基于網絡mac_net10運行一個容器,并指定其IP

(2)第二臺docker服務器配置如下(基本與第一臺操作類似,只是要注意IP不要沖突):

[root@docker02 ~]# ip link set ens33 promisc on    #開啟ens33網卡的混雜模式。
#也就是開啟網卡的多個虛擬interface(接口)  
[root@docker02 ~]# ip link show ens33    #確定查看的信息包含以下標紅的字樣
2: ens33: <BROADCAST,MULTICAST,'PROMISC',UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether 00:0c:29:2f:89:cb brd ff:ff:ff:ff:ff:ff
[root@docker02 ~]# modinfo 8021q    #查看是否加載8021q模塊,如果有信息返回,則表示該模塊已經加載

modinfo 8021q命令返回的信息如下:
Docker容器跨主機多網段通信解決方案

[root@docker02 ~]# modprobe 8021q     #若沒有加載8021q模塊,則執行此命令
[root@docker02 ~]# cd /etc/sysconfig/network-scripts/
[root@docker02 network-scripts]# vim ifcfg-ens33     #更改物理網卡配置
            ...............#省略部分內容
BOOTPROTO=manual        #將此配置項該為“manual”,也是手動的意思
            ...............#省略部分內容
#更改完成后,保存退出即可
[root@docker02 network-scripts]# scp root@192.168.20.7:/etc/sysconfig/network-scripts/ifcfg-ens33.* .
#將第一臺docker服務器上的虛擬網卡配置文件復制過來

root@192.168.20.7 s password:         #輸入第一臺docker服務器的用戶密碼
ifcfg-ens33.10                 100%  117     0.1KB/s   00:00    
ifcfg-ens33.20                 100%  117     0.1KB/s   00:00    
[root@docker02 network-scripts]# vim ifcfg-ens33.10    #只是更改其IP即可

BOOTPROTO=none
NAME=ens33.10
DEVICE=ens33.10
ONBOOT=yes
IPADDR=192.168.10.11      #更改IP是為了不要和第一臺docker服務器的虛接口IP沖突
PREFIX=24
GATEWAY=192.168.10.2
VLAN=yes
[root@docker02 network-scripts]# vim ifcfg-ens33.20       #同上

BOOTPROTO=none
NAME=ens33.20
DEVICE=ens33.20
ONBOOT=yes
IPADDR=192.168.30.11    #更改其IP地址
PREFIX=24
GATEWAY=192.168.30.2
VLAN=yes
[root@docker02 network-scripts]# ifdown ens33;ifup ens33   #重啟網卡,使更改生效
[root@docker02 network-scripts]# ifup ens33.10   #啟動ens33.10
[root@docker02 network-scripts]# ifup ens33.20   #啟動ens33.20
#接下來創建macvlan網絡,與第一臺docker服務器創建的網絡一樣
[root@docker02 ~]# docker network create -d macvlan --subnet 172.10.16.0/24 --gateway 172.10.16.1 -o parent=ens33.10 mac_net10
[root@docker02 ~]# docker network create -d macvlan --subnet 172.20.16.0/24 --gateway 172.20.16.1 -o parent=ens33.20 mac_net20
#接下來基于剛剛創建的網絡運行兩個容器
#基于mac_net10運行容器bbox3
[root@docker02 ~]# docker run -tid --name bbox3 --network mac_net10 --ip 172.10.16.11 busybox
#基于mac_net20運行容器bbox4
[root@docker02 ~]# docker run -itd --name bbox4 --network mac_net20 --ip 172.20.16.21 busybox

配置至此,即可進行ping測試了,如果配置無誤,則bbox3應該和bbox1互通(因為其都是基于mac_net1010網絡);bbox4應該和bbox2互通(同理)。

但bbox3和bbox1不能和bbox4和bbox2互通(因為其不是基于同一個虛擬局域網)。

容器bbox3 ping 容器bbox1測試(注意:若是使用vmware虛擬機進行測試,由于vmware的特性,需將其網絡適配器改為“橋接模式”,而不是NAT模式等。否則無法通信)
Docker容器跨主機多網段通信解決方案

容器bbox4 ping 容器bbox2測試:
Docker容器跨主機多網段通信解決方案

至此,跨主機網絡多網段已經實現,同樣,各個容器無法與外網進行通信。

docker網絡是一個比較復雜的概念,若有耐心,還是建議閱讀docker官方文檔

———————— 本文至此結束,感謝閱讀 ————————

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

保德县| 陈巴尔虎旗| 乌兰浩特市| 凤冈县| 嵩明县| 河曲县| 玉溪市| 淮滨县| 漠河县| 佛坪县| 福建省| 广西| 台前县| 阜平县| 崇阳县| 五河县| 自贡市| 体育| 保德县| 阿城市| 宜昌市| 涪陵区| 中宁县| 临夏市| 达尔| 永登县| 偏关县| 黄大仙区| 乌什县| 白水县| 黄梅县| 禹州市| 呼和浩特市| 阿瓦提县| 开远市| 高密市| 威海市| 栾城县| 利川市| 阿图什市| 宜宾市|