ヒスねこTechBlog

日々の気になる技術をまとめてます。

dockerコンテナとkvm仮想マシンを物理ネットワークに接続

かなり奮闘したので...

ブリッジの作成

物理NICの名称がeth0とします。

nmcliはsudo apt install network-managerすると使用できます。

# ブリッジ(testbr0)作成
$ nmcli con add type bridge ifname testbr0
# ブリッジを物理NIC接続
$ nmcli con add type bridge-slave ifname eth0 master testbr0
# ブリッジ有効化
$ nmcli con up bridge-slave-eth0
dockerコンテナの接続

dockerは比較的すぐに接続できます。

# dockerネットワーク(testbr0-docker)を作成
$ docker network create --driver macvlan --subnet=192.168.0.0/16 -o parent=testbr0 testbr0-docker
# この時点でコンテナは接続できるはず
$ docker run -it --rm --net testbr0-docker alpine /bin/sh
KVM仮想マシンの接続

次にKVM(virsh) の場合、まずネットワークを定義します。

direct.xmlは以下。

<network>
  <name>direct</name>
  <forward mode="bridge">
    <interface dev="testbr0"/>
  </forward>
</network>

ネットワークをdefineしたのち、仮想マシンのネットワーク接続先をdirectになるように編集します。

# libvirtネットワーク作成
$ virsh net-define direct.xml
$ virsh net-start direct
$ virsh edit <仮想マシンの名前>
# xml編集画面が開くので、source network='direct'に変更する
----(省略)----
<interface type='network'>                                                                                                                                                                         
  <mac address='52:54:00:7e:1a:31'/>
  <source network='direct'/>
  <model type='virtio'/>
  <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</interface>
ブリッジの削除
$ visrh net-undefine direct
$ docker network rm testbr0-docker
$ nmcli con delete bridge-slave-eth0
$ nmcli con delete bridge-testbr0
(おまけ)dockerでブリッジを作成する場合

次のコマンドは、ブリッジの作成とdockerネットワークの作成までやってくれます。KVMがこのネットワーク配下に入れるかは試してませんが、ご参考程度に。

$ docker network create --driver bridge \
    --subnet=192.168.0.0/16 --gateway=192.168.0.2 \
    --opt="com.docker.network.bridge.name"="testbr0" testbr0