使用 macvlan 網路進行網路連線
本系列教程涉及連線到 macvlan
網路的獨立容器的網路連線。在這種型別的網路中,Docker 主機在其 IP 地址上接受對多個 MAC 地址的請求,並將這些請求路由到相應的容器。有關其他網路主題,請參閱概述。
目標
這些教程的目標是設定一個橋接的 macvlan
網路並將一個容器連線到它,然後設定一個 802.1Q 中繼的 macvlan
網路並將一個容器連線到它。
先決條件
大多數雲提供商會阻止
macvlan
網路。您可能需要物理訪問您的網路裝置。macvlan
網路驅動程式僅在 Linux 主機上工作,在 Docker Desktop 或 Windows 上的 Docker Engine 上不受支援。您需要至少 3.9 版本的 Linux 核心,建議使用 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