使用IPvlan网络
预计阅读时间:26分钟
IPvlan驱动程序使用户可以完全控制IPv4和IPv6寻址。VLAN驱动程序的基础是为运营商提供了对底层网络集成感兴趣的用户的第2层VLAN标记甚至IPvlan L3路由的完全控制权。对于抽象化物理约束的覆盖部署,请参阅多主机覆盖驱动程序。
IPvlan是在久经考验的真正网络虚拟化技术上的新突破。Linux实现非常轻巧,因为它们没有使用传统的Linux桥接器进行隔离,而是与Linux以太网接口或子接口相关联,以实现网络之间的分隔以及与物理网络的连接。
IPvlan提供了许多独特的功能,并为通过各种模式进行进一步的创新提供了足够的空间。这些方法的两个高级优点是:绕过Linux桥接器对性能产生积极的影响,以及减少活动部件的简便性。删除传统上驻留在Docker主机NIC和容器接口之间的网桥,可以进行一个简单的设置,该设置由容器接口组成,直接连接到Docker主机接口。对于外部服务,此结果易于访问,因为在这些情况下不需要端口映射。
先决条件
- 此页面上的示例都是单个主机。
- 所有示例都可以在运行Docker的单个主机上执行。使用子接口之类的任何示例
eth0.10
都可以替换eth0
为Docker主机上的或任何其他有效的父接口。动态.
创建带有的子接口。-o parent
也可以将docker network create
所有接口都排除在外, 并且驱动程序将创建一个dummy
接口,该接口将使本地主机连接能够执行示例。 - 内核要求:
- 要检查您当前的内核版本,请使用
uname -r
- IPvlan Linux内核v4.2 +(存在对较早版本内核的支持,但存在错误)
- 要检查您当前的内核版本,请使用
IPvlan L2模式示例用法
L2
下图显示了IPvlan模式拓扑的示例。该驱动程序通过-d driver_name
选项指定。在这种情况下-d ipvlan
。
下一个示例中的父接口-o parent=eth0
配置如下:
$ ip addr show eth0
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.1.250/24 brd 192.168.1.255 scope global eth0
使用主机界面中的网络,如--subnet
中所述
docker network create
。该容器将与通过该-o parent=
选项设置的主机接口连接到同一网络。
创建IPvlan网络并运行附加到其的容器:
# IPvlan (-o ipvlan_mode= Defaults to L2 mode if not specified)
$ docker network create -d ipvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o ipvlan_mode=l2 \
-o parent=eth0 db_net
# Start a container on the db_net network
$ docker run --net=db_net -it --rm alpine /bin/sh
# NOTE: the containers can NOT ping the underlying host interfaces as
# they are intentionally filtered by Linux for additional isolation.
IPvlan的默认模式是l2
。如果-o ipvlan_mode=
未指定,将使用默认模式。同样,如果将--gateway
保留为空,则网络上的第一个可用地址将被设置为网关。例如,如果网络create中提供的子网是,--subnet=192.168.1.0/24
则容器接收的网关是192.168.1.1
。
为了帮助理解此模式如何与其他主机交互,下图显示了适用于和IPvlan L2模式的两个Docker主机之间的同一第2层段。
以下将创建与之前创建的网络完全相同的网络db_net
,并且驱动程序默认为--gateway=192.168.1.1
和-o ipvlan_mode=l2
。
# IPvlan (-o ipvlan_mode= Defaults to L2 mode if not specified)
$ docker network create -d ipvlan \
--subnet=192.168.1.0/24 \
-o parent=eth0 db_net_ipv
# Start a container with an explicit name in daemon mode
$ docker run --net=db_net_ipv --name=ipv1 -itd alpine /bin/sh
# Start a second container and ping using the container name
# to see the docker included name resolution functionality
$ docker run --net=db_net_ipv --name=ipv2 -it --rm alpine /bin/sh
$ ping -c 4 ipv1
# NOTE: the containers can NOT ping the underlying host interfaces as
# they are intentionally filtered by Linux for additional isolation.
驱动程序还支持该--internal
标志,该标志将使网络上的容器与该网络外部的任何通信完全隔离。由于网络隔离与网络的父接口紧密耦合,因此将-o parent=
选项保留为a的结果与选项docker network create
完全相同--internal
。如果未指定父接口或使用了
--internal
标志,dummy
则会为用户创建一个netlink类型的父接口,并将其用作父接口,从而有效地完全隔离网络。
以下两个docker network create
示例导致可以将容器附加到的网络相同:
# Empty '-o parent=' creates an isolated network
$ docker network create -d ipvlan \
--subnet=192.168.10.0/24 isolated1
# Explicit '--internal' flag is the same:
$ docker network create -d ipvlan \
--subnet=192.168.11.0/24 --internal isolated2
# Even the '--subnet=' can be left empty and the default
# IPAM subnet of 172.18.0.0/16 will be assigned
$ docker network create -d ipvlan isolated3
$ docker run --net=isolated1 --name=cid1 -it --rm alpine /bin/sh
$ docker run --net=isolated2 --name=cid2 -it --rm alpine /bin/sh
$ docker run --net=isolated3 --name=cid3 -it --rm alpine /bin/sh
# To attach to any use `docker exec` and start a shell
$ docker exec -it cid1 /bin/sh
$ docker exec -it cid2 /bin/sh
$ docker exec -it cid3 /bin/sh
IPvlan 802.1q中继L2模式示例用法
在架构上,就网关和L2路径隔离而言,IPvlan L2模式中继与Macvlan相同。对于ToR交换机中的CAM表压力,每个端口一个MAC和主机的父NIC上的MAC耗尽等,可能存在一些细微差别可能是有利的。802.1q中继情况看起来相同。两种模式均遵循标记标准,并与物理网络无缝集成,以实现底层集成和硬件供应商插件集成。
同一VLAN上的主机通常位于同一子网上,并且几乎总是根据其安全策略将它们分组在一起。在大多数情况下,多层应用程序被划分到不同的子网中,因为每个进程的安全配置文件都需要某种形式的隔离。例如,在与前端Web服务器相同的虚拟网络上托管您的信用卡处理程序将是一个合规性问题,同时还要规避在深度架构中长期存在的分层防御的最佳实践。使用覆盖驱动程序时,VLAN或模糊的VNI(虚拟网络标识符)是隔离租户流量的第一步。
标记有VLAN的Linux子接口可以已经存在,或者在您调用时将被创建docker network create
。docker network rm
将删除子接口。诸如父接口之类的eth0
子接口不会被删除,只有具有netlink父索引> 0的子接口才被删除。
为了使驱动程序添加/删除VLAN子接口,格式必须为
interface_name.vlan_tag
。可以将其他子接口命名用作指定的父级,但是docker network rm
调用该链接时不会自动删除该链接
。
使用现有的父VLAN子接口或让Docker管理它们的选项使用户可以完全管理Linux接口和网络,或者让Dockerip link
毫不费力地创建和删除VLAN父子接口(netlink )。
例如:用于eth0.10
表示eth0
VLAN ID为的带标记的子接口10
。等效ip link
命令为
ip link add link eth0 name eth0.10 type vlan id 10
。
该示例创建带有VLAN标签的网络,然后启动两个容器以测试容器之间的连接性。如果两个网络之间没有路由器路由,则不同的VLAN无法相互ping通。每个IPvlan设计都无法访问默认名称空间,以便将容器名称空间与基础主机隔离。
VLAN ID 20
在由主机多克尔标记和分离所述第一网络,eth0.20
是父接口具有标记的VLAN ID20
与指定-o parent=eth0.20
。可以使用其他命名格式,但是需要使用ip link
或Linux配置文件手动添加和删除链接。只要-o parent
存在,只要符合Linux netlink,就可以使用任何东西。
# now add networks and hosts as you would normally by attaching to the master (sub)interface that is tagged
$ docker network create -d ipvlan \
--subnet=192.168.20.0/24 \
--gateway=192.168.20.1 \
-o parent=eth0.20 ipvlan20
# in two separate terminals, start a Docker container and the containers can now ping one another.
$ docker run --net=ipvlan20 -it --name ivlan_test1 --rm alpine /bin/sh
$ docker run --net=ipvlan20 -it --name ivlan_test2 --rm alpine /bin/sh
VLAN ID 30
在第二个网络中,由Docker主机标记和隔离的eth0.30
是标记为VLAN ID的父接口,该VLAN ID由30
指定-o parent=eth0.30
。该
ipvlan_mode=
默认为L2模式ipvlan_mode=l2
。也可以使用下一个示例中所示的相同结果来显式设置它。
# now add networks and hosts as you would normally by attaching to the master (sub)interface that is tagged.
$ docker network create -d ipvlan \
--subnet=192.168.30.0/24 \
--gateway=192.168.30.1 \
-o parent=eth0.30 \
-o ipvlan_mode=l2 ipvlan30
# in two separate terminals, start a Docker container and the containers can now ping one another.
$ docker run --net=ipvlan30 -it --name ivlan_test3 --rm alpine /bin/sh
$ docker run --net=ipvlan30 -it --name ivlan_test4 --rm alpine /bin/sh
网关在容器内部设置为默认网关。该网关通常是网络上的外部路由器。
$$ ip route
default via 192.168.30.1 dev eth0
192.168.30.0/24 dev eth0 src 192.168.30.2
示例:多子网IPvlan L2模式在同一子网上启动两个容器并相互ping通。为了192.168.114.0/24
达到
192.168.116.0/24
要求,它需要一个处于L2模式的外部路由器。L3模式可以在共享公共子网的子网之间路由-o parent=
。
网络路由器上的辅助地址很常见,因为地址空间已耗尽,无法将其他辅助地址添加到L3 VLAN接口,或者通常称为“交换虚拟接口”(SVI)。
$ docker network create -d ipvlan \
--subnet=192.168.114.0/24 --subnet=192.168.116.0/24 \
--gateway=192.168.114.254 --gateway=192.168.116.254 \
-o parent=eth0.114 \
-o ipvlan_mode=l2 ipvlan114
$ docker run --net=ipvlan114 --ip=192.168.114.10 -it --rm alpine /bin/sh
$ docker run --net=ipvlan114 --ip=192.168.114.11 -it --rm alpine /bin/sh
一个关键的收获是,运营商能够将其物理网络映射到其虚拟网络,以将容器集成到其环境中,而无需进行任何大修。NetOps将802.1q中继放入Docker主机中。该虚拟链接将-o parent=
在网络创建中传递。对于未标记的(非VLAN)链接,它很简单,-o parent=eth0
或者对于具有VLAN ID的802.1q中继一样简单,每个网络都从网络映射到相应的VLAN /子网。
一个示例是,NetOps提供VLAN ID和关联的子网,用于在以太网链接上传递到Docker主机服务器的VLAN。docker network create
在配置Docker网络时,这些值将插入命令中。这些是持久性配置,每次Docker引擎启动时都会应用这些配置,从而减轻了经常管理复杂配置文件的麻烦。也可以通过预先创建来手动管理网络接口,并且Docker网络将永远不会对其进行修改,并将其用作父接口。从NetOps到Docker网络命令的映射示例如下:
- VLAN:10,子网:172.16.80.0/24,网关:172.16.80.1
--subnet=172.16.80.0/24 --gateway=172.16.80.1 -o parent=eth0.10
- VLAN:20,IP子网:172.16.50.0/22,网关:172.16.50.1
--subnet=172.16.50.0/22 --gateway=172.16.50.1 -o parent=eth0.20
- VLAN:30,子网:10.1.100.0/16,网关:10.1.100.1
--subnet=10.1.100.0/16 --gateway=10.1.100.1 -o parent=eth0.30
IPvlan L3模式示例
IPvlan将要求将路由分发到每个端点。驱动程序仅构建IPvlan L3模式端口,并将容器附加到接口。整个群集中的路由分配超出了此单一主机作用域驱动程序的最初实现范围。在L3模式下,Docker主机与在容器中启动新网络的路由器非常相似。它们位于上游网络,如果没有路由分配就不会知道。对于那些对IPvlan L3如何适合容器网络感到好奇的人,请参见以下示例。
IPvlan L3模式会丢弃所有广播和多播流量。仅此一个原因就使IPvlan L3模式成为那些寻求大规模和可预测的网络集成的人的主要候选人。这是可以预见的,并且由于不涉及桥接,因此将导致更长的正常运行时间。桥接环路是导致高断电的原因,根据故障域的大小,这些断电可能很难查明。这是由于BPDU(桥端口数据单元)的级联性质所致,该BPDU泛洪了整个广播域(VLAN),以查找和阻止拓扑循环。消除桥接域,或者至少将它们隔离到一对ToR(机架式交换机的顶部),将减少对桥接不稳定性进行故障排除的难度。IPvlan L2模式非常适用于仅中继到一对ToR中的隔离VLAN,这些ToR可以提供无环路的非阻塞结构。下一步是通过IPvlan L3模式在边缘进行路由,该模式将故障域减少到仅本地主机。
- L3模式需要在单独的子网中作为默认名称空间,因为它需要在默认名称空间中指向IPvlan父接口的netlink路由。
- 此示例中使用的父接口是,
eth0
并且它在子网中192.168.1.0/24
。注意docker network
是不是在同一个子网中eth0
。 - 与IPvlan l2模式不同,只要共享相同的父接口,不同的子网/网络就可以相互ping通
-o parent=
。
$$ ip a show eth0
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:50:56:39:45:2e brd ff:ff:ff:ff:ff:ff
inet 192.168.1.250/24 brd 192.168.1.255 scope global eth0
- 传统的网关对L3模式IPvlan接口没有多大意义,因为不允许广播流量。因此,容器默认网关指向容器
eth0
设备。有关详细信息,请参见下面有关L3容器ip route
或ip -6 route
从L3容器内部的CLI输出的信息。
模式-o ipvlan_mode = l3 must be explicitly specified since the default
IPvlan mode is
l2。
以下示例未指定父接口。网络驱动程序将为用户创建一个虚拟类型的链接,而不是拒绝网络创建并将容器仅彼此通信隔离。
# Create the IPvlan L3 network
$ docker network create -d ipvlan \
--subnet=192.168.214.0/24 \
--subnet=10.1.214.0/24 \
-o ipvlan_mode=l3 ipnet210
# Test 192.168.214.0/24 connectivity
$ docker run --net=ipnet210 --ip=192.168.214.10 -itd alpine /bin/sh
$ docker run --net=ipnet210 --ip=10.1.214.10 -itd alpine /bin/sh
# Test L3 connectivity from 10.1.214.0/24 to 192.168.212.0/24
$ docker run --net=ipnet210 --ip=192.168.214.9 -it --rm alpine ping -c 2 10.1.214.10
# Test L3 connectivity from 192.168.212.0/24 to 10.1.214.0/24
$ docker run --net=ipnet210 --ip=10.1.214.9 -it --rm alpine ping -c 2 192.168.214.10
笔记
请注意,
--gateway=
在网络创建中没有任何选项。如果指定了一种l3
模式,则该字段将被忽略。从容器内部看一下容器路由表:# Inside an L3 mode container $$ ip route default dev eth0 192.168.214.0/24 dev eth0 src 192.168.214.10
为了从远程Docker主机ping容器或使容器能够ping远程主机,之间的远程主机或物理网络需要具有指向容器的Docker主机eth接口的主机IP地址的路由。
双协议栈IPv4 IPv6 IPvlan L2模式
-
Libnetwork不仅可以让您完全控制IPv4寻址,还可以完全控制IPv6寻址以及两个地址系列之间的功能奇偶性。
-
下一个示例仅从IPv6开始。在同一VLAN上启动两个容器,
139
然后相互ping通。由于未指定IPv4子网,因此默认IPAM将提供默认的IPv4子网。除非上游网络在VLAN上明确路由该子网,否则该子网是隔离的139
。
# Create a v6 network
$ docker network create -d ipvlan \
--subnet=2001:db8:abc2::/64 --gateway=2001:db8:abc2::22 \
-o parent=eth0.139 v6ipvlan139
# Start a container on the network
$ docker run --net=v6ipvlan139 -it --rm alpine /bin/sh
查看容器eth0接口和v6路由表:
# Inside the IPv6 container
$$ ip a show eth0
75: eth0@if55: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
link/ether 00:50:56:2b:29:40 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.2/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 2001:db8:abc4::250:56ff:fe2b:2940/64 scope link
valid_lft forever preferred_lft forever
inet6 2001:db8:abc2::1/64 scope link nodad
valid_lft forever preferred_lft forever
$$ ip -6 route
2001:db8:abc4::/64 dev eth0 proto kernel metric 256
2001:db8:abc2::/64 dev eth0 proto kernel metric 256
default via 2001:db8:abc2::22 dev eth0 metric 1024
启动第二个容器并ping第一个容器的v6地址。
# Test L2 connectivity over IPv6
$ docker run --net=v6ipvlan139 -it --rm alpine /bin/sh
# Inside the second IPv6 container
$$ ip a show eth0
75: eth0@if55: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
link/ether 00:50:56:2b:29:40 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.3/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 2001:db8:abc4::250:56ff:fe2b:2940/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever
inet6 2001:db8:abc2::2/64 scope link nodad
valid_lft forever preferred_lft forever
$$ ping6 2001:db8:abc2::1
PING 2001:db8:abc2::1 (2001:db8:abc2::1): 56 data bytes
64 bytes from 2001:db8:abc2::1%eth0: icmp_seq=0 ttl=64 time=0.044 ms
64 bytes from 2001:db8:abc2::1%eth0: icmp_seq=1 ttl=64 time=0.058 ms
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.044/0.051/0.058/0.000 ms
下一个示例将设置一个双协议栈IPv4 / IPv6网络,其示例VLAN ID为140
。
接下来,创建一个具有两个IPv4子网和一个IPv6子网的网络,所有这些子网均具有显式网关:
$ docker network create -d ipvlan \
--subnet=192.168.140.0/24 --subnet=192.168.142.0/24 \
--gateway=192.168.140.1 --gateway=192.168.142.1 \
--subnet=2001:db8:abc9::/64 --gateway=2001:db8:abc9::22 \
-o parent=eth0.140 \
-o ipvlan_mode=l2 ipvlan140
启动一个容器并查看eth0以及v4和v6路由表:
$ docker run --net=ipvlan140 --ip6=2001:db8:abc2::51 -it --rm alpine /bin/sh
$ ip a show eth0
78: eth0@if77: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
link/ether 00:50:56:2b:29:40 brd ff:ff:ff:ff:ff:ff
inet 192.168.140.2/24 scope global eth0
valid_lft forever preferred_lft forever
inet6 2001:db8:abc4::250:56ff:fe2b:2940/64 scope link
valid_lft forever preferred_lft forever
inet6 2001:db8:abc9::1/64 scope link nodad
valid_lft forever preferred_lft forever
$$ ip route
default via 192.168.140.1 dev eth0
192.168.140.0/24 dev eth0 proto kernel scope link src 192.168.140.2
$$ ip -6 route
2001:db8:abc4::/64 dev eth0 proto kernel metric 256
2001:db8:abc9::/64 dev eth0 proto kernel metric 256
default via 2001:db8:abc9::22 dev eth0 metric 1024
使用特定--ip4
地址启动第二个容器,并使用IPv4数据包ping第一台主机:
$ docker run --net=ipvlan140 --ip=192.168.140.10 -it --rm alpine /bin/sh
笔记
IPvlan
L2
模式下同一父接口上的不同子网不能相互ping通。这就要求路由器用辅助子网代理请求。但是,IPvlanL3
将在不同的子网之间路由单播流量,只要它们共享相同的-o parent
父链接。
双协议栈IPv4 IPv6 IPvlan L3模式
示例: IPvlan L3模式双协议栈IPv4 / IPv6,带有802.1q VLAN标签的多子网:118
与所有示例一样,不必使用带标签的VLAN接口。子接口可以与被交换eth0
,eth1
,bond0
或任何其他有效的其它主机上的接口,则lo
环回。
您将看到的主要区别是,L3模式不会创建带有下一跳的默认路由,而是将默认路由设置为dev eth
仅指向,因为ARP /广播/多播都是按照设计由Linux过滤的。由于父接口本质上充当路由器,因此父接口IP和子网必须与容器网络不同。这与网桥模式和L2模式相反,后者必须位于同一子网(广播域)中才能转发广播和多播数据包。
# Create an IPv6+IPv4 Dual Stack IPvlan L3 network
# Gateways for both v4 and v6 are set to a dev e.g. 'default dev eth0'
$ docker network create -d ipvlan \
--subnet=192.168.110.0/24 \
--subnet=192.168.112.0/24 \
--subnet=2001:db8:abc6::/64 \
-o parent=eth0 \
-o ipvlan_mode=l3 ipnet110
# Start a few of containers on the network (ipnet110)
# in separate terminals and check connectivity
$ docker run --net=ipnet110 -it --rm alpine /bin/sh
# Start a second container specifying the v6 address
$ docker run --net=ipnet110 --ip6=2001:db8:abc6::10 -it --rm alpine /bin/sh
# Start a third specifying the IPv4 address
$ docker run --net=ipnet110 --ip=192.168.112.30 -it --rm alpine /bin/sh
# Start a 4th specifying both the IPv4 and IPv6 addresses
$ docker run --net=ipnet110 --ip6=2001:db8:abc6::50 --ip=192.168.112.50 -it --rm alpine /bin/sh
接口和路由表输出如下:
$$ ip a show eth0
63: eth0@if59: <BROADCAST,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
link/ether 00:50:56:2b:29:40 brd ff:ff:ff:ff:ff:ff
inet 192.168.112.2/24 scope global eth0
valid_lft forever preferred_lft forever
inet6 2001:db8:abc4::250:56ff:fe2b:2940/64 scope link
valid_lft forever preferred_lft forever
inet6 2001:db8:abc6::10/64 scope link nodad
valid_lft forever preferred_lft forever
# Note the default route is the eth device because ARPs are filtered.
$$ ip route
default dev eth0 scope link
192.168.112.0/24 dev eth0 proto kernel scope link src 192.168.112.2
$$ ip -6 route
2001:db8:abc4::/64 dev eth0 proto kernel metric 256
2001:db8:abc6::/64 dev eth0 proto kernel metric 256
default dev eth0 metric 1024
笔记
--ip6=
当删除具有指定v6地址的容器,然后使用相同的v6地址启动新容器时,如果指定地址,则可能会出现错误,这会引发以下错误,例如地址未正确释放到v6池中。它将无法卸载容器并被丢弃。
docker: Error response from daemon: Address already in use.
手动创建802.1q链接
VLAN ID 40
如果用户不希望驱动程序创建VLAN子接口,则在运行之前需要存在该子接口docker network create
。如果您使用的不是子接口命名,则只要该接口存在且已启动,便会再次interface.vlan_id
在该-o parent=
选项中接受该命名。
手动创建的链接可以命名为任意名称,只要它们在创建网络时就存在。使用删除网络时,无论名称是什么,都不会删除手动创建的链接docker network rm
。
# create a new sub-interface tied to dot1q vlan 40
$ ip link add link eth0 name eth0.40 type vlan id 40
# enable the new sub-interface
$ ip link set eth0.40 up
# now add networks and hosts as you would normally by attaching to the master (sub)interface that is tagged
$ docker network create -d ipvlan \
--subnet=192.168.40.0/24 \
--gateway=192.168.40.1 \
-o parent=eth0.40 ipvlan40
# in two separate terminals, start a Docker container and the containers can now ping one another.
$ docker run --net=ipvlan40 -it --name ivlan_test5 --rm alpine /bin/sh
$ docker run --net=ipvlan40 -it --name ivlan_test6 --rm alpine /bin/sh
示例:使用任何名称手动创建的VLAN子接口:
# create a new sub interface tied to dot1q vlan 40
$ ip link add link eth0 name foo type vlan id 40
# enable the new sub-interface
$ ip link set foo up
# now add networks and hosts as you would normally by attaching to the master (sub)interface that is tagged
$ docker network create -d ipvlan \
--subnet=192.168.40.0/24 --gateway=192.168.40.1 \
-o parent=foo ipvlan40
# in two separate terminals, start a Docker container and the containers can now ping one another.
$ docker run --net=ipvlan40 -it --name ivlan_test5 --rm alpine /bin/sh
$ docker run --net=ipvlan40 -it --name ivlan_test6 --rm alpine /bin/sh
可以使用以下方法清除手动创建的链接:
$ ip link del foo
与所有Libnetwork驱动程序一样,它们可以混合使用,甚至可以并行运行第3方生态系统驱动程序,从而为Docker用户提供最大的灵活性。
网络,ipvlan,l2,l3,独立