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 アドレスを使ってルーティングします。
ネットワーク上のデバイスにとって、コンテナーは物理的にネットワークにアタッチされたものとして見えます。
-
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 ...省略... "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 } } ...省略
-
コンテナーからネットワークインターフェースがどのように見えているかを確認します。 以下のように
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-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 ...省略... "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 } } ...省略
-
コンテナーからネットワークインターフェースがどのように見えているかを確認します。 以下のように
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
その他のネットワークチュートリアル
macvlan
ネットワークのチュートリアルをここに終えました。
以下に示すような別のネットワークチュートリアルも見てください。