18
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【検証】MacBook M4でContainerlabを動かしてみた!ARM対応NOSでネットワーク検証環境構築

Last updated at Posted at 2025-10-16

はじめに

GMOコネクトの永田です。

ネットワークトポロジを組んでルーターで遊んでみたい!と、ふと思う時が、みなさんもよくあるかと思います。

仮想ルーターでトポロジーを組むのに便利なツールとしてContainerlabがありますが、「x86_64 Linuxを準備するのが面倒だなー」と思っていました。
最近、macOS(Apple Silicon)上でもcontainerlabが動くよ!(コンテナNOSがARM対応していれば)という話を見かけましたので、試してみました。

手元の開発環境(MacBook M4)でもContainerlabが利用できるなら、debugがとても快適になりますね!

まとめ

  • macOS(Apple Silicon)でも、containerlabがお手軽に利用可能
  • 稼働させるNOS(Network Operating System)は、ARM64対応のものが必要

Containerlabとは

仮想ネットワークを構築するツールで、ネットワークトポロジーをyamlで定義できます。
トポロジー定義yamlがあれば、誰でもすぐに同じトポロジーを構築できちゃいます!
昔は物理的なルータを購入して結線してと試すのも大変でしたが、便利な時代になりました😊

Containerlabの詳細については、以下の公式ページや記事が参考になります。

macOS上でのContainerlabの実行方法の比較

公式ページにも記載があるのですが、macOS上でContainerlabを実行する方法は3通りあります。

  1. OrbStackのarm64 Linux VM上で実行
  2. devcontainerのDocker In Docker (dind)で実行
  3. devcontainerのDocker Outside Of Docker (dood)で実行

OrbStackの商用利用が有償であることから、devcontainer方式を今回は試します。
今回はその中でもパフォーマンスも良さそうな、Docker Outside Of Docker (dood)を試します。

devcontainer自体については、こちらの記事などを参照してください。

Devcontainerのセットアップ

では、VSCode上でdevcontainerを構築していきます。

試した環境は以下になります。

  • MacBook Pro Apple M4 Max メモリ36GB
  • VSCode Version: 1.105.0 (Universal)
  • Plugin
    • Dev Containers: 0.427.0
  • Docker Desktop: 4.48.0 (207573)

.devcontainer/devcontainer.json を作成します。
公式doodサンプルを元に以下を修正しています。

{
    "image": "ghcr.io/srl-labs/containerlab/devcontainer-dood-slim:0.71.0", 
    "runArgs": [
        "--network=host",
        "--pid=host",
        "--privileged"
    ],
    "mounts": [
        "type=bind,src=/var/lib/docker,dst=/var/lib/docker",
        "type=bind,src=/lib/modules,dst=/lib/modules"
    ],
    "workspaceFolder": "${localWorkspaceFolder}",
    "workspaceMount": "source=${localWorkspaceFolder},target=${localWorkspaceFolder},type=bind"
}

この後、VSCode左下の青いアイコン(Open a Remote Window)を押して、「Reopen in Container」を選択すると裏でDockerが起動します。
(初回は docker pull で時間がかかります)

起動したVSCodeのTerminalで、containerlabが利用できれば準備完了です!

❯ containerlab version
  ____ ___  _   _ _____  _    ___ _   _ _____ ____  _       _     
 / ___/ _ \| \ | |_   _|/ \  |_ _| \ | | ____|  _ \| | __ _| |__  
