Why an ARM Mac is different
Run real network labs on an M-series Mac: native FRR and Linux containers, x86-only images through Rosetta, and full x86 VyOS VMs under QEMU in Docker, with the pitfalls that stop most people and a starter lab that mixes all three.
By the end you will be able to:
- Check whether a lab image runs natively, translated or not at all on an ARM Mac
- Build lab networks in Docker that carry only the addresses you configure
- Run an x86-only network OS as a QEMU virtual machine inside a container, and drive its console
- Budget memory and CPU for a mixed lab, and recognise the kernel features Docker Desktop lacks
- Avoid the pitfalls that break labs on Docker Desktop: broadcast storms, duplicate MACs, OOM kills and missing interpreters
An Apple Silicon Mac (M1 to M4) has an ARM processor, while most network operating systems are only built for x86, and that one fact is behind almost every "my lab won't start" problem on a Mac. The good news is that everything in this site's lessons runs on exactly this kind of machine. This guide shows how, with output from the Mac the labs were built on.
Everything runs inside Docker Desktop, which runs a small Linux virtual machine for its containers. On an Apple Silicon Mac, that Linux is ARM too (arm64, also called aarch64). A piece of lab software can run in it in one of three ways:
| How it runs | Speed | Use it for |
|---|---|---|
| Native arm64 container: the image has an arm64 build | Full speed | FRR, Linux hosts and tools (iproute2, tcpdump), most open-source software |
| amd64 container, translated: Docker runs the x86 program through Rosetta (or QEMU) | Close to native for most tools | Images that only exist for x86 |
| Full x86 virtual machine: QEMU emulates a whole x86 PC, inside a container | Much slower: minutes to boot, tens of seconds per commit | Network operating systems that only ship as x86 images, like VyOS |
The rule of thumb: use native containers wherever you can, and emulate only what you must. In this site's labs, FRR routers and Linux hosts are native containers, and each VyOS router is a full x86 VM running under QEMU inside a container. Both kinds connect to the same Docker networks, so they can sit side by side in one topology, as the starter lab at the end of this guide shows.
- One Linux VM for every container. Docker Desktop runs a small arm64 Linux VM. Every container in a lab shares its kernel and its memory.
- Native: full speed. Images with an arm64 build, like FRR and Debian, run directly. Use these wherever you can.
- Translated: x86 programs. An amd64-only image still runs: the kernel hands its x86 programs to Rosetta (or QEMU's user-mode emulator), about 40% slower in our test.
- Emulated: a whole x86 PC. A network OS like VyOS needs its own kernel. A native QEMU in a container emulates an x86 PC with TCG: real, but minutes to boot.