使用 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