Docker Desktop on macOS: Real-World Problems and Why Many Developers Want Out
If you’re using macOS for software development and need to run Docker containers, chances are you’re already using Docker Desktop. But since 2022, Docker Desktop moved to a paid model for companies with more than 250 employees or over $10M in annual revenue. That’s the first reason many teams started looking for alternatives.
Beyond the cost issue, Docker Desktop is also notorious for its resource consumption. On M-series MacBooks, Docker Desktop runs a hidden Linux VM underneath — and that VM typically eats up 2-4GB of RAM even when no containers are running. I measured this on my M1 Pro: Docker Desktop idle consumed 3.2GB of RAM. On a 16GB machine, that’s 20% of your resources just for the background process.
Comparing Docker Desktop Alternatives on macOS
There are currently a few popular options, each with a different philosophy:
- Colima: A lightweight wrapper running Lima underneath, focused on replacing Docker Desktop as quickly as possible. Install and start using immediately with minimal configuration.
- Lima: The underlying layer that Colima builds on. Far more flexible — not just Docker, you can run any Linux distro, configure VMs in detail, and use VZ Framework (Apple Virtualization) or QEMU depending on your needs.
- OrbStack: Beautiful UI, fast, but closed-source with a limited free tier. Fundamentally still commercial software.
- Podman Desktop: Uses Podman instead of Docker engine, CLI-compatible but some Docker ecosystem tools don’t fully support it yet.
Lima vs. Alternatives: Pros and Cons Analysis
| Criteria | Lima | Colima | OrbStack | Docker Desktop |
|---|---|---|---|---|
| Completely Free | ✅ MIT | ✅ Apache 2 | ⚠️ Free with limits | ⚠️ Free for personal use |
| Performance (Apple Silicon) | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| VM Customization | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ | ⭐⭐ |
| Ease of Initial Setup | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| Multi-distro Support | ✅ | Mainly Ubuntu/Fedora | ❌ Ubuntu only | ❌ |
Lima is the best fit if you want complete control over your environment, don’t want to depend on commercial tools, and need to run multiple VMs with different distros for different purposes.
How Lima Works: QEMU and VZ Framework
Lima (Linux Machines) supports two hypervisor backends:
- QEMU: Emulation + KVM-style acceleration. Works on both Intel Macs and Apple Silicon. Highly compatible and stable, but slightly slower.
- VZ (Apple Virtualization Framework): Apple’s native API, available only on macOS 13+ with Apple Silicon. Significantly faster with lower overhead, but less flexible for emulation.
For M-series Macs running macOS 13+, I always recommend using VZ — boot time is nearly 3x faster compared to QEMU on the same hardware.
Lima also supports 9p mount (QEMU) and virtiofs mount (VZ) for sharing directories from macOS into the VM. virtiofs is significantly faster than 9p, especially for I/O-heavy workloads like frontend builds.
Installing Lima on macOS
Requirements
- macOS 13 Ventura or later (to use VZ Framework)
- Homebrew already installed
- About 2GB of disk space for the VM image
Installing Lima via Homebrew
# Install Lima
brew install lima
# Check version
limactl --version
# lima version 1.x.x
Creating Your First VM — Ubuntu with VZ Framework
Lima uses YAML files to define VMs. Many templates are available, or you can write your own custom configuration:
# List available templates
limactl start --list-templates
# Create default Ubuntu VM (uses QEMU)
limactl start
# Create Ubuntu VM using VZ Framework (faster on Apple Silicon)
limactl start --vm-type vz --mount-type virtiofs ubuntu
The first time you run Lima, it will download the image (~700MB for Ubuntu) and then automatically boot the VM. This process takes 2-5 minutes depending on your network speed.
# Check VM status
limactl list
# Sample output:
# NAME STATUS SSH VMTYPE ARCH CPUS MEMORY DISK
# default Running 127.0.0.1:60022 vz aarch64 4 4GiB 100GiB
# SSH into the VM
limactl shell default
# Or use the quick shell command
lima
Customizing VMs with YAML Files
Create a custom configuration file to control CPU, RAM, and mount points:
# ~/lima-dev.yaml
vmType: vz
os: Linux
arch: aarch64
# Resource allocation
cpus: 4
memory: 8GiB
disk: 60GiB
# VZ Framework options
rosetta:
enabled: true # Run x86_64 binaries on Apple Silicon via Rosetta
binfmt: true
# Mount directories from macOS into the VM
mounts:
- location: "~/projects"
mountPoint: /projects
writable: true
9p:
securityModel: mapped-xattr
- location: "~/.ssh"
mountPoint: /home/user.linux/.ssh
writable: false
# Automatic port forwarding (Lima detects ports listening in the VM)
portForwards:
- guestPort: 3000
hostPort: 3000
- guestPort: 8080
hostPort: 8080
# Install packages during first-time provisioning
provision:
- mode: system
script: |
#!/bin/bash
apt-get update
apt-get install -y git curl build-essential
- mode: user
script: |
#!/bin/bash
# Setup user environment
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
# Start VM from custom config file
limactl start ~/lima-dev.yaml
# Connect to the dev VM
limactl shell lima-dev
Integrating Docker with Lima — Fully Replacing Docker Desktop
Lima has a built-in template for Docker, running Docker Engine inside the Lima VM:
# Create Lima VM with Docker engine (docker template)
limactl start template://docker
# Or with VZ Framework
limactl start --vm-type vz --mount-type virtiofs template://docker
Once the VM is running, configure the Docker context on macOS to point to Lima:
# Create Docker context pointing to Lima socket
docker context create lima-docker \
--docker "host=unix:///Users/$USER/.lima/docker/sock/docker.sock"
# Switch to Lima context
docker context use lima-docker
# Verify Docker is working
docker info
docker run --rm hello-world
From this point on, every docker command in your macOS terminal will run through Docker Engine inside the Lima VM. No more Docker Desktop needed.
Using Docker Compose with Lima
# Install Docker Compose plugin on macOS (no need to install into the VM)
brew install docker-compose
# Run compose as normal
cd ~/projects/my-app
docker compose up -d
# Check containers
docker compose ps
Managing Multiple Lima VMs — Real-World Workflow
I run a homelab with Proxmox VE managing 12 VMs and containers — that’s my main test environment for server-side work. On my daily MacBook, Lima is an indispensable companion for quickly testing Linux environments without having to SSH into a server. I typically run 2-3 Lima VMs in parallel: one running Docker, another for testing Linux scripts before deploying to Proxmox.
# List all VMs
limactl list
# Stop VM (frees RAM, VM still exists)
limactl stop default
# Delete VM permanently
limactl delete my-test-vm
# Edit VM config
limactl edit default # Opens YAML editor
# Start a specific VM
limactl start docker
# Run commands in VM without interactive SSH
limactl shell docker -- docker ps -a
limactl shell docker -- bash -c "cd /projects && ls -la"
VM Snapshots and Backups
# Snapshot VM (only supported with VZ backend on macOS 14+)
limactl snapshot save default my-snapshot-before-test
# List snapshots
limactl snapshot list default
# Restore snapshot
limactl snapshot restore default my-snapshot-before-test
# Delete snapshot
limactl snapshot delete default my-snapshot-before-test
Common Troubleshooting
VM Won’t Boot
# View detailed logs
limactl start --debug ubuntu 2>&1 | tail -50
# Check logs of a running VM
cat ~/.lima/default/serial.log | tail -30
Directory Mount Has No Write Permission
# Check mount inside the VM
limactl shell default -- mount | grep projects
# Make sure YAML has writable: true
# If using virtiofs, add to ~/.lima/default/lima.yaml:
# mounts:
# - location: ~/projects
# writable: true
Docker Socket Connection Issues
# Check if socket exists
ls -la ~/.lima/docker/sock/docker.sock
# Reset Docker context to default if needed
docker context use default
# Then recreate the Lima context
docker context create lima-docker \
--docker "host=unix://$HOME/.lima/docker/sock/docker.sock"
Conclusion: Can Lima Really Replace Docker Desktop?
After several months of using Lima + Docker context on my MacBook M2, the short answer is: yes, completely. VM boot time is around 5-8 seconds with VZ Framework, idle RAM usage is about 400MB, and every docker command works just as expected.
The only downside is that the initial setup requires a few more manual steps than Docker Desktop. But once you’ve done it, you can forget about it — the VM starts automatically with macOS if configured, and the Docker context is already set.
If you want something simpler and only need Docker, Colima is the better choice — it wraps Lima and reduces the configuration steps. But if you want to run multiple distros, test diverse Linux environments, or need finer control, Lima is the tool you’re looking for.