| |  | | | |  \| | | | / _ \  | ||  \| |  _| | |_) | |/ _` | '_ \ 
| |__| |_| | |\  | | |/ ___ \ | || |\  | |___|  _ <| | (_| | |_) |
 \____\___/|_| \_| |_/_/   \_\___|_| \_|_____|_| \_\_|\__,_|_.__/ 

    version: 0.71.0
     commit: 7ef796f07
       date: 2025-10-10T17:36:13Z
     source: https://github.com/srl-labs/containerlab
 rel. notes: https://containerlab.dev/rn/0.71/

シンプルなトポロジーの作成

では、Topologyを組んでいきましょう。
今回は最小サンプルということで、Router(FRRouting)1台に、PC(Linux)2台の構成とします。

トポロジー図

containerlab yaml

name: clab-mini-topo
topology:
  nodes:
    r1:
      kind: linux
      image: quay.io/frrouting/frr:10.4.1
      binds:
        - r1/daemons:/etc/frr/daemons
        - r1/frr.conf:/etc/frr/frr.conf
    src:
      kind: linux
      image: praqma/network-multitool:latest
      exec:
        - "ip link set eth1 up"
        - "ip addr add 192.168.1.11/24 dev eth1"
        - "ip route add 192.168.0.0/16 via 192.168.1.1 dev eth1"
    dst:
      kind: linux
      image: praqma/network-multitool:latest
      exec:
        - "ip link set eth1 up"
        - "ip addr add 192.168.2.11/24 dev eth1"
        - "ip route add 192.168.0.0/16 via 192.168.2.1 dev eth1"
  links:
    - endpoints: [src:eth1, r1:eth1]
    - endpoints: [dst:eth1, r1:eth2]

FRRouting Config

FRRoutingの設定はこちらを参考にしました。

  • r1/daemons
zebra=yes
bgpd=no
ospfd=yes
ospf6d=no
ripd=no
ripngd=no
isisd=no
pimd=no
ldpd=yes
nhrpd=no
eigrpd=no
babeld=no
sharpd=no
staticd=no
pbrd=no
bfdd=no
fabricd=no

vtysh_enable=yes
zebra_options=" -s 90000000 --daemon -A 127.0.0.1"
bgpd_options="   --daemon -A 127.0.0.1"
ospfd_options="  --daemon -A 127.0.0.1"
ospf6d_options=" --daemon -A ::1"
ripd_options="   --daemon -A 127.0.0.1"
ripngd_options=" --daemon -A ::1"
isisd_options="  --daemon -A 127.0.0.1"
pimd_options="  --daemon -A 127.0.0.1"
ldpd_options="  --daemon -A 127.0.0.1"
nhrpd_options="  --daemon -A 127.0.0.1"
eigrpd_options="  --daemon -A 127.0.0.1"
babeld_options="  --daemon -A 127.0.0.1"
sharpd_options="  --daemon -A 127.0.0.1"
staticd_options="  --daemon -A 127.0.0.1"
pbrd_options="  --daemon -A 127.0.0.1"
bfdd_options="  --daemon -A 127.0.0.1"
fabricd_options="  --daemon -A 127.0.0.1"
  • r1/frr.conf
frr version 10.4.1_git
frr defaults traditional
hostname router1
no ipv6 forwarding
!
interface eth1
 ip address 192.168.1.1/24
!
interface eth2
 ip address 192.168.2.1/24
!
interface lo
 ip address 10.10.10.1/32
!
line vty
!

containerlabでのデプロイ、疎通確認

❯ containerlab deploy -t mini-topo.clab.yml
23:28:59 INFO Containerlab started version=0.71.0
23:28:59 INFO Parsing & checking topology file=mini-topo.clab.yml
23:28:59 INFO Creating docker network name=clab IPv4 subnet=172.20.20.0/24 IPv6 subnet=3fff:172:20:20::/64 MTU=0
23:28:59 INFO Creating lab directory path=/clab-mini-topo/clab-clab-mini-topo
23:28:59 INFO unable to adjust Labdir file ACLs: operation not supported
23:28:59 INFO Creating container name=src
23:28:59 INFO Creating container name=r1
23:28:59 INFO Creating container name=dst
23:28:59 INFO Created link: src:eth1 ▪┄┄▪ r1:eth1
23:28:59 INFO Created link: dst:eth1 ▪┄┄▪ r1:eth2
23:28:59 INFO Executed command node=src command="ip link set eth1 up" stdout=""
23:28:59 INFO Executed command node=src command="ip addr add 192.168.1.11/24 dev eth1" stdout=""
23:28:59 INFO Executed command node=src command="ip route add 192.168.0.0/16 via 192.168.1.1 dev eth1" stdout=""
23:28:59 INFO Executed command node=dst command="ip link set eth1 up" stdout=""
23:28:59 INFO Executed command node=dst command="ip addr add 192.168.2.11/24 dev eth1" stdout=""
23:28:59 INFO Executed command node=dst command="ip route add 192.168.0.0/16 via 192.168.2.1 dev eth1" stdout=""
23:28:59 INFO Adding host entries path=/etc/hosts
23:28:59 INFO Adding SSH config for nodes path=/etc/ssh/ssh_config.d/clab-clab-mini-topo.conf
You are on the latest version (0.71.0)
╭─────────────────────────┬─────────────────────────────────┬─────────┬───────────────────╮
│           Name          │            Kind/Image           │  State  │   IPv4/6 Address  │
├─────────────────────────┼─────────────────────────────────┼─────────┼───────────────────┤
│ clab-clab-mini-topo-dst │ linux                           │ running │ 172.20.20.3       │
│                         │ praqma/network-multitool:latest │         │ 3fff:172:20:20::3 │
├─────────────────────────┼─────────────────────────────────┼─────────┼───────────────────┤
│ clab-clab-mini-topo-r1  │ linux                           │ running │ 172.20.20.4       │
│                         │ quay.io/frrouting/frr:10.4.1    │         │ 3fff:172:20:20::4 │
├─────────────────────────┼─────────────────────────────────┼─────────┼───────────────────┤
│ clab-clab-mini-topo-src │ linux                           │ running │ 172.20.20.2       │
│                         │ praqma/network-multitool:latest │         │ 3fff:172:20:20::2 │
╰─────────────────────────┴─────────────────────────────────┴─────────┴───────────────────╯

3台稼働していれば、デプロイは完了です!

では、src --> dstにpingを試してみましょう。

❯ containerlab exec -t mini-topo.clab.yml --label clab-node-name=src --cmd 'ping -c 4 192.168.2.11'
23:29:42 INFO Parsing & checking topology file=mini-topo.clab.yml
23:29:45 INFO Executed command node=clab-clab-mini-topo-src command="ping -c 4 192.168.2.11"
  stdout=
  │ PING 192.168.2.11 (192.168.2.11) 56(84) bytes of data.
  │ 64 bytes from 192.168.2.11: icmp_seq=1 ttl=63 time=0.070 ms
  │ 64 bytes from 192.168.2.11: icmp_seq=2 ttl=63 time=0.140 ms
  │ 64 bytes from 192.168.2.11: icmp_seq=3 ttl=63 time=0.317 ms
  │ 64 bytes from 192.168.2.11: icmp_seq=4 ttl=63 time=0.169 ms
  │ 
  │ --- 192.168.2.11 ping statistics ---
  │ 4 packets transmitted, 4 received, 0% packet loss, time 3106ms
  │ rtt min/avg/max/mdev = 0.070/0.174/0.317/0.090 ms

無事に疎通しましたね😊

NOS(Network Operating System)がARM64にさえ対応していれば、問題なく使えそうです。

ARM64対応のNOS一覧

公式ページを見る限り、以下はRosetta無しで(将来的にRosetta無くなるらしいので・・・)、ARM64版が提供されているようです。

種類は少ないものの有名どころはあるため、ある程度はmacOSでも試せそうですね。

(再掲)まとめ

  • macOS(Apple Silicon)でも、containerlabがお手軽に利用可能
  • 稼働させるNOS(Network Operating System)は、ARM64対応のものが必要

最後に、GMOコネクトでは研究開発や国際標準化に関する支援や技術検証をはじめ、幅広い支援を行っておりますので、何かありましたらお気軽にお問合せください。

お問合せ: https://gmo-connect.jp/contactus/

18
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?