IPvlan网络驱动程序
IPvlan 驱动程序使用户能够完全控制 IPv4 和 IPv6 寻址。 VLAN 驱动程序建立在其之上,使运营商能够完全控制第 2 层 VLAN 标记,甚至为对底层网络集成感兴趣的用户提供 IPvlan L3 路由。对于抽象出物理约束的覆盖部署,请参阅 多主机覆盖驱动程序。
IPvlan 是经过考验的真正网络虚拟化技术的新变化。 Linux 实现非常轻量级,因为它们不是使用传统的 Linux 桥进行隔离,而是与 Linux 以太网接口或子接口相关联,以强制网络之间的分离以及与物理网络的连接。
IPvlan 提供了许多独特的功能,并为各种模式的进一步创新提供了充足的空间。这些方法的两个高级优势是,绕过 Linux 桥的积极性能影响以及移动部件较少的简单性。移除传统上位于 Docker 主机 NIC 和容器接口之间的桥接器,留下由直接连接到 Docker 主机接口的容器接口组成的简单设置。面向外部的服务很容易访问此结果,因为在这些场景中不需要端口映射。
选项
下表描述了
--option
使用驱动程序创建网络时可以传递给的特定于驱动程序的选项ipvlan
。
选项 | 默认 | 描述 |
---|---|---|
ipvlan_mode | l2 | 设置 IPvlan 工作模式。可以是以下之一:l2 , l3 ,l3s |
ipvlan_flag | bridge | 设置 IPvlan 模式标志。可以是以下之一:bridge , private ,vepa |
parent | 指定要使用的父接口。 |
例子
先决条件
- 本页的示例都是单主机。
- 所有示例都可以在运行 Docker 的单个主机上执行。任何使用子接口的示例都
eth0.10
可以替换为eth0
Docker 主机上的任何其他有效父接口。带有 a 的子接口.
是动态创建的。-o parent
接口也可以从docker network create
所有这些中省略,驱动程序将创建一个dummy
接口,该接口将启用本地主机连接来执行示例。 - 内核要求:
- IPvlan Linux 内核 v4.2+(存在对早期内核的支持,但存在错误)。要检查当前的内核版本,请使用
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
,则网络上第一个可用的地址将被设置为网关。例如,如果网络创建中提供的子网为 ,--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 模式用法示例
从架构上来说,IPvlan L2 模式中继在网关和 L2 路径隔离方面与 Macvlan 相同。有些细微差别可能有利于 ToR 交换机中的 CAM 表压力、每个端口一个 MAC 以及主机父 NIC 上的 MAC 耗尽等。 802.1Q 中继场景看起来相同。两种模式都遵循标记标准,并与物理网络无缝集成,以实现底层集成和硬件供应商插件集成。
同一 VLAN 上的主机通常位于同一子网中,并且几乎总是根据其安全策略分组在一起。在大多数情况下,多层应用程序会分层到不同的子网中,因为每个进程的安全配置文件需要某种形式的隔离。例如,将信用卡处理托管在与前端 Web 服务器相同的虚拟网络上将是一个法规遵从性问题,并且会规避深度架构中分层防御的长期最佳实践。使用 Overlay 驱动程序时的 VLAN 或模棱两可的 VNI(虚拟网络标识符)是隔离租户流量的第一步。


标记有 VLAN 的 Linux 子接口可以已经存在,也可以在您调用docker network create
.docker network rm
将删除子接口。诸如此类的父接口eth0
不会被删除,只会删除 netlink 父接口索引 > 0 的子接口。
对于添加/删除 VLAN 子接口的驱动程序,格式需要为
interface_name.vlan_tag
.其他子接口命名可以作为指定的父接口,但docker network rm
调用时不会自动删除该链接
。
使用现有父 VLAN 子接口或让 Docker 管理它们的选项使用户能够完全管理 Linux 接口和网络,或让 Docker 创建和删除 VLAN 父子接口 (netlink ip link
),而无需用户进行任何操作。
例如: 使用表示VLAN id 标记为 的eth0.10
子接口。等效的命令是
.eth0
10
ip link
ip link add link eth0 name eth0.10 type vlan id 10
该示例创建 VLAN 标记网络,然后启动两个容器来测试容器之间的连接。如果两个网络之间没有路由器路由,不同的 VLAN 无法相互 ping 通。为了将容器命名空间与底层主机隔离,每个 IPvlan 设计都无法访问默认命名空间。
VLAN ID 20
在由 Docker 主机标记和隔离的第一个网络中,是用 指定的eth0.20
VLAN id 标记的父接口。可以使用其他命名格式,但需要使用Linux 配置文件手动添加和删除链接。只要
存在,只要符合Linux netlink,任何东西都可以使用。20
-o parent=eth0.20
ip link
-o parent
# 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 标记的父接口。默认
为 l2 模式。也可以显式设置它,其结果与下一个示例中所示的相同。30
-o parent=eth0.30
ipvlan_mode=
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 为通过以太网链路传递到 Docker 主机服务器的 VLAN 提供 VLAN ID 和关联的子网。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,从而提供无环路非阻塞结构。下一步是通过 IPvlan L3 模式在边缘进行路由,从而将故障域仅减少到本地主机。
- L3 模式需要位于单独的子网上作为默认命名空间,因为它需要默认命名空间中的 netlink 路由指向 IPvlan 父接口。
- 本示例中使用的父接口是
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 容器的 CLI 输出ip route
或ip -6 route
来自 L3 容器内部的 CLI 输出。
-o ipvlan_mode=l3
由于默认 IPvlan 模式为 ,因此必须显式指定该模式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.214.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.214.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 \
--ipv6 --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通。这需要路由器通过辅助子网对请求进行代理 arp。但是,L3
只要不同子网共享相同的-o parent
父链路,IPvlan 就会在不同子网之间路由单播流量。
双栈 IPv4 IPv6 IPvlan L3 模式
示例:IPvlan L3 模式双栈 IPv4/IPv6、带 802.1Q 的多子网 VLAN 标记:118
与所有示例一样,不必使用带标记的 VLAN 接口。子接口可以与eth0
、eth1
或bond0
主机上lo
除环回之外的任何其他有效接口交换。
您将看到的主要区别是,L3 模式不会创建具有下一跳的默认路由,而是设置一个指向的默认路由,dev eth
因为 ARP/广播/多播都按照设计被 Linux 过滤。由于父接口本质上充当路由器,因此父接口 IP 和子网需要与容器网络不同。这与桥接和 L2 模式相反,桥接和 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 用户提供最大的灵活性。