使用 macvlan 网络进行网络连接
本系列教程涉及连接到 macvlan 网络的独立容器的网络连接。在这种类型的网络中,Docker 主机在其 IP 地址上接受对多个 MAC 地址的请求,并将这些请求路由到相应的容器。有关其他网络主题,请参阅概述。
目标
这些教程的目标是设置一个桥接的 macvlan 网络并将一个容器连接到它,然后设置一个 802.1Q 中继的 macvlan 网络并将一个容器连接到它。
先决条件
大多数云提供商会阻止
macvlan网络。您可能需要物理访问您的网络设备。macvlan网络驱动程序仅在 Linux 主机上工作,在 Docker Desktop 或 Windows 上的 Docker Engine 上不受支持。您需要至少 3.9 版本的 Linux 内核,建议使用 4.0 或更高版本。
这些示例假设您的以太网接口是
eth0。如果您的设备有不同的名称,请使用该名称。macvlan驱动程序在无根模式下不受支持。
桥接示例
在简单的桥接示例中,您的流量通过 eth0 流动,Docker 使用其 MAC 地址将流量路由到您的容器。对于网络上的设备来说,您的容器看起来就像是物理连接到网络上一样。
创建一个名为
my-macvlan-net的macvlan网络。将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您可以使用
docker network ls和docker network inspect my-macvlan-net命令来验证网络是否存在并且是macvlan网络。启动一个
alpine容器并将其附加到my-macvlan-net网络。-dit标志会在后台启动容器,但允许您附加到它。--rm标志表示容器在停止时将被移除。$ docker run --rm -dit \ --network my-macvlan-net \ --name my-macvlan-alpine \ alpine:latest \ ash检查
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通过运行几个
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停止容器(由于
--rm标志,Docker 会移除它),然后移除网络。$ docker container stop my-macvlan-alpine $ docker network rm my-macvlan-net
802.1Q 中继桥接示例
在 802.1Q 中继桥接示例中,您的流量通过 eth0 的一个子接口(称为 eth0.10)流动,Docker 使用其 MAC 地址将流量路由到您的容器。对于网络上的设备来说,您的容器看起来就像是物理连接到网络上一样。
创建一个名为
my-8021q-macvlan-net的macvlan网络。将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 ls和docker network inspect my-8021q-macvlan-net命令来验证网络是否存在,是否是macvlan网络,并且父接口为eth0.10。您可以在 Docker 主机上使用ip addr show来验证接口eth0.10是否存在并拥有一个独立的 IP 地址。启动一个
alpine容器并将其附加到my-8021q-macvlan-net网络。-dit标志会在后台启动容器,但允许您附加到它。--rm标志表示容器在停止时将被移除。$ docker run --rm -itd \ --network my-8021q-macvlan-net \ --name my-second-macvlan-alpine \ alpine:latest \ ash检查
my-second-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通过运行几个
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停止容器(由于
--rm标志,Docker 会移除它),然后移除网络。$ docker container stop my-second-macvlan-alpine $ docker network rm my-8021q-macvlan-net