使用 macvlan 網路進行網路連接

本系列教學課程旨在探討連接到 macvlan 網路的獨立容器的網路連線。在這種網路類型中,Docker 主機接受針對多個 MAC 位址的請求,並將這些請求路由到適當的容器。關於其他網路主題,請參閱概覽

目標

這些教學課程的目標是設定一個橋接的 macvlan 網路並連接一個容器,然後設定一個 802.1Q 彙整的 macvlan 網路並連接一個容器。

先決條件

  • 大多數雲端供應商會封鎖 macvlan 網路。您可能需要對網路設備擁有實體存取權。

  • macvlan 網路驅動程式僅適用於 Linux 主機,Windows 上的 Docker Desktop 或 Docker Engine 不支援此功能。

  • 您需要至少 3.9 版的 Linux 核心,建議使用 4.0 或更高版本。

  • 這些範例假設您的乙太網路介面為 eth0。如果您的裝置名稱不同,請使用該名稱。

  • macvlan 驅動程式在 rootless 模式下不受支援。

橋接範例

在簡單的橋接範例中,您的流量會流經 eth0,而 Docker 會使用 MAC 位址將流量路由到您的容器。對於您網路上的其他設備,您的容器看起來就像是實體連接到該網路。

  1. 建立一個名為 my-macvlan-netmacvlan 網路。請將 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 lsdocker network inspect my-macvlan-net 指令來驗證該網路是否存在,以及它是否為 macvlan 網路。

  2. 啟動一個 alpine 容器並將其連接到 my-macvlan-net 網路。-dit 旗標會在背景啟動容器,同時允許您連入該容器。--rm 旗標表示容器在停止時會被自動移除。

    $ docker run --rm -dit \
      --network my-macvlan-net \
      --name my-macvlan-alpine \
      alpine:latest \
      ash
    
  3. 檢查 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
    
  4. 執行幾個 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
    
  5. 停止容器(由於 --rm 旗標,Docker 會將其移除),然後移除該網路。

    $ docker container stop my-macvlan-alpine
    
    $ docker network rm my-macvlan-net
    

802.1Q 彙整(Trunked)橋接範例

在 802.1Q 彙整的橋接範例中,您的流量流經 eth0 的子介面(稱為 eth0.10),Docker 會使用 MAC 位址將流量路由到您的容器。對於您網路上的其他設備,您的容器看起來就像是實體連接到該網路。

  1. 建立一個名為 my-8021q-macvlan-netmacvlan 網路。請將 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 lsdocker network inspect my-8021q-macvlan-net 指令來驗證該網路是否存在,確認它是 macvlan 網路,並且具有 eth0.10 作為父介面。您可以在 Docker 主機上使用 ip addr show 來驗證 eth0.10 介面是否存在並具有獨立的 IP 位址。

  2. 啟動一個 alpine 容器並將其連接到 my-8021q-macvlan-net 網路。-dit 旗標會在背景啟動容器,同時允許您連入該容器。--rm 旗標表示容器在停止時會被自動移除。

    $ docker run --rm -itd \
      --network my-8021q-macvlan-net \
      --name my-second-macvlan-alpine \
      alpine:latest \
      ash
    
  3. 檢查 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
    
  4. 執行幾個 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
    
  5. 停止容器(由於 --rm 旗標,Docker 會將其移除),然後移除該網路。

    $ docker container stop my-second-macvlan-alpine
    
    $ docker network rm my-8021q-macvlan-net
    

其他網路設定教學課程

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.