Before you start
- A Mac with Apple silicon and macOS 26 or later.
- The other app running, so its context answers while you copy images and volumes.
- A list of what you actually need: images you can't pull again, and named volumes with data (databases, uploads). Everything else is quicker to recreate.
- One representative Compose project to try first. Check that its services start, its data is present and its published ports answer before moving the rest.
Move to Oxcart, step by step
- Install Oxcart. Download Oxcart (Apple silicon, macOS 26 or later) and open it. Setup is offline and takes seconds; it asks for one administrator password, for the helper that links the command-line tools.
- Decide about the docker tools. If Docker Desktop or OrbStack installed
docker, Oxcart lists each tool with both versions and asks before replacing it. Replace is on by default; Uninstall puts the other app's tools back. - Select the oxcart context. Setup creates an
oxcartDocker context. It makes it current only if the current context isdefaultwith nothing answering, so after another app you usually rundocker context use oxcartyourself. - Bring the images you need. Pull them again, or stream them from the other app with
docker saveintodocker load, which keeps tags and digests. - Move the volumes that hold data. Pack each named volume into a tar file through a small container in the other app, then unpack it into a new volume in Oxcart.
- Start your Compose projects. Run
docker compose up -d --waitin each project folder. Volumes you moved under the same name are picked up. - Point hard-wired tools at Oxcart. Tools that follow the Docker context find Oxcart on their own. A tool that only reads
DOCKER_HOSTneeds it set to theoxcartcontext's endpoint.
The commands
Find the contexts and switch
docker context ls The list shows the oxcart context and the other app's context, with an asterisk on the current one. Then:
docker context use oxcart Copy images from the other app
Stream images straight from one engine to the other without a file in between. Tags and digests come across.
# OTHER is the other app's context name from `docker context ls`
OTHER=<other-context>
docker --context "$OTHER" save postgres:17-alpine myapp:dev | docker --context oxcart load To bring every tagged image at once:
docker --context "$OTHER" images --format '{{.Repository}}:{{.Tag}}' | grep -v '<none>' \
| xargs docker --context "$OTHER" save | docker --context oxcart load Images you built from a Dockerfile are often faster to rebuild on Oxcart with docker build or docker compose build; cached rebuilds took 121 ms in our benchmark.
Move a named volume
This example moves a Postgres volume called pgdata. It writes a tar file into a folder in your home folder: Oxcart shares your home folder with containers by default, and the other app needs to be able to bind-mount it too. Stop the containers that use the volume first, so the copy is consistent.
mkdir -p ~/volume-move && cd ~/volume-move
# 1. Pack the volume in the other app
docker --context "$OTHER" run --rm -v pgdata:/from -v "$PWD":/backup alpine \
tar -C /from -czf /backup/pgdata.tgz .
# 2. Unpack it into a new volume in Oxcart
docker --context oxcart volume create pgdata
docker --context oxcart run --rm -v pgdata:/to -v "$PWD":/backup alpine \
tar -C /to -xzf /backup/pgdata.tgz Compose names volumes <project>_<volume>. Create the Oxcart volume under the same full name (see docker volume ls in the other context) and Compose will use it.
Start your Compose projects
cd ~/code/myproject
docker compose up -d --wait Healthcheck dependencies, up --wait, service-name DNS, init: true and network_mode: service: work as they did. See Docker Compose on Apple silicon.
Tools that read DOCKER_HOST
Oxcart never creates or replaces /var/run/docker.sock; the docker CLI, Compose, Buildx and most SDKs follow the current context. If a tool only reads DOCKER_HOST, point it at Oxcart:
export DOCKER_HOST="$(docker context inspect oxcart --format '{{.Endpoints.docker.Host}}')" Inside containers, mounting /var/run/docker.sock works as usual for Testcontainers, docker-outside-of-docker, Portainer and Traefik. See Dev Containers and Testcontainers on a Mac.
Switch back
docker context use <other-context> # back to the other app
docker context use oxcart # and to Oxcart again What changes for you after the switch
| Operation | Oxcart 0.1.2 | OrbStack 2.2.3 | Docker Desktop 4.94.0 |
|---|---|---|---|
docker run --rm … true | 42.3 ms | 220 ms | 143 ms |
docker stop | 19.2 ms | 107 ms | 128 ms |
| Stop and remove 20 containers | 76.7 ms | 1,224 ms | 683 ms |
| Build, cached | 121 ms | 283 ms | 149 ms |
Oxcart 0.1.2 measured 2026-10-10 with its bundled docker 29.9 client; OrbStack 2.2.3 and Docker Desktop 4.94.0 measured earlier the same day, on the same Mac and harness, with docker 29.4. Full tables: vs Docker Desktop and vs OrbStack.
You also get a local MCP server for coding agents (set it up in one paste), ports grouped by repository and branch, and container traffic that follows your VPN, DNS and firewall rules (networking guide).
Questions
Do I have to uninstall Docker Desktop or OrbStack first?
No. Oxcart installs next to them with its own oxcart Docker context. Switch with docker context use. Keep the other app installed until you have moved what you need.
Will Oxcart change my current Docker context?
Only if the current context is default and nothing answers on it. If another app's context is current, Oxcart leaves it alone and you choose with docker context use oxcart.
Do my images and volumes come across automatically?
No. Each app keeps its own images and volumes. Pull images again or stream them with docker save | docker load; move named volumes that hold data with a tar file, as shown above. Volumes with caches or other throwaway data can simply be recreated.
What happens to my registry logins?
If a pull asks for credentials, run docker login once. Oxcart stores the password in the macOS Keychain through docker-credential-osxkeychain; config.json keeps only the registry name.
Can I keep my existing development workflow?
Yes. Keep using the docker CLI, Compose, Buildx, Dev Containers and Testcontainers. Oxcart supports privileged containers, including privileged: true in Compose. Move one project first, check its ports and data, then switch the rest when you are ready. Your other Docker context remains available throughout.
Do updates keep my containers?
Yes. An Oxcart update keeps every container, image, volume and network.
How do I go back?
Run docker context use with the other app's context name. If you uninstall Oxcart, Uninstall puts back any docker tools it replaced.
Sources and method
- Setup, the command-line tools and the Docker context: Oxcart 0.1.3 as shipped.
- Compatibility: tested on Oxcart, 2026-10-10 (save and load with preserved tags and digests, Compose, the Docker socket in containers).
- Benchmarks: Oxcart 0.1.2, OrbStack 2.2.3 and Docker Desktop 4.94.0, measured 2026-10-10 on one Apple M5 Max, 8 CPUs and 12 GB each, one product at a time, medians of five samples.
- The other apps' context names differ by app and version: read them from
docker context ls.