使用 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。您至少需要 Linux 内核版本 3.9,建议使用版本 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