某些应用程序,尤为是遗留应用程序或监视网络流量的应用程序,但愿直接链接到物理网络。在这种状况下,您能够使用macvlan
网络驱动程序为每一个容器的虚拟网络接口分配MAC地址,使其看起来像是直接链接到物理网络的物理网络接口。在这种状况下,您须要在Docker主机上指定一个物理接口,用于Macvlan,以及Macvlan的子网和网关。您甚至能够使用不一样的物理网络接口隔离Macvlan网络。请记住如下事项:docker
建立Macvlan网络时,它能够处于桥接模式或802.1q干线桥接模式。bash
在桥接模式下,Macvlan流量经过主机上的物理设备。网络
在802.1q中继桥接模式下,流量经过Docker在运行中建立的802.1q子接口。这使您能够在更细粒度的级别上控制路由和筛选。spa
要建立与给定物理网络接口桥接的Macvlan网络,请使用--driver macvlan
该docker network create
命令。您还须要指定parent
,这是流量将在Docker主机上实际经过的接口。 网络名称是pub_net3d
[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
:code
$ 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 网络名称是macnet32router
若是指定parent
包含点的接口名称,例如eth0.50
,Docker将其解释为子接口eth0
并自动建立子接口。blog
[root@docker11 ~]# docker network create -d macvlan \
--subnet=192.168.50.0/24 \
--gateway=192.168.50.1 \
-o parent=eth0.50 macvlan50 cd6369cc9f81ca163f1fcd6b7f36db61276f0f750133e0f8812ce56697874cdc
在上面的示例中,您仍在使用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
若是已将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
网络的网络独立容器。在这种类型的网络中,Docker主机在其IP地址接受对多个MAC地址的请求,并将这些请求路由到适当的容器。有关其余网络主题,请参阅 概述。
这些教程的目标是设置桥接macvlan
网络并将容器链接到该网络,而后设置802.1q集群macvlan
网络并为其附加容器。
大多数云提供商阻止macvlan
网络。您可能须要物理访问您的网络设备。
在macvlan
网络驱动程序仅适用于Linux主机和Windows,或Windows Server dockerEE,不支持Mac的docker,。
您至少须要Linux内核版本3.9,建议使用4.0或更高版本。
这些示例假设您的以太网接口是eth0
。若是您的设备具备不一样的名称,请改用它。
在简单的网桥示例中,您的流量经过eth0
,Docker使用其MAC地址将流量路由到您的容器。要联网网络上的设备,您的容器彷佛已物理链接到网络。
建立一个macvlan
名为的网络my-macvlan-net
。将subnet
,, gateway
和parent
值修改成在您的环境中有意义的值。
[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 ls
和docker 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中继网桥示例中,您的流量经过eth0
(被叫eth0.10
)子接口流动,Docker使用其MAC地址将流量路由到您的容器。要联网网络上的设备,您的容器彷佛已物理链接到网络。
建立一个macvlan
名为的网络my-8021q-macvlan-net
。将subnet
,, gateway
和parent
值修改成 在您的环境中有意义的值。
[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