🔧 阿川の電商水電行
Shopify 顧問、維護與客製化
💡
小任務 / 單次支援方案
單次處理 Shopify 修正/微調
⭐️
維護方案
每月 Shopify 技術支援 + 小修改 + 諮詢
🚀
專案建置
Shopify 功能導入、培訓 + 分階段交付

引言

GMO Connect的永田。

有時,我們都會想要組建一個網路拓撲並在路由器上進行測試。
為組建虛擬路由器拓撲提供便利的工具是Containerlab,但是我一直覺得「準備x86_64 Linux好麻煩啊」。
最近我看到有消息提到Containerlab可以在macOS(Apple Silicon)上運行!(前提是容器NOS需支援ARM)我便試了一下。

如果手頭的開發環境(MacBook M4)也能使用Containerlab,那麼除錯將會非常舒服!

總結

  • 在macOS(Apple Silicon)上,Containerlab可以輕鬆使用
  • 運行的NOS(Network Operating System)需要支援ARM64

Containerlab是什麼

這是一個構建虛擬網路的工具,可以用yaml定義網路拓撲。
只要有拓撲定義的yaml,任何人都可以迅速構建相同的拓撲!
過去購買物理路由器並進行連接的嘗試非常麻煩,但現在真是便利的時代了😊

有關Containerlab的詳細資訊,可以參考以下的官方頁面或文章。

在macOS上運行Containerlab的方法比較

官方頁面中也有說明,但是在macOS上運行Containerlab的方法有三種:

  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版本:1.105.0(Universal)
  • 插件
    • 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左下角的藍色圖標(打開遠程窗口),選擇「在容器中重新打開」,這時Docker會在後台啟動。
(首次運行會因docker pull而耗時較長)

在啟動的VSCode終端中,如果能使用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吧。
這次我們將使用一台路由器(FRRouting)和兩台PC(Linux)的最小示例構成。

拓撲圖

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 配置

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 │
╰─────────────────────────┴─────────────────────────────────┴─────────┴───────────────────╯


如果三台設備運行正常,則部署完成!  
接下來,我們嘗試從src ping到dst。

❯ 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版本可用的內容。

- Nokia SR Linux
  - [https://learn.srlinux.dev/blog/2024/sr-linux-container-image-for-arm64/](https://learn.srlinux.dev/blog/2024/sr-linux-container-image-for-arm64/)
- Arista cEOS
  - [https://marcstech.blog/archives/add-arista-ceos-containerlab-macos/](https://marcstech.blog/archives/add-arista-ceos-containerlab-macos/)
- FRRouting
  - [https://quay.io/repository/frrouting/frr?tab=tags](https://quay.io/repository/frrouting/frr?tab=tags)
  - 附有linux on arm64的映像

雖然種類不多,但還是有一些知名的選項,因此在macOS上應該還是能嘗試的。

# (重申)總結
- 在macOS(Apple Silicon)上,Containerlab可以輕鬆使用
- 運行的NOS(Network Operating System)需要支援ARM64

最後,GMO Connect在研究開發及國際標準化相關的支援以及技術驗證等方面提供廣泛的支援,如有任何疑問,請隨時聯繫我們。

聯繫方式: [https://gmo-connect.jp/contactus/](https://gmo-connect.jp/contactus/)

---

原文出處:https://qiita.com/ntaka329/items/ed5d8b0b9de27893e0a7

精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝26   💬9   ❤️7
656
🥈
我愛JS
📝4   💬13   ❤️7
284
🥉
御魂
💬1  
4
#4
2
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
🔧 阿川の電商水電行
Shopify 顧問、維護與客製化
💡
小任務 / 單次支援方案
單次處理 Shopify 修正/微調
⭐️
維護方案
每月 Shopify 技術支援 + 小修改 + 諮詢
🚀
專案建置
Shopify 功能導入、培訓 + 分階段交付