使用 macvlan 网络进行联网
本系列教程介绍了对独立容器进行联网,这些容器
连接到macvlan
网络。在这种类型的网络中,Docker 主机接受
请求在其 IP 地址处获取多个 MAC 地址,并路由这些请求
添加到相应的容器中。有关其他网络主题,请参阅概述。
目标
这些教程的目标是设置一个桥接macvlan
network 和 attach
一个容器,然后设置一个 802.1Q 中继macvlan
网络并附加一个
容器添加到它。
先决条件
大多数云提供商会阻止
macvlan
联网。您可能需要物理访问权限 到您的网络设备。这
macvlan
网络驱动程序仅适用于 Linux 主机,不受支持 在 Mac 的 Docker Desktop、Windows 的 Docker Desktop 或 Windows Server 的 Docker EE 上。您至少需要 Linux 内核的 3.9 版本,以及 4.0 或更高版本 推荐。
这些示例假定您的以太网接口是
eth0
.如果您的设备具有 different name,请改用该名称。这
macvlan
driver。
Bridge 示例
在简单的 bridge 示例中,您的流量流经eth0
和 Docker
使用容器的 MAC 地址将流量路由到容器。到网络设备
在您的网络上,您的容器似乎已物理连接到网络。
创建一个
macvlan
网络调用my-macvlan-net
.修改subnet
,gateway
, 和parent
values 转换为在您的环境中有意义的值。$ 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
flag) 并删除 网络。$ docker container stop my-macvlan-alpine $ docker network rm my-macvlan-net
802.1Q 中继网桥示例
在 802.1Q 中继网桥示例中,您的流量流经子接口
之eth0
(称为eth0.10
),Docker 使用
它的 MAC 地址。对于网络上的设备,您的容器会显示
以物理方式连接到网络。
创建一个
macvlan
网络调用my-8021q-macvlan-net
.修改subnet
,gateway
和parent
values 转换为在 环境。$ 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
network 和 具有父级eth0.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
key 中的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
flag) 并删除 网络。$ docker container stop my-second-macvlan-alpine $ docker network rm my-8021q-macvlan-net