使用 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 地址将流量路由到您的容器。对于网络上的网络设备来说,您的容器似乎物理连接到网络。
创建一个
macvlan
名为 的网络my-macvlan-net
。将 、 和 值修改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
容器并注意密钥MacAddress
中的密钥Networks
:$ 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
停止容器(Docker 由于该
--rm
标志而将其删除),并删除网络。$ docker container stop my-macvlan-alpine $ docker network rm my-macvlan-net
802.1Q 集群桥示例
eth0
在 802.1Q 集群网桥示例中,您的流量流经(称为)的子接口eth0.10
,并且 Docker 使用其 MAC 地址将流量路由到您的容器。对于网络上的网络设备来说,您的容器似乎物理连接到网络。
创建一个
macvlan
名为 的网络my-8021q-macvlan-net
。将 、 和 值修改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
网络以及是否有parenteth0.10
。您可以ip addr show
在 Docker 主机上使用来验证接口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
容器并注意密钥MacAddress
中的密钥Networks
:$ 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
停止容器(Docker 由于该
--rm
标志而将其删除),并删除网络。$ docker container stop my-second-macvlan-alpine $ docker network rm my-8021q-macvlan-net