Macvlan ネットワークのチュートリアル

読む時間の目安: 3 分

ここに示すチュートリアルは、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であるとします。 利用するデバイス名が異なる場合は、その名前を用いてください。

ブリッジ例

この単純なブリッジ例では、トラフィックはeth0を通じて送受信されます。 そして Docker はコンテナーへのトラフィックを、MAC アドレスを使ってルーティングします。 ネットワーク上のデバイスにとって、コンテナーは物理的にネットワークにアタッチされたものとして見えます。

  1. my-macvlan-netという名前のmacvlanネットワークを生成します。 subnetgatewayparentの値は、利用環境に合わせて修正してください。

    $ 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
    
    ...省略...
    "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
      }
    }
    ...省略
    
  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 トランク設定によるブリッジ例

802.1q トランク設定によるブリッジ例では、eth0のサブインターフェース(eth0.10)を通じてトラフィックがやりとりされます。 そして Docker はコンテナーへのトラフィックを、MAC アドレスを使ってルーティングします。 ネットワーク上のデバイスにとって、コンテナーは物理的にネットワークにアタッチされたものとして見えます。

  1. my-8021q-macvlan-netという名前のmacvlanネットワークを生成します。 subnetgatewayparentの値は、利用環境に合わせて修正してください。

    $ 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-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
    
    ...省略...
    "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
      }
    }
    ...省略
    
  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
    

その他のネットワークチュートリアル

macvlanネットワークのチュートリアルをここに終えました。 以下に示すような別のネットワークチュートリアルも見てください。

networking, macvlan, 802.1q, standalone