3年前、本番環境に投入する前にBGPフェイルオーバーのシナリオをテストするためGNS3を起動しようとしました。VMの起動に8分かかり、12GBのRAMを消費し、ルーター間でpingを実行する前に2回クラッシュしました。そのとき、もっと良いツールを探し始め——Containerlabがすべてを変えました。
ネットワークエンジニアもDevOps実践者も共通の問題を抱えています:テスト用にリアルな環境が必要なのに、構築に時間がかかりすぎるという問題です。Containerlabは、肥大化したVMの代わりにコンテナを使ってマルチベンダーのネットワークトポロジーを定義・デプロイすることでこの問題を解決します。完全なルーティングプロトコルサポート、実際のベンダーOSイメージ、そしてラボ全体が60秒以内に起動します。
クイックスタート — 5分で動かす
Containerlabを動かすのは本当に簡単です。必要なのはDockerがインストールされたLinuxホスト(WindowsではWSL2)だけです。
Containerlabのインストール
# ワンライナーインストール(公式スクリプト)
bash -c "$(curl -sL https://get.containerlab.dev)"
# インストールの確認
clab version
これだけです。pip、virtualenv、依存関係の地獄はありません。
最初のラボ — 3台のルーター、2分で起動
lab01.yml というファイルを作成してください:
name: first-lab
topology:
nodes:
router1:
kind: linux
image: frrouting/frr:latest
router2:
kind: linux
image: frrouting/frr:latest
router3:
kind: linux
image: frrouting/frr:latest
links:
- endpoints: ["router1:eth1", "router2:eth1"]
- endpoints: ["router2:eth2", "router3:eth1"]
デプロイします:
sudo clab deploy -t lab01.yml
コンテナが起動し、各ノードの管理IPが記載されたテーブルが表示されます。ゼロから3台のルーターが接続されるまでの合計時間:ミドルレンジのラップトップで約25秒です。
router1に接続するには:
sudo docker exec -it clab-first-lab-router1 vtysh
完了したら:
sudo clab destroy -t lab01.yml
コンテナが削除され、ネットワークインターフェースがクリーンアップされ、何も残りません。
深掘り — ContainerlabのトポロジーYAMLを理解する
ContainerlabのトポロジーYAMLは一つのことだけをします:ネットワークを記述する。構造を理解すれば、ほぼすべての実環境シナリオをモデル化できます。
ノードの種類とイメージ
Containerlabはいくつかのノードの種類をすぐに使える状態でサポートしています:
- linux — Linuxを実行する任意のDockerイメージ(FRRouting、Bird、VyOS)
- srl — Nokia SR Linux(無料、フル機能、ラボに最適)
- ceos — Arista cEOS(arista.comでの無料登録が必要)
- crpd — Juniper cRPD(Juniperライセンスが必要)
- vr-ros — vrnetlab経由のMikroTik RouterOS
ベンダーライセンスのない多くのラボでは、Linux上のFRRoutingでOSPF、BGP、IS-IS、MPLSなどをカバーできます。Nokia SR LinuxはPullが無料で、本物のネットワークOSの体験を提供します。
デプロイ時のノード設定
起動設定はbindsキーを通じてコンテナに直接マウントされます——デプロイ後に手動でコピーする必要はありません:
name: ospf-lab
topology:
nodes:
r1:
kind: linux
image: frrouting/frr:latest
binds:
- configs/r1/frr.conf:/etc/frr/frr.conf
- configs/r1/daemons:/etc/frr/daemons
r2:
kind: linux
image: frrouting/frr:latest
binds:
- configs/r2/frr.conf:/etc/frr/frr.conf
- configs/r2/daemons:/etc/frr/daemons
links:
- endpoints: ["r1:eth1", "r2:eth1"]
mtu: 9000
ルーターの設定はホスト上に保存されます——バージョン管理可能、差分確認可能、どのマシンでも再現可能です。
ネットワークリンクと属性
リンクは内部的にvethペアです。MTUの設定、レイテンシのシミュレーション、物理ホストインターフェースへのブリッジ接続——すべてトポロジーファイルで設定できます:
links:
# シンプルなリンク
- endpoints: ["r1:eth1", "r2:eth1"]
# 障害あり(レイテンシシミュレーション)
- endpoints: ["r1:eth2", "r3:eth1"]
mtu: 1500
# ホストの物理インターフェースにブリッジ
- endpoints: ["r2:eth3", "host:ens4"]
応用 — マルチベンダーBGPラボ
私はこのような構成を本番ルーターに触れる前にBGPポリシー変更のテストに使用しています。以下のトポロジーは4コア、8GB RAMのマシンで約45秒で起動します。同等のCisco IOS VMを使ったGNS3では最低でも16GBが必要になります。
FRRoutingを使ったBGPラボ
name: bgp-lab
topology:
nodes:
isp1:
kind: linux
image: frrouting/frr:latest
binds:
- configs/isp1/frr.conf:/etc/frr/frr.conf
- configs/isp1/daemons:/etc/frr/daemons
isp2:
kind: linux
image: frrouting/frr:latest
binds:
- configs/isp2/frr.conf:/etc/frr/frr.conf
- configs/isp2/daemons:/etc/frr/daemons
customer:
kind: linux
image: frrouting/frr:latest
binds:
- configs/customer/frr.conf:/etc/frr/frr.conf
- configs/customer/daemons:/etc/frr/daemons
client:
kind: linux
image: alpine:latest
links:
- endpoints: ["isp1:eth1", "customer:eth1"]
- endpoints: ["isp2:eth1", "customer:eth2"]
- endpoints: ["customer:eth3", "client:eth0"]
customerルーターの最小限のFRRouting BGP設定(configs/customer/frr.conf):
frr version 9.0
frr defaults traditional
hostname customer
router bgp 65001
bgp router-id 10.0.0.1
neighbor 10.0.1.1 remote-as 65010
neighbor 10.0.2.1 remote-as 65020
!
address-family ipv4 unicast
network 192.168.100.0/24
neighbor 10.0.1.1 soft-reconfiguration inbound
neighbor 10.0.2.1 soft-reconfiguration inbound
exit-address-family
!
line vty
!
BGPを有効にするdaemonsファイル:
bgpd=yes
ospfd=no
zebra=yes
vtysh_enable=yes
実行中のラボの確認
# すべてのノードと管理IPを表示
sudo clab inspect -t bgp-lab.yml
# customerルーターのvtyshに接続
sudo docker exec -it clab-bgp-lab-customer vtysh
# vtysh内 — BGPネイバーを確認
show bgp summary
show ip route bgp
# eth1のトラフィックをキャプチャ
sudo ip netns exec clab-bgp-lab-customer tcpdump -i eth1 -n
Nokia SR Linuxを使う(無料、ライセンス不要)
name: srl-lab
topology:
nodes:
leaf1:
kind: srl
image: ghcr.io/nokia/srlinux:latest
leaf2:
kind: srl
image: ghcr.io/nokia/srlinux:latest
spine1:
kind: srl
image: ghcr.io/nokia/srlinux:latest
links:
- endpoints: ["leaf1:e1-1", "spine1:e1-1"]
- endpoints: ["leaf2:e1-1", "spine1:e1-2"]
SR Linuxは適切なCLIに加えてgRPC、gNMI、JSON-RPCインターフェースを備えており、実際のベンダーOSのように動作する環境でネットワーク自動化スクリプトをテストするのに最適です。
現場で役立つ実践的なヒント
リソース比較:Containerlab vs GNS3
同じ8コア、16GB RAMのマシンで5ノードのOSPFトポロジーを実行した場合:
- Cisco IOS VMを使ったGNS3:約10GB RAM、4〜8分の起動時間、ルーターごとに1つのVM
- FRRoutingを使ったContainerlab:約400MB RAM、30秒未満、ルーターごとに1つのコンテナ
- Nokia SR Linuxを使ったContainerlab:ノードごとに約1.2GB RAM、60〜90秒、フルベンダーOS
OSPF、BGP、MPLS、ルーティングポリシーなど、ほとんどのプロトコルテストにおいて、FRRoutingコンテナはリソースコストの何分の一かで必要なすべてを提供します。
ルーター設定の保存と復元
vtyshで手動変更を行った後、設定をホストに保存します:
# コンテナからホストへの実行設定を保存
sudo docker exec clab-bgp-lab-customer vtysh -c "write memory"
sudo docker cp clab-bgp-lab-customer:/etc/frr/frr.conf ./configs/customer/frr.conf
これでラボの設定がバージョン管理されます。Gitにプッシュし、チームメンバーと共有して、どこでも同じラボを再作成できます。
ContainerlabをCI/CDに統合する
YAMLファイルとDockerイメージの組み合わせモデルは、CIパイプラインに自然に組み込めます。マージ前にネットワーク設定の変更を検証しましょう:
# .github/workflows/network-test.yml
jobs:
network-lab-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Containerlabのインストール
run: bash -c "$(curl -sL https://get.containerlab.dev)"
- name: ラボのデプロイ
run: sudo clab deploy -t tests/bgp-lab.yml
- name: 接続テストの実行
run: |
sleep 30 # BGPコンバージェンスを待機
sudo docker exec clab-bgp-lab-client ping -c 3 192.168.100.1
- name: ラボの削除
if: always()
run: sudo clab destroy -t tests/bgp-lab.yml
トポロジーのグラフ表示
組み込みのトポロジービジュアライザーもあります:
sudo clab graph -t bgp-lab.yml
これによりWebブラウザでインタラクティブなネットワークトポロジー図が開きます——ドキュメント作成や大規模なラボを一目で把握するのに便利です。
覚えておきたい便利なclabコマンド
# 実行中のすべてのラボを一覧表示
sudo clab inspect --all
# 削除せずに再デプロイ(再設定)
sudo clab redeploy -t lab01.yml
# 命名の衝突を避けるために特定のプレフィックスでデプロイ
sudo clab deploy -t lab01.yml --prefix myproject
# すべてのノード設定を一度に保存
sudo clab save -t lab01.yml
本格的なネットワークエンジニアリングやインフラ自動化に取り組んでいるなら、Containerlabを習得すれば素早く成果を出せます。起動、テスト、壊す、再構築——すべて1分以内、物理ラボ不要、VMハイパーバイザーのオーバーヘッドなし。トポロジーYAMLとルーター設定をGitリポジトリで共有すれば、「ラボテスト」と「本番環境への自信」の距離はほぼゼロになります。
まず2台のルーターによるFRRoutingセットアップから始めましょう。YAMLの構文に慣れたら、ベンダー固有の動作が必要になったときにSR LinuxまたはcEOSに移行してください。半日もあれば実用的なレベルに達せます。

