docker のコンテナをホストと同じネットワークに所属させる備忘録

Photo by hyt.

docker のコンテナをホストと同じネットワークに所属させる備忘録です.

いつもの通り結論から言うと,

macvlan を使う

で良いみたいですね.ただし,いくつか注意しないといけないことがあるので,以下その辺りをつらつらと書きたいと思います.

macvlan ってなに?

いきなりですが,macvlan というのは docker 特有のものではなくて,linux kernel で実現される

物理インターフェース(eth0とか)に重ねて使う別の mac アドレスを持つ仮想インターフェース

のことみたいです.日本語の分かり易い記事は,

にあり,macvlan とよく似た ipvlan と合わせて説明してある記事が,英語ですが,

にあります(ipvlan の L2 モードだと同じ mac アドレスで通信できる.つまり L2 ブリッジを実現できるのが ipvlan の L2 モード).重ねて使うんだから,当然,同じホストと同じネットワークに所属することになるわけですね.

利点と欠点は以下の通り.

まず,利点は,

  • 別の mac を持つので DHCP でアドレスを割り当てられる
  • 実際の通信は物理インターフェースのドライバで行われるのでソフトウェアで行われる veth に比べパフォーマンスに優れる.

みたいで,逆に欠点は,

  • eth0 との直接通信はできない(仕組み上の制限).

だそう.ただし,docker で使う場合は,DHCP でのアドレス割り当ては(普通は)できないので最初の利点はあるようでないです.

そして,macvlan には,通信可能範囲の違う以下の4つのモードがある.

  1. bridge: 同じインターフェースに割り当てた macvlan どうしが直接通信できる.
  2. vepa: bridge と同じだが,vepa 機能を持つ(物理)スイッチの NIC 経由で通信する.ハードウェア処理されるので高速に通信できる.
  3. passthru: macvlan で tup デバイス (macvtup) が使える.
  4. private: 上記が不可能なモード

使い方が分かりにくいのが passthru なんですが,これはどうも macvlan に複数の仮想マシン(コンテナ)のネットワークをブリッジさせるときなんかに使うようです.あと,面白いのが vepa だと思います.同じインターフェースに割り当てた macvlan どうしの直接通信の高速化をハードウェアで行うためのモードということで,「へー」という感じですね.

docker での使い方

docker で macvlan を使う方法は,

が公式みたいですね.docker だと今のところ bridge モードでしか作れない?みたい.以下,この記事に従って色々試してみた結果です.

まずは作り方.labohyt.local ネットワークを bridge モードで作る場合は,

みたいな感じでしょうか.

  • -o parent=enp1s0

ってのは,関連づける物理インターフェースの名称を指定する部分です.ものによっては enp1s0 じゃなくて eth0 とかだと思います.VLAN を指定する場合は,

  • -o parent=enp1s0.10

みたいにやれば良い.

あと注意点として,

  • –ip-range=192.168.100.212/31

みたいにコンテナが使うアドレスの範囲を(使われていないアドレスの範囲に)制限しておくべきです.macvlan の仕組みから言ってホストマシンと同じネットワークを使うので下手をするとアドレスが被ってしまうからです.

では,実際に使ってみます.本家サイトと同じく alpine linux を使います.

と言うことで,きちんと,192.168.0.212 と 192.168.0.213 に別の mac アドレスが割り当てられていることが分かります.次に通信可能な範囲を見てみます.

最後の 192.168.0.14 は docker のホストです.これも予想した通り,

  • ホストの所属するネットワーク経由でインターネットのホスト(8.8.8.8)と通信できる.
  • macvlan を利用するコンテナと通信できる.
  • docker のホストとは通信できない(macvlan の制限事項).

となっています.

ナルホド.かなり素直な感じですね.

以上!

スポンサーリンク
large rectangle advertisement
スポンサーリンク
large rectangle advertisement