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