本系列教程讨论了独立容器连接到macvlan
网络的联网。 这种类型的网络,Docker主机在其IP地址的多个MAC地址上接受的请求,并将这些请求路由到适当的容器。 有关其他联网主题,请参见概述。
目标
这些教程的目标是建立一个桥接的macvlan
网络并为其连接一个容器,然后设置一个802.1q中继的macvlan
网络并为其添加一个容器。
先决条件
大多数云提供商阻止
macvlan
网络。 您可能需要物理访问网络设备。macvlan
网络驱动程序仅适用于Linux主机,Docker Desktop for Mac, Docker Desktop for Windows, 或 Docker EE for Windows Server不支持。您至少需要3.9版的Linux内核,建议使用4.0版或更高版本。
这些示例假定您的以太网接口是
eth0
。 如果您的设备使用其他名称,请改用该名称。
桥接示例
在这个简单的桥接示例中,您的流量流经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
网络。
$ 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
- 停止容器(Docker通过
--rm
标志将其删除),然后删除网络。
$ 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
网络并具有parenteth0.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-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 container stop my-second-macvlan-alpine
$ docker network rm my-8021q-macvlan-net