Docker网络教程(四)macvlan 网络教程
在这种网络下,Docker 宿主机在它的IP之上,允许接受多个 MAC 地址的请求,然后再将这些请求路由至对应的容器里。流通,Docker 会用它的 MAC 地址,把流量路由进你的容器里。对于网络上的网络设备来说,你的容器似乎是物理上连接到网络上的。),Docker使用其MAC地址将流量路由到你的容器。对于网络上的网络设备来说,你的容器似乎是物理上连接到网络上的。你需要 3.9 或者更高版本的 L
使用 macvlan 联网
本系列的教程涉及独立 Docker 容器连接到 macvlan
网络的问题。在这种网络下,Docker 宿主机在它的IP之上,允许接受多个 MAC 地址的请求,然后再将这些请求路由至对应的容器里。 如果想了解更多其他的 Docker 网络的理论知识,参考概述。
目的
本系列教程的目的,是设置好一个桥接好的 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 地址,把流量路由进你的容器里。对于网络上的网络设备来说,你的容器似乎是物理上连接到网络上的。
-
创建一个
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
-
Inspect 一下
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
网络,有一个父接口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
-
Inspect 一下
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
-
停止容器 (Docker 会自动删除它,因为有
--rm
标志),并删除网络。$ docker container stop my-second-macvlan-alpine $ docker network rm my-8021q-macvlan-net
其他的网络教程
现在你已经完成了 macvlan
网络的联网教程,你可能想跑一下其他的:
更多推荐
所有评论(0)