一、ContainerLab 是什么?
ContainerLab 是一个强大且高效的网络实验室工具,用于部署和管理由容器互联构成的虚拟网络环境。它允许网络工程师、开发者和学习者使用基于容器的节点(如路由器、交换机、防火墙)来快速创建、销毁和测试复杂的网络拓扑。
你可以把它想象成是网络领域的 Docker Compose,但专门为网络设备拓扑而设计。
核心特点:
速度快:基于容器技术,能在几秒内启动或销毁一个完整的网络拓扑,远比传统虚拟机(如 GNS3/EVE-NG)快。
轻量级:容器共享主机内核,资源占用(CPU、内存、磁盘)极低,一台普通笔记本电脑也能轻松运行大型拓扑。
依赖简单:只需要安装 Docker 和 ContainerLab 本身,无需下载和管理庞大的虚拟机镜像(虽然某些节点类型仍需特定镜像)。
支持多种节点类型:
容器化网络操作系统 (NOS):如 Arista cEOS, Nokia SR Linux, SONiC, FrRouting等。
通用 Linux 容器:如 Alpine, Ubuntu,用作客户端、服务器或终端。
第三方工具容器:如 Wireshark, iPerf3, 监控代理等。
拓扑即代码:使用简洁的 YAML 文件定义拓扑,易于版本控制、共享和复用。
二、核心概念
拓扑文件:一个 YAML 格式的文件(通常以
.clab.yml
或.clab.yaml
结尾),用于定义网络拓扑中的所有元素。节点 (Node):拓扑中的设备,比如一台路由器、一台交换机或一台 Linux 主机。
种类 (Kind):定义节点的类型,例如
linux
(通用Linux容器)、ceos
(Arista cEOS)、srl
(Nokia SR Linux)等。链接 (Link):定义节点之间的连接关系,相当于网线。
端点 (Endpoint):链接的两端,格式为
<node-name>.<interface-name>
,例如router1:eth1
。
三、安装与前置要求
1. 前置要求
Docker:必须首先安装并运行 Docker Engine。请参考 Docker 官方文档进行安装。
sudo 权限:ContainerLab 需要权限来管理网络接口(创建 veth pair,操作网桥等)。
2. 安装 ContainerLab
安装非常简单,只需一条命令:
# 下载并执行安装脚本 bash -c "$(curl -sL https://get.containerlab.dev)"
安装完成后,验证版本:
containerlab version
四、快速入门:一个简单的例子
让我们创建一个包含两台 Linux 主机(client 和 server)直接相连的拓扑。
1. 创建拓扑文件
创建一个名为 2node.clab.yml
的文件,内容如下:
name: 2node-lab # 实验室的名称 topology: nodes: client: # 第一个节点,名为 "client" kind: linux # 节点类型为通用 Linux image: ubuntu:22.04 # 使用的 Docker 镜像 exec: - ip addr add 192.168.1.1/24 dev eth1 # 启动后执行的命令:配置IP地址 server: # 第二个节点,名为 "server" kind: linux image: ubuntu:22.04 exec: - ip addr add 192.168.1.2/24 dev eth1 links: - endpoints: ["client:eth1", "server:eth1"] # 用一条线连接 client 的 eth1 和 server 的 eth1
2. 部署实验室
在终端中,进入 YAML 文件所在的目录,运行:
containerlab deploy -t 2node.clab.yml
ContainerLab 会执行以下操作:
拉取所需的 Docker 镜像(如果本地没有)。
创建容器。
根据链接定义创建虚拟网络接口(veth pairs)并将它们连接到容器。
执行你在
exec
部分定义的命令。
3. 验证与测试
查看实验室状态:
containerlab list
输出会显示正在运行的实验室和节点。
进入节点:
使用containerlab inspect
命令可以获取如何连接到节点的信息,更简单的方法是直接使用docker exec
:
# 进入 client 节点 sudo docker exec -it clab-2node-lab-client bash # 在 client 节点的 shell 中,ping server ping 192.168.1.2
如果网络配置正确,你应该能看到成功的 ping 回复。
4. 销毁实验室
实验完成后,一键清理所有资源:
containerlab destroy -t 2node.clab.yml
这条命令会停止并删除所有容器和网络接口。
五、使用真实网络操作系统
要模拟更真实的场景,你需要使用厂商提供的容器化网络操作系统镜像。
以 Nokia SR Linux 为例:
1.获取镜像:首先需要从 Nokia 门户网站获取 SR Linux 的 Docker 镜像,并加载到 Docker 中。
2.创建拓扑文件 srl-lab.clab.yml
:
name: srl-lab topology: nodes: r1: kind: srl # 指定种类为 srl image: ghcr.io/nokia/srlinux:latest # 使用的镜像名 r2: kind: srl image: ghcr.io/nokia/srlinux:latest links: - endpoints: ["r1:e1-1", "r2:e1-1"] # 连接 r1 的 e1-1 接口和 r2 的 e1-1 接口
3.部署和登录:
containerlab deploy -t srl-lab.clab.yml
部署后,你可以使用 SSH 或 docker exec
登录到设备。默认情况下,ContainerLab 会为支持 CLI 的设备(如 SR Linux)生成启动配置。
查看生成的用户名密码:
containerlab inspect -t srl-lab.clab.yml
六、常用命令总结
命令 | 作用 | 示例 |
---|---|---|
containerlab deploy | 根据拓扑文件创建实验室 | sudo containerlab deploy -t topo.clab.yml |
containerlab destroy | 销毁实验室,清理资源 | sudo containerlab destroy -t topo.clab.yml |
containerlab list | 列出所有正在运行的实验室和节点 | sudo containerlab list |
containerlab inspect | 显示实验室的详细信息(管理地址、登录凭证等) | sudo containerlab inspect -t topo.clab.yml |
containerlab graph | 生成拓扑图(需安装 Graphviz) | sudo containerlab graph -t topo.clab.yml |
containerlab version | 显示 clab 版本 | containerlab version |
七、优点与局限性
优点:
极致轻快:启动速度和无与伦比的资源效率是其最大优势。
简单易用:YAML 语法清晰,命令行工具直观。
云原生集成:非常适合与 CI/CD 流水线集成,用于自动化测试和验证。
活跃社区:发展迅速,支持的网络操作系统越来越多。
局限性:
硬件仿真限制:容器共享主机内核,无法模拟需要特殊硬件的设备(如 ASIC)。它更适合测试控制平面和管理平面的功能,对于数据平面性能测试可能不如基于VM的工具。
镜像可用性:许多厂商的容器化 NOS 镜像并非免费公开提供,需要商业许可或开发者计划账户才能获取。
总结
ContainerLab 是现代网络工程师和开发者的利器,特别适用于协议学习、配置验证、自动化脚本测试和CI/CD集成。如果你需要的是一个快速、轻量且易于脚本化的网络实验环境,ContainerLab 很可能是你的最佳选择。对于需要深度数据平面仿真或特定硬件的场景,则可以将其与 GNS3/EVE-NG 等传统工具结合使用。