Lab setup on macOS (OrbStack + containerlab + cEOS)¶
Everything you need to run the Course 2 cEOS lab on a Mac — no cloud, no nested virtualization. cEOS is a container, so a full 4-node VXLAN-EVPN fabric boots on your laptop in minutes.
✅ Validated on Apple Silicon (M-series) with OrbStack, cEOS 4.32.0F under Rosetta.
The stack: macOS → OrbStack (fast Docker + Linux VMs) → a Linux machine that runs Docker + containerlab → your cEOS nodes. Everything below runs inside the Linux machine, so your Mac stays clean.
graph LR
MAC["macOS<br/>(your laptop)"] --> ORB["OrbStack<br/>Linux VM 'mylab'"]
ORB --> DKR["Docker + containerlab"]
DKR --> LAB["cEOS fabric<br/>clab-ceos-evpn-*"]
classDef a fill:#1565c0,stroke:#90caf9,color:#ffffff,stroke-width:2px,font-weight:bold;
classDef b fill:#2e7d32,stroke:#a5d6a7,color:#ffffff,stroke-width:2px,font-weight:bold;
class MAC,ORB a; class DKR,LAB b;
Prerequisites¶
- macOS — Apple Silicon (M-series) or Intel. cEOS is amd64-only; on Apple Silicon it runs under OrbStack's built-in Rosetta emulation (automatic — no toggle to flip).
- A free Arista account (arista.com) to download the cEOS image (like Juniper's account for vJunos).
- ~8 GB free RAM for a 4-node fabric.
1. Install OrbStack¶
Download and install from orbstack.dev. OrbStack gives you a Docker engine and lightweight Linux VMs, far lighter than Docker Desktop or a full VM — and it does amd64 emulation automatically.
2. Create a Linux machine¶
containerlab manipulates Linux network namespaces, so it needs a real Linux host. Create one in OrbStack (this is your lab box):
orb create ubuntu mylab
ssh orb # drops you into the machine → rwh@mylab:~$
mylab.
Your Mac files are already mounted
OrbStack mounts your macOS home into the Linux machine, so a file you download to
~/Downloads on the Mac is visible inside mylab too — no scp needed.
3. Confirm Docker works¶
docker ps
4. Get and import the cEOS image¶
- On arista.com → Support → Software Download → cEOS-lab, grab a recent stable
build, e.g.
cEOS64-lab-4.32.0F.tar.xz. - Import it (from wherever it landed — your mounted Mac
~/Downloadsworks):
docker import --platform linux/amd64 cEOS64-lab-4.32.0F.tar.xz ceos:4.32.0F
docker images | grep ceos
Apple Silicon: the --platform linux/amd64 flag is mandatory
cEOS binaries are x86_64. --platform linux/amd64 tags the image as amd64 so
OrbStack runs it under Rosetta. Skip it and you'll get exec format error when
the container starts. .tar.xz is fine — docker import decompresses it for you.
5. Install containerlab¶
bash -c "$(curl -sL https://get.containerlab.dev)"
containerlab version
6. Smoke test — one node (prove cEOS boots)¶
Before the full fabric, confirm a single cEOS node comes up on your Mac:
mkdir -p ~/ceos-lab && cd ~/ceos-lab
cat > smoke.clab.yml <<'EOF'
name: ceos-smoke
topology:
nodes:
ceos1:
kind: arista_ceos
image: ceos:4.32.0F
EOF
sudo containerlab deploy -t smoke.clab.yml
docker exec -it clab-ceos-smoke-ceos1 Cli
ceos1> prompt + show version = cEOS runs on your Mac. 🎉 Tear it down:
sudo containerlab destroy -t smoke.clab.yml
7. Deploy the fabric¶
You're ready for the Course 2 lab. Drop in its ceos-evpn.clab.yml
and:
cd ~/ceos-lab
sudo containerlab deploy -t ceos-evpn.clab.yml
Troubleshooting¶
| Symptom | Cause | Fix |
|---|---|---|
docker: command not found / can't connect |
Docker context not set in the machine | It's usually automatic in OrbStack; re-enter with ssh orb, or check the OrbStack app is running |
exec format error on container start |
forgot --platform linux/amd64 on import |
Re-import with the flag |
Node boots, show interfaces Ethernet1 status shows type Unknown |
cEOS boot-race — EOS scanned before containerlab wired the veths (worse under emulation) | containerlab destroy + deploy, then health-check until all nodes show connected / EbraTestPhyPort. Never docker restart a clab node — it destroys the veths (reload is also unavailable — it's a container) |
| Fabric slow to boot | 4 emulated nodes booting at once | Normal — give it 5–8 min; watch with watch -n 5 'docker ps --filter name=clab-ceos-evpn --format "table {{.Names}}\t{{.Status}}"' |
Can't reload a node |
it's a container, not a box | Redeploy via containerlab; there's no in-box reboot |
Health-check loop (run before configuring):
for n in spine1 spine2 leaf1 leaf2; do
echo "== $n =="; docker exec clab-ceos-evpn-$n Cli -c "show interfaces Ethernet1 status"
done
Unknown) before you start.
Daily use¶
ssh orb # enter the lab machine
cd ~/ceos-lab
sudo containerlab deploy -t ceos-evpn.clab.yml # bring the fabric up
sudo containerlab destroy -t ceos-evpn.clab.yml # tear it down for the day
docker exec -it clab-ceos-evpn-leaf1 Cli # jump into any node's CLI
Your Mac stays clean — the lab lives entirely inside the mylab machine, and you can
destroy/deploy as often as you like. Next: the VXLAN-EVPN lab →.