macvlan ネットワークの使用

いくつかのアプリケーション、特にレガシーのアプリケーションや、ネットワーク・トラフィックを監視するアプリケーションでは物理ネットワークへの直接接続するでしょう。この種類の状況では、 macvlan ネットワーク・ドライバを使うことで、各コンテナの仮想ネットワーク/インターフェースに対して MAC アドレスを割り当て可能になります。これによって現れる物理ネットワーク・インターフェースは、物理ネットワークに直接接続できるようにします。この状況では、 macvlan のために使う Docker ホスト上の物理インターフェースを割り当てる必要があり、それと同様に、 macvlan のサブネットとゲートウェイの割り当ても必要です。また、異なる物理ネットワーク・インタフェースを使うことで、 macvlan ネットワークを隔離できます。以下の点に注意してください。

  • 不適切にユニークで大きな番号の MAC アドレスをネットワーク上に配置する状況では、IP アドレスの消耗や「VLAN spread」によって、ネットワークに意図しないダメージを与えるのが非常に簡単です。
  • 1つの物理インターフェースが複数の MAC アドレスを割り当て可能にするため、ネットワーク機器が「プロミスキャス・モード」( promiscuous mode)機能を備えている必要があります。
  • アプリケーションがブリッジ・ネットワーク(単一の Docker ホスト)やオーバレイ・ネットワーク(複数の Docker ホスト上での通信)を使える状況では、そちらのほうが長期間にわたる利用では望ましい場合があります。

macvlan ネットワークの作成

macvlan ネットワークの作成時は、ブリッジ・モードか 802.1q トランク・ブリッジ・モードのどちらかになります。

  • ブリッジ・モードでは、 macvlan トラフィックはホスト上の物理デバイスを通して出て行きます。
  • 802.1q トランク・ブリッジ・モードでは、Docker がオン・ザ・フライで作成する 802.1q サブ・インタフェースを通してトラフィックは出て行きます。これにより、より粒度が高いレベルでの、ルーティングやフィルタリングを制御可能です。

ブリッジ・モード

特定の物理ネットワーク・インタフェースをブリッジする macvlan ネットワークを作成するには、 docker network create コマンドで --driver macvlan を使います。Docker ホスト上で物理的にトラフィックが通過するインターフェースを示す parent の指定が必要です。

$ docker network create -d macvlan \
  --subnet=172.16.86.0/24 \
  --gateway=172.16.86.1 \
  -o parent=eth0 pub_net

指定した IP アドレスが既に利用中の場合など、macvlan ネットワーク内で IP アドレスの除外が必要であれば、 --aux-addresses を使います 。

$ docker network create -d macvlan \
  --subnet=192.168.32.0/24 \
  --ip-range=192.168.32.128/25 \
  --gateway=192.168.32.254 \
  --aux-address="my-router=192.168.32.129" \
  -o parent=eth0 macnet32

802.1q トランク・ブリッジ・モード

eth0.50 のように、ドットを含む parent インターフェース名を指定すると、Docker はそれを eth0 のサブインターフェースと解釈し、サブインターフェースを自動作成します。

$ docker network create -d macvlan \
    --subnet=192.168.50.0/24 \
    --gateway=192.168.50.1 \
    -o parent=eth0.50 macvlan50

macvlan の代わりに ipvlan を使う

これまでの例では、 L3 ブリッジを使っています。かわりに ipvlan を使うには、 L2 ブリッジを準備します。 -o ipvlan_mode=l2 を指定します。

$ docker network create -d ipvlan \
    --subnet=192.168.210.0/24 \
    --subnet=192.168.212.0/24 \
    --gateway=192.168.210.254 \
    --gateway=192.168.212.254 \
     -o ipvlan_mode=l2 ipvlan210

IPv6 を使う

Docker デーモンで IPv6 を使う設定 をしていると、IPv4/IPv6 デュアルスタックの macvlan ネットワークが利用できます。

$ docker network create -d macvlan \
    --subnet=192.168.216.0/24 --subnet=192.168.218.0/24 \
    --gateway=192.168.216.1 --gateway=192.168.218.1 \
    --subnet=2001:db8:abc8::/64 --gateway=2001:db8:abc8::10 \
     -o parent=eth0.218 \
     -o macvlan_mode=bridge macvlan216

次のステップ

参考

Use host networking
https://docs.docker.com/network/host/