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 的单个主机上执行。任何
示例使用子接口,如 can be replaced with 或
Docker 主机上的任何其他有效父接口。带有 a 的子接口是动态创建的。 接口也可以从 All Together 中省略,驱动程序将创建一个接口,该接口将启用本地主机连接来执行示例。
eth0.10
eth0
.
-o parent
docker network create
dummy
- 内核要求:
- IPvlan Linux 内核 v4.2+(支持早期内核,但有问题)。要检查当前的内核版本,请使用
uname -r
- IPvlan Linux 内核 v4.2+(支持早期内核,但有问题)。要检查当前的内核版本,请使用
IPvlan L2 模式用法示例
下图显示了 IPvlan 模式拓扑的示例。
驱动程序是使用 option 指定的。在本例中为 .L2
-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
使用主机接口中的网络作为 中的 。容器将附加到与
通过 option 设置的主机接口。--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 的默认模式为 。如果未指定,则
将使用 default 模式。同样,如果 the 留空,则
网络上的第一个可用地址将被设置为网关。例如,如果
然后,网络创建中提供的子网是
容器接收的网关是 。l2
-o ipvlan_mode=
--gateway
--subnet=192.168.1.0/24
192.168.1.1
为了帮助了解此模式如何与其他主机交互,以下内容 图显示了两个 Docker 主机之间的相同第 2 层分段,该分段适用于 和 IPvlan L2 模式。
以下将创建与创建的网络完全相同的网络
早些时候,使用驱动程序默认值为 和 。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.
驱动程序还支持将完全隔离的标志
容器。因为
网络隔离与网络的父接口紧密耦合,结果
将选项从 a 中保留是确切的
与选项相同。如果未指定父接口或使用标志,则会创建 netlink 类型的父接口
并用作父接口,有效隔离网络
完全。--internal
-o parent=
docker network create
--internal
--internal
dummy
以下两个示例会产生相同的网络
您可以将容器附加到: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 路径隔离。有一些细微差别可能是有利的 ToR 交换机中的 CAM 表压力,每个端口一个 MAC,MAC 耗尽 host 的父 NIC 等。802.1Q 中继方案看起来相同。双 模式符合标记标准,并与物理 网络,用于底层集成和硬件供应商插件集成。
同一 VLAN 上的主机通常位于同一子网上,并且几乎总是 根据其安全策略分组在一起。在大多数情况下,多层 应用程序被分层到不同的子网中,因为每个 进程需要某种形式的隔离。例如,托管您的信用卡 在与前端 Web 服务器相同的虚拟网络上进行处理将是 监管合规问题,以及规避长期存在的最佳 深度架构分层防御的实践。VLAN 或模棱两可的 VNI (虚拟网络标识符)是第一步 在隔离租户流量中。
用 VLAN 标记的 Linux 子接口可能已经存在,也可能将存在
在调用 . 将删除
子接口。父接口(如 not deleted 等)仅被删除
netlink 父索引> 0 的子接口。docker network create
docker network rm
eth0
对于要添加/删除 VLAN 子接口的驱动程序,格式需要为 。其他子接口命名可以作为
指定的 parent,但在调用时不会自动删除该链接。interface_name.vlan_tag
docker network rm
可选择使用现有的父 VLAN 子接口或让 Docker 管理
它们使用户能够完全管理 Linux 界面和
networking 或让 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 没有路由器在两个网络之间进行路由。默认命名空间不是 ,以便将容器命名空间与 底层主机。
VLAN ID 20
在由 Docker 主机标记和隔离的第一个网络中,是
使用 指定的 VLAN ID 标记的父接口。
可以使用其他命名格式,但需要添加和删除链接
手动使用 或 Linux 配置文件。只要存在,只要符合 Linux netlink,任何东西都可以使用。eth0.20
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 主机标记和隔离,是
使用 指定的 VLAN ID 标记的父接口。默认为 l2 mode 。它也可以是显式的
set 的结果与下一个示例中所示的结果相同。eth0.30
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 。为了到达它,需要一个处于 L2 模式的外部路由器。L3 模式可以路由
在共享公共 .192.168.114.0/24
192.168.116.0/24
-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 主机。该虚拟链接将是传入网络的
创造。对于未标记(非 VLAN)链路,它就像 或
对于具有 VLAN ID 的 802.1Q 中继,每个网络都会映射到相应的
来自网络的 VLAN/子网。-o parent=
-o parent=eth0
例如,NetOps 为 VLAN 提供 VLAN ID 和关联的子网
通过以太网链路传递到 Docker 主机服务器。这些值是
插入到命令中。
Docker 网络。这些是每次都应用的持久性配置
Docker 引擎启动,这减轻了管理通常复杂的问题
配置文件。网络接口也可以通过以下方式手动管理
并且 Docker 网络永远不会修改和使用它们
作为父接口。从 NetOps 到 Docker 网络命令的示例映射
如下:docker network create
- 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 主机与 router 在容器中启动新网络。它们所在的网络 没有路由分发,上游网络将不知道。对于那些 想知道 IPvlan L3 将如何适应容器网络,请参阅以下内容 例子。
IPvlan L3 模式会丢弃所有广播和组播流量。仅此原因 使 IPvlan L3 模式成为寻求大规模和 可预测的网络集成。它是可预测的,反过来将导致 更长的正常运行时间,因为不涉及桥接。桥接循环已经 负责难以确定的严重中断,具体取决于 故障域的大小。这是由于 BPDU 的级联性质 (网桥端口数据单元)在整个广播域 (VLAN) 中泛洪 查找并阻止拓扑循环。消除桥接域,或者至少消除 将它们与一对 ToR(架顶式交换机)隔离将大大降低 对桥接不稳定性进行故障排除。IPvlan L2 模式非常适合 隔离的 VLAN 仅中继到一对可提供无环路的 ToR 中 非阻塞织物。下一步是通过 IPvlan L3 在边缘进行路由 模式将故障域减少为仅本地主机。
- L3 模式需要作为默认命名空间位于单独的子网上,因为它 要求在默认命名空间中有一个指向 IPvlan 父级的 NetLink 路由 接口。
- 此示例中使用的父接口是 ,它位于 子网 上。请注意 不在同一子网上
如。
eth0
192.168.1.0/24
docker network
eth0
- 与 IPvlan l2 模式不同,不同的子网/网络可以相互 ping
只要它们共享相同的 parent interface 。
-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 接口没有多大意义,因为
不允许广播流量。因此,容器默认的
gateway 指向 containers 设备。CLI 输出见下文
或从 L3 容器内部了解详细信息。
eth0
ip route
ip -6 route
必须显式指定模式,因为默认的
IPvlan 模式为 。-o ipvlan_mode=l3
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
注意
请注意,network create 中没有选项。该领域 如果指定了 mode,则忽略该 mode 的 mode 。查看容器路由 表:
--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 的主机 IP 地址 Host ETH 接口。
双栈 IPv4 IPv6 IPvlan L2 模式
Libnetwork 不仅让您完全控制 IPv4 寻址,而且 它还使您可以完全控制 IPv6 寻址以及功能奇偶校验 在两个地址系列之间。
下一个示例将仅从 IPv6 开始。在同一个容器上启动两个容器 VLAN 并相互 ping 操作。由于未指定 IPv4 子网,因此 default IPAM 将预置默认 IPv4 子网。该子网已隔离 除非上游网络在 VLAN 上显式路由它。
139
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
使用特定地址启动第二个容器并 ping 第一个主机
使用 IPv4 数据包:--ip4
$ docker run --net=ipvlan140 --ip=192.168.140.10 -it --rm alpine /bin/sh
注意
在 IPvlan 模式下,同一父接口上的不同子网无法 ping 彼此。这需要路由器使用辅助 子。但是,IPvlan 将在不同的 子网,只要它们共享相同的父链接即可。
L2
L3
-o parent
双栈 IPv4 IPv6 IPvlan L3 模式
示例:IPvlan L3 模式双栈 IPv4/IPv6,带 802.1Q VLAN 的多子网 标签:118
与所有示例一样,不必使用标记的 VLAN 接口。这
子接口可以与 、 或任何其他有效的
主机上的接口,而不是环回。eth0
eth1
bond0
lo
您将看到的主要区别是 L3 模式不会创建默认
路由,但将默认路由仅指向
因为 ARP/广播/组播都由 Linux 根据设计过滤。因为
父接口本质上充当路由器,父接口 IP
子网需要与容器网络不同。事实恰恰相反
桥接和 L2 模式,它们需要位于同一子网(广播域)上
以转发广播和组播数据包。dev eth
# 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
注意
在指定地址时,当您删除 容器,然后使用 相同的 v6 地址,它会引发以下内容,例如地址不正确 发布到 v6 池。它将无法卸载容器并保持死机状态。
--ip6=
docker: Error response from daemon: Address already in use.
手动创建 802.1Q 链接
VLAN ID 40
如果用户不希望驱动程序创建 VLAN 子接口,则需要
在运行 之前存在。如果您有子接口
name that is not it is the option 中遵循
只要接口存在且处于启动状态,就可以再次尝试。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 驱动程序一样,它们可以混合和匹配,即使 只要并行运行第三方生态系统驱动程序,即可获得最大的灵活性 添加到 Docker 用户。