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