Blog

Run Docker on your Mac without a second virtualization stack

1VMTool now runs the Docker engine as one of its own machines and gives containers a workspace beside your VMs — one app, one memory budget, and your existing Docker contexts left alone.

1VMTool Team5 min read

You already run virtual machines on this Mac. Then a project needs Postgres, or Redis, or a stack of six services that only exist as a docker-compose.yml, and you install a second piece of infrastructure to get them: another hypervisor, another background daemon, another slice of the same 36 GiB, managed by an app that knows nothing about the machines you are already running.

Two virtualization stacks on one Mac is not a configuration anyone chose. It is what happens when the tool that runs your VMs and the tool that runs your containers have never heard of each other. They both reserve memory up front. Neither will tell you the other is the reason your build slowed down.

What changed

1VMTool now runs the Docker engine itself, as one of its own machines, and gives containers a workspace next to your VMs. One app, one memory budget, one place to look.

The Docker workspace in 1VMTool: a Containers page listing 28 containers grouped by Compose project, with the machine library and host meters in the same sidebar

How it works in practice

The engine is a machine you can see

1vm engine setup downloads a pinned Debian 13 ARM64 cloud image, verifies its SHA-512, provisions Docker into it and boots it on Apple's Virtualization.framework. It is not a hidden appliance — it appears in the library, it reports its memory in the sidebar (1VM 87.6 MiB · engine running in the shot above), and its RAM counts against the same library memory budget every other machine draws from. When the budget is tight, the app says so before you start something else rather than after.

The lifecycle is ordinary machine lifecycle:

1vm engine setup            # download, provision, first boot
1vm engine start|stop|restart
1vm engine status --json    # state, socket path, owned Docker context
1vm engine logs             # setup and daemon diagnostics

engine delete --force removes the engine and everything inside it, and the app says exactly that before you confirm: "This permanently removes every container, image and volume in the 1VM engine. Other Docker contexts are kept." Nothing outside the 1VM engine is touched.

Your existing Docker setup keeps working

The engine registers a Docker context named 1vm pointed at a private docker.sock. It never changes your selected global context. If you already have Docker Desktop, Colima or a remote host configured, they stay exactly as they were, and the Connection picker at the top of the workspace switches between all of them — the screenshot above is driving a desktop-linux context, not the managed engine.

To aim the CLI at the private socket without touching your context selection:

1vm docker ps
1vm docker compose up -d

That subcommand connects straight to the engine's socket, and if the engine is stopped, the connection starts it. Socket activation deliberately outlives the app: a client that connects after you have quit 1VMTool still gets a running engine.

Containers, grouped the way you think about them

The workspace has five sections — Docker Engine, Containers, Images, Volumes, Networks — and the container list is grouped by Compose project, with anything ungrouped under Standalone. Search filters by name, image, project and status; a Running only checkbox hides the graveyard. Compose Up… picks a compose file, Run Container… runs an image, and per container you get logs, live stats and a Terminal action. Images can be pulled, built, loaded and transferred. The whole view refreshes every five seconds.

Ports stop being guesswork

The same release taught both engines to find the ports a Linux guest is actually listening on and publish them on your Mac's loopback interface, without you declaring anything in advance. There is a Ports tab per machine and a command for scripts:

1vm ports dev

Collisions are arbitrated by the kernel's bind ownership rather than by hope: if something on your Mac already owns port 5432, the forward is reported as a collision instead of quietly stealing the socket. Publishing to the LAN instead of loopback is a per-machine choice, off by default, and the defaults live in Settings → Resources alongside the memory budget.

Before and after

BeforeNow
Getting DockerInstall a second virtualization stack1vm engine setup
MemoryTwo apps reserving RAM independentlyOne library budget covering VMs and the engine
Your existing contextsWhatever the installer decidedUntouched; the engine adds a 1vm context
Seeing containersA separate app, or docker psA workspace beside your machines
Reaching a guest portDeclare a forward, restart, hopeDiscovered and published automatically
Removing it allUninstall flow, leftovers1vm engine delete --force

Who benefits most

If you already run VMs on this Mac, the engine is the piece that stops the two halves of your local infrastructure from fighting over memory in the dark.

If you keep a Compose file per project, the container list is already sorted the way your projects are, and 1vm docker compose up -d needs no context juggling.

If you have avoided containers on a work Mac for licensing reasons, the managed engine is a Debian VM running upstream Docker on your own hardware, and deleting it is one command.

Try it

Docker management uses the host Docker CLI, and Compose and Buildx actions need their corresponding CLI plugins — everything else ships in the app. Install 1VMTool, run 1vm engine setup, and the containers show up next to the machines they were always going to share a Mac with.

Virtual machines that reset faster than they clean

1VMTool is a native app for Apple silicon with a full CLI and snapshots that cost almost nothing.