Docker Desktop on Apple Silicon is embarrassingly slow. I've lost entire afternoons waiting for containers to start, watching my M2 MacBook turn into a space heater while Docker Desktop ate 6GB of RAM to run a fucking Postgres container that should need maybe 512MB.
The problem isn't your hardware - it's Docker Desktop pretending ARM64 doesn't exist. The virtualization overhead is brutal, file sync takes forever, and the whole thing feels like running containers through molasses. I've seen a simple docker ps
take 8 seconds to respond when Docker Desktop decides to have a moment.
After months of frustration reading Reddit threads about performance issues and GitHub issues filled with complaints, I finally switched to alternatives that actually work. Here's what I learned the hard way.
OrbStack: Actually Worth the Money
OrbStack costs $8/month billed annually (so really $96/year) but holy shit it's worth every penny. I was skeptical about paying for something Docker Desktop does "for free," but after using it for 6 months, I'd pay twice that.
Real performance improvements I actually measured:
- Containers actually start fast instead of taking forever (like a few seconds vs the eternity Docker Desktop takes)
- My laptop fan doesn't sound like a jet engine anymore
- Memory usage is way better - went from eating like 6GB down to maybe 1GB or so
- File changes sync basically instantly instead of that annoying delay
Yeah, their benchmarks show it's faster on big builds, but honestly the real win is daily development - starting containers doesn't require a coffee break anymore.
Why it's faster: They actually built it for macOS using Apple's Virtualization.framework instead of just porting some generic Linux VM bullshit like Docker Desktop did. The whole architecture is designed around Apple Silicon instead of fighting it.
Migration gotcha: You need to rebuild all your images. Docker Desktop and OrbStack have different architectures, so your cached images won't work. I found this out at 11pm on a Sunday when all my containers were throwing "exec format error" - fun times. Took me a whole weekend to figure out that I needed to nuke everything and rebuild from scratch. Check the migration guide and troubleshooting docs to avoid my mistakes.
Colima: Free but You'll Spend Time Tweaking
Colima is free and works well once you get it configured right. It's built on Lima VM and designed specifically for Apple Silicon, so performance is way better than Docker Desktop.
Installation that actually works:
brew install colima docker
colima start --cpu 4 --memory 8 --arch aarch64
Don't just run colima start
- you'll get a wimpy 2GB RAM limit that'll fuck you over later when you try to run anything substantial. I learned this when my Rails app crashed with "Cannot allocate memory" because I forgot to allocate enough RAM to the VM.
Real performance: Containers start way faster - maybe 3-5 seconds instead of Docker Desktop taking forever. Memory usage actually stays reasonable instead of eating everything. File sync is fast thanks to some VirtioFS magic that I don't fully understand but it works.
The catch: You'll spend time configuring shit. Network issues with certain VPNs, occasional crashes requiring restart, and some docker-compose files need tweaks. Check the common issues and community discussions when things break.
Pro tip: Set up resource limits upfront or you'll hit mysterious out-of-memory errors later. The configuration docs have all the options:
colima delete default
colima start --cpu 6 --memory 12 --disk 100
Windows: Docker Desktop is Even Worse Here
Docker Desktop on Windows is a special kind of pain. WSL2 integration feels like an afterthought, resource usage is insane, and random crashes happen when you least expect them. I've had Docker Desktop eat 8GB of RAM just sitting idle.
Podman Desktop: Actually Good WSL2 Integration
Podman Desktop is what Docker Desktop should have been on Windows. It uses WSL2 properly instead of fighting against it.
Why it doesn't suck:
- No daemon running constantly in the background eating resources
- Memory usage stays reasonable - maybe 2GB instead of Docker Desktop's habit of eating way too much for no reason
- Rootless containers by default - better security without the headache
- Doesn't randomly break when Windows updates (fucking finally)
Migration reality: You'll need to recreate your containers and volumes. Podman uses different storage locations than Docker Desktop. Plan for a day of migration work.
Pro tip: Install the Podman Desktop extension for VS Code. Check the Windows-specific docs and WSL2 integration guide to avoid common pitfalls.
Rancher Desktop: If You Need Kubernetes
Rancher Desktop is solid if your workflow involves Kubernetes development. It's less bloated than Docker Desktop but still has issues.
Good: Built-in K3s cluster, decent WSL2 integration, doesn't randomly crash as much as Docker Desktop.
Bad: Can be extremely volatile - containers sometimes stop responding and you need to restart the whole thing. I had it crash three times in one day, losing my work each time. Check the known issues and troubleshooting guide before committing to it.
Linux: Just Don't Use Docker Desktop
On Linux, Docker Desktop is completely pointless. Install Docker Engine directly and skip the bloated GUI bullshit.
## Ubuntu/Debian
sudo apt update && sudo apt install docker.io
## Arch
sudo pacman -S docker
## Add yourself to docker group to avoid sudo
sudo usermod -aG docker $USER
Why native Docker Engine is better:
- No virtualization overhead - containers share the kernel directly
- Memory usage is exactly what your containers need, not what Docker Desktop thinks they need
- No random GUI crashes taking down your containers
- Actually uses your Linux networking stack instead of some VM abstraction
Podman: Better Security, No Daemon
Podman is Docker without the daemon. Better security, better resource usage, and it doesn't require root.
Why Podman doesn't suck:
- Rootless containers by default - run containers as your user, not root
- No daemon running in the background eating resources
- Drop-in Docker CLI replacement - just
alias docker=podman
- Better systemd integration for managing containers as services
Migration tip: Your existing docker-compose files work with podman-compose. Check the Podman getting started guide and rootless tutorial for setup details.
ARM64: Docker Desktop Pretends It Doesn't Exist
Docker Desktop treats ARM64 like a second-class citizen. Building multi-arch images is slow as hell, and the QEMU emulation for x86 containers makes you want to throw your laptop out the window.
The ARM64 Problem
Working with ARM64 on Docker Desktop means:
- Cross-compilation takes forever because Docker Desktop's QEMU emulation is garbage
- Building x86 images on ARM64 hardware is painful - I've seen builds take 45 minutes for simple Node.js apps that should take 3 minutes
- Multi-arch builds randomly fail with cryptic errors like "multiple platforms feature is currently not supported for docker driver"
- The buildx documentation doesn't help when shit breaks - it just tells you to "try again" like that's useful
Lima: Actually Good ARM64 Support
Lima is backed by the CNCF and designed for ARM64 from the ground up, not as an afterthought.
What works:
- Native ARM64 containers run fast without emulation overhead
- Cross-compilation actually works reliably
- Multi-arch builds don't randomly shit the bed
Installation:
brew install lima
limactl start --arch aarch64
Multi-Arch Builds That Don't Suck
Instead of fighting Docker Desktop's broken buildx, use alternatives that handle multi-arch properly:
## With OrbStack/Colima - actually works
docker buildx create --name multiarch --driver docker-container
docker buildx use multiarch
docker buildx build --platform linux/amd64,linux/arm64 -t myapp:latest . --push
Pro tip: Build ARM64 natively, x86 in CI. Don't torture yourself trying to cross-compile everything locally.