使用macvlan网络联网

本系列教程讨论了独立容器连接到macvlan网络的联网。 这种类型的网络,Docker主机在其IP地址的多个MAC地址上接受的请求,并将这些请求路由到适当的容器。 有关其他联网主题,请参见概述

目标

这些教程的目标是建立一个桥接的macvlan网络并为其连接一个容器,然后设置一个802.1q中继的macvlan网络并为其添加一个容器。

先决条件

  • 大多数云提供商阻止macvlan网络。 您可能需要物理访问网络设备。

  • macvlan网络驱动程序仅适用于Linux主机,Docker Desktop for Mac, Docker Desktop for Windows, 或 Docker EE for Windows Server不支持。

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

  • 这些示例假定您的以太网接口是eth0。 如果您的设备使用其他名称,请改用该名称。

桥接示例

在这个简单的桥接示例中,您的流量流经eth0,而Docker使用其MAC地址将流量路由至您的容器。 对于网络上的设备,您的容器和物理连接到网络一样。

  1. 创建一个名为my-macvlan-netmacvlan网络。 将subnet, gateway, 和parent值修改为在您的环境中有意义的值。
$ docker network create -d macvlan   --subnet=172.16.86.0/24   --gateway=172.16.86.1   -o parent=eth0   my-macvlan-net
  1. 您可以使用docker network lsdocker network inspect my-macvlan-net命令来验证网络是否存在并且是macvlan网络。
$ docker run --rm -dit   --network my-macvlan-net   --name my-macvlan-alpine   alpine:latest   ash
  1. 检查my-macvlan-alpine容器,并注意Networks项内的MacAddress项:
$ docker container inspect my-macvlan-alpine

...truncated...
"Networks": {
  "my-macvlan-net": {
      "IPAMConfig": null,
      "Links": null,
      "Aliases": [
          "bec64291cd4c"
      ],
      "NetworkID": "5e3ec79625d388dbcc03dcf4a6dc4548644eb99d58864cf8eee2252dcfc0cc9f",
      "EndpointID": "8caf93c862b22f379b60515975acf96f7b54b7cf0ba0fb4a33cf18ae9e5c1d89",
      "Gateway": "172.16.86.1",
      "IPAddress": "172.16.86.2",
      "IPPrefixLen": 24,
      "IPv6Gateway": "",
      "GlobalIPv6Address": "",
      "GlobalIPv6PrefixLen": 0,
      "MacAddress": "02:42:ac:10:56:02",
      "DriverOpts": null
  }
}
...truncated
  1. 通过运行几个docker exec命令来检查容器如何查看其自己的网络接口。
$ docker exec my-macvlan-alpine ip addr show eth0

9: eth0@tunl0: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
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
$ 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
  1. 停止容器(Docker通过--rm标志将其删除),然后删除网络。
$ docker container stop my-macvlan-alpine

$ docker network rm my-macvlan-net

802.1q中继网桥示例

在802.1q中继网桥示例中,您的流量流经eth0的子接口(称为eth0.10),并且Docker使用其MAC地址将流量路由到您的容器。 对于网络上的设备,您的容器和物理连接到网络一样。

  1. 创建一个名为my-8021q-macvlan-netmacvlan网络。 将subnet, gateway, 和parent值修改为在您的环境中对应的值。
$ docker network create -d macvlan   --subnet=172.16.86.0/24   --gateway=172.16.86.1   -o parent=eth0.10   my-8021q-macvlan-net

您可以使用docker network lsdocker network inspect my-8021q-macvlan-net命令来验证网络是否存在,是否为macvlan网络并具有parenteth0.10。 您可以在Docker主机上使用ip addr show来验证接口eth0.10是否存在并具有单独的IP地址

  1. 启动一个alpine容器,并将其附加到my-8021q-macvlan-net网络。 -dit标记在后台启动容器但允许您附加到该容器。 --rm标记表示在停止容器时删除它。
$ docker run --rm -itd   --network my-8021q-macvlan-net   --name my-second-macvlan-alpine   alpine:latest   ash
  1. 检查my-macvlan-alpine容器,并注意Networks项内的MacAddress项:
$ docker container inspect my-second-macvlan-alpine

...truncated...
"Networks": {
  "my-8021q-macvlan-net": {
      "IPAMConfig": null,
      "Links": null,
      "Aliases": [
          "12f5c3c9ba5c"
      ],
      "NetworkID": "c6203997842e654dd5086abb1133b7e6df627784fec063afcbee5893b2bb64db",
      "EndpointID": "aa08d9aa2353c68e8d2ae0bf0e11ed426ea31ed0dd71c868d22ed0dcf9fc8ae6",
      "Gateway": "172.16.86.1",
      "IPAddress": "172.16.86.2",
      "IPPrefixLen": 24,
      "IPv6Gateway": "",
      "GlobalIPv6Address": "",
      "GlobalIPv6PrefixLen": 0,
      "MacAddress": "02:42:ac:10:56:02",
      "DriverOpts": null
  }
}
...truncated
  1. 通过运行一对docker exec命令,查看其网络接口,来检查容器状况。
$ docker exec my-second-macvlan-alpine ip addr show eth0

11: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
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
$ docker exec my-second-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
  1. 停止容器(容器后被删除,因为创建的时候添加了--rm标记),然后删除网络。
$ docker container stop my-second-macvlan-alpine

$ docker network rm my-8021q-macvlan-net

其他网络教程

您已经完成了macvlan网络联网的教程,您可能还需要运行以下其他网络教程: 独立网络教程 覆盖网络教程 主机网络教程