docker從零開始網絡(六)Macvlan


使用Macvlan網絡

某些應用程序,尤其是遺留應用程序或監視網絡流量的應用程序,希望直接連接到物理網絡。在這種情況下,您可以使用macvlan網絡驅動程序為每個容器的虛擬網絡接口分配MAC地址,使其看起來像是直接連接到物理網絡的物理網絡接口。在這種情況下,您需要在Docker主機上指定一個物理接口,用於Macvlan,以及Macvlan的子網和網關。您甚至可以使用不同的物理網絡接口隔離Macvlan網絡。請記住以下事項:

  • 由於IP地址耗盡或“VLAN傳播”,很容易無意中損壞您的網絡,在這種情況下,您的網絡中有大量不同的唯一MAC地址。
  • 您的網絡設備需要能夠處理“混雜模式”,其中一個物理接口可以分配多個MAC地址。
  • 如果您的應用程序可以使用橋接器(在單個Docker主機上)或覆蓋層(跨多個Docker主機進行通信),那么從長遠來看,這些解決方案可能會更好。

創建一個macvlan網絡

創建Macvlan網絡時,它可以處於橋接模式或802.1q干線橋接模式。

  • 在橋接模式下,Macvlan流量通過主機上的物理設備。

  • 在802.1q中繼橋接模式下,流量通過Docker在運行中創建的802.1q子接口。這使您可以在更細粒度的級別上控制路由和篩選。

橋接模式

要創建與給定物理網絡接口橋接的Macvlan網絡,請使用--driver macvlandocker network create命令。您還需要指定parent,這是流量將在Docker主機上實際通過的接口。 網絡名稱是pub_net

[root@docker11 ~]# docker network create -d macvlan --subnet=172.16.86.0/24 --gateway=172.16.86.1 -o parent=eth0 pub_net
7479d90651e92d8971916e678dceaad5c6deb845b7af30802b028afa022c98d0

如果您需要排除在Macvlan網絡中使用的IP地址,例如當已使用給定的IP地址時,請使用--aux-addresses

$ docker network create -d macvlan  \
  --subnet=192.168.32.0/24  \
  --ip-range=192.168.32.128/25 \
  --gateway=192.168.32.254  \
  --aux-address="my-router=192.168.32.129" \
  -o parent=eth0 macnet32

192.168.32.128/25      意思就是地址范圍從 192.168.32.128   255.255.255.128   網絡名稱是macnet32

802.1q中繼橋接模式

如果指定parent包含點接口名稱,例如eth0.50,Docker將其解釋為子接口eth0並自動創建子接口。

[root@docker11 ~]# docker network create -d macvlan \
--subnet=192.168.50.0/24 \
--gateway=192.168.50.1 \
-o parent=eth0.50 macvlan50 cd6369cc9f81ca163f1fcd6b7f36db61276f0f750133e0f8812ce56697874cdc

使用ipvlan而不是macvlan

在上面的示例中,您仍在使用L3網橋。您可以使用ipvlan ,然后獲得L2橋接。指定-o ipvlan_mode=l2。 需要內核版本4.0或以上

$ docker network create -d ipvlan \
    --subnet=192.168.210.0/24 \
    --subnet=192.168.212.0/24 \
    --gateway=192.168.210.254  \
    --gateway=192.168.212.254  \
     -o ipvlan_mode=l2 ipvlan210

使用IPv6

如果已將Docker守護程序配置為允許IPv6,則可以使用雙棧IPv4 / IPv6 Macvlan網絡。

[root@docker11 ~]# docker network create -d macvlan \
> --subnet=192.168.216.0/24 --subnet=192.168.218.0/24 \
> --gateway=192.168.216.1 --gateway=192.168.218.1 \
> --subnet=2001:db8:abc8::/64 --gateway=2001:db8:abc8::10 \
> -o parent=eth0.218 \
> -o macvlan_mode=bridge macvlan216
65a2dc885f5dd2778089ba636a2dc1050331a4f83f2b2ff3f509e6df5b348a3d

 

使用macvlan網絡進行聯網

本系列教程涉及連接到macvlan網絡的網絡獨立容器在這種類型的網絡中,Docker主機在其IP地址接受對多個MAC地址的請求,並將這些請求路由到適當的容器。有關其他網絡主題,請參閱 概述

目標

這些教程的目標是設置橋接macvlan網絡並將容器連接到該網絡,然后設置802.1q集群macvlan網絡並為其附加容器。

先決條件

  • 大多數雲提供商阻止macvlan網絡。您可能需要物理訪問您的網絡設備。

  • macvlan網絡驅動程序僅適用於Linux主機和Windows,或Windows Server  dockerEE,不支持Mac的docker,。

  • 您至少需要Linux內核版本3.9,建議使用4.0或更高版本。

  • 這些示例假設您的以太網接口是eth0如果您的設備具有不同的名稱,請改用它。

bridge的例子

在簡單的網橋示例中,您的流量通過eth0,Docker使用其MAC地址將流量路由到您的容器。要聯網網絡上的設備,您的容器似乎已物理連接到網絡。

  1. 創建一個macvlan名為網絡my-macvlan-netsubnet,, gatewayparent修改為在您的環境中有意義的值。

[root@benjamincloud ~]# docker network create -d macvlan \
> --subnet=172.16.86.0/24 \
> --gateway=172.16.86.1 \
> -o parent=eth0 \
> my-macvlan-net
eae982543504a4951eeaad53f31c1c6442cde5844385e80600bf619be340f091

您可以使用docker network lsdocker network inspect pub_net 命令來驗證網絡是否存在且是否為macvlan網絡。

 

 2.啟動alpine容器並將其連接到my-macvlan-net網絡。該 -dit標志在后台啟動容器。--rm標志表示容器在停止時被移除

 

[root@benjamincloud ~]# docker run --rm -itd --network my-macvlan-net --name my-macvlan-alpine alpine:latest ash

 

 

3.檢查my-macvlan-alpine容器並注意MacAddress密鑰中的Networks密鑰:

4.通過運行幾個docker exec命令,查看容器如何看到自己的網絡接口

[root@benjamincloud ~]# docker exec my-macvlan-alpine ip addr show eth0
19: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UNKNOWN
    link/ether 02:42:ac:10:56:02 brd ff:ff:ff:ff:ff:ff
    inet 172.16.86.2/24 brd 172.16.86.255 scope global eth0
       valid_lft forever preferred_lft forever
[root@benjamincloud ~]# docker exec my-macvlan-alpine ip  route
default via 172.16.86.1 dev eth0
172.16.86.0/24 dev eth0 scope link  src 172.16.86.2

5.停止容器(Docker因--rm標志而刪除它),然后刪除網絡。

[root@benjamincloud ~]# docker network rm my-macvlan-net
my-macvlan-net

 

802.1q集群橋示例

在802.1q中繼網橋示例中,您的流量通過eth0(被叫eth0.10子接口流動,Docker使用其MAC地址將流量路由到您的容器。要聯網網絡上的設備,您的容器似乎已物理連接到網絡。

  1. 創建一個macvlan名為網絡my-8021q-macvlan-netsubnet,, gatewayparent修改為 在您的環境中有意義的值。

[root@benjamincloud ~]# docker network create -d macvlan --subnet 172.16.86.0/24 --gateway 172.16.86.1 -o parent=eth0.10 my-8021q-macvlan-net
0c3d8cfdfc34a00a40317cf0d9d8db32b29a9477cde24e6458c99a1a1592ec65

 

 2.啟動alpine容器並將其連接到my-8021q-macvlan-net 網絡。-dit標志在后台啟動容器,但讓你重視它。--rm標志表示容器在停止時被移除。

[root@benjamincloud ~]# docker run --rm -itd \
> --network my-8021q-macvlan-net \
> --name my-second-macvlan-alpine \
> alpine:latest \
> ash
6971038a66ebf529072308d9160c7322e85d58c2c52956006f4f3dead502f594

3.檢查my-second-macvlan-alpine容器並注意MacAddress 密鑰中的Networks密鑰:

 

4.通過運行幾個docker exec命令,查看容器如何看到自己的網絡接口

5.停止容器(Docker因--rm標志而刪除它),然后刪除網絡。

 

[root@benjamincloud ~]# docker stop my-second-macvlan-alpine
my-second-macvlan-alpine
[root@benjamincloud ~]# docker network rm my-8021q-macvlan-net
my-8021q-macvlan-net

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM