Antes de empezar
- Un Mac con chip de Apple y macOS 26 o posterior.
- La otra app en ejecución, para que su contexto responda mientras copias imágenes y volúmenes.
- Una lista de lo que necesitas de verdad: imágenes que no puedes volver a descargar y volúmenes con nombre que contienen datos (bases de datos, archivos subidos). Todo lo demás se recrea más rápido.
- Un proyecto Compose representativo para probar primero. Comprueba que sus servicios arrancan, que sus datos están presentes y que sus puertos publicados responden antes de trasladar el resto.
Cambiar a Oxcart, paso a paso
- Instala Oxcart. Descarga Oxcart (chip de Apple, macOS 26 o posterior) y ábrelo. La configuración se realiza sin conexión y tarda segundos; solicita una contraseña de administrador para el componente auxiliar que enlaza las herramientas de línea de comandos.
- Decide qué hacer con las herramientas docker. Si Docker Desktop u OrbStack instaló
docker, Oxcart muestra cada herramienta con ambas versiones y pide permiso antes de sustituirla. Replace está activado de forma predeterminada; Uninstall restaura las herramientas de la otra app. - Selecciona el contexto oxcart. La configuración crea un contexto Docker
oxcart. Solo lo convierte en el contexto actual si este esdefaulty nada responde en él, así que después de usar otra app normalmente debes ejecutardocker context use oxcart. - Transfiere las imágenes que necesitas. Descárgalas de nuevo o transfiérelas directamente desde la otra app con
docker savehaciadocker load, que conserva las etiquetas y los digests. - Traslada los volúmenes que contienen datos. Empaqueta cada volumen con nombre en un archivo tar mediante un contenedor pequeño en la otra app y después extráelo en un volumen nuevo de Oxcart.
- Inicia tus proyectos Compose. Ejecuta
docker compose up -d --waiten la carpeta de cada proyecto. Se usarán los volúmenes que hayas trasladado con el mismo nombre. - Dirige a Oxcart las herramientas con configuración fija. Las herramientas que siguen el contexto Docker encuentran Oxcart automáticamente. Si una herramienta solo lee
DOCKER_HOST, debes establecer esa variable en el endpoint del contextooxcart.
Los comandos
Buscar los contextos y cambiar
docker context ls La lista muestra el contexto oxcart y el de la otra app, con un asterisco en el actual. Después:
docker context use oxcart Copiar imágenes desde la otra app
Transfiere imágenes directamente de un motor al otro, sin un archivo intermedio. Se conservan las etiquetas y los digests.
# 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 Para transferir todas las imágenes etiquetadas de una vez:
docker --context "$OTHER" images --format '{{.Repository}}:{{.Tag}}' | grep -v '<none>' \
| xargs docker --context "$OTHER" save | docker --context oxcart load Las imágenes creadas a partir de un Dockerfile suelen recompilarse más rápido en Oxcart con docker build o docker compose build; las recompilaciones con caché tardaron 121 ms en nuestra prueba de rendimiento.
Trasladar un volumen con nombre
Este ejemplo traslada un volumen Postgres llamado pgdata. Escribe un archivo tar en una carpeta dentro de tu carpeta personal: Oxcart comparte tu carpeta personal con los contenedores de forma predeterminada, y la otra app también debe poder montarla mediante un bind mount. Detén primero los contenedores que usan el volumen para que la copia sea coherente.
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 asigna a los volúmenes nombres con el formato <project>_<volume>. Crea el volumen de Oxcart con el mismo nombre completo (consulta docker volume ls en el otro contexto) y Compose lo usará.
Iniciar tus proyectos Compose
cd ~/code/myproject
docker compose up -d --wait Las dependencias de comprobaciones de salud, up --wait, DNS por nombre de servicio, init: true y network_mode: service: funcionan como antes. Consulta Docker Compose en equipos con chip de Apple.
Herramientas que leen DOCKER_HOST
Oxcart nunca crea ni sustituye /var/run/docker.sock; la CLI docker, Compose, Buildx y la mayoría de los SDK siguen el contexto actual. Si una herramienta solo lee DOCKER_HOST, dirígela a Oxcart:
export DOCKER_HOST="$(docker context inspect oxcart --format '{{.Endpoints.docker.Host}}')" Dentro de los contenedores, montar /var/run/docker.sock funciona como siempre para Testcontainers, docker-outside-of-docker, Portainer y Traefik. Consulta Dev Containers y Testcontainers en Mac.
Volver al contexto anterior
docker context use <other-context> # back to the other app
docker context use oxcart # and to Oxcart again Qué cambia para ti después de migrar
| Operación | 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 |
| Detener y eliminar 20 contenedores | 76.7 ms | 1,224 ms | 683 ms |
| Compilación con caché | 121 ms | 283 ms | 149 ms |
Oxcart 0.1.2 medido el 2026-10-10 con su cliente docker 29.9 incluido; OrbStack 2.2.3 y Docker Desktop 4.94.0 medidos antes ese mismo día, en el mismo Mac y con el mismo sistema de medición, con docker 29.4. Tablas completas: frente a Docker Desktop y frente a OrbStack.
También dispones de un servidor MCP local para agentes de programación (configúralo con un solo pegado), puertos agrupados por repositorio y rama, y tráfico de contenedores que sigue tus reglas de VPN, DNS y firewall (guía de redes).
Preguntas
¿Debo desinstalar primero Docker Desktop u OrbStack?
No. Oxcart se instala junto a ellos con su propio contexto Docker oxcart. Cambia con docker context use. Mantén instalada la otra app hasta haber trasladado lo que necesitas.
¿Oxcart cambiará mi contexto Docker actual?
Solo si el contexto actual es default y nada responde en él. Si está seleccionado el contexto de otra app, Oxcart lo deja como está y tú eliges con docker context use oxcart.
¿Mis imágenes y volúmenes se transfieren automáticamente?
No. Cada app mantiene sus propias imágenes y volúmenes. Descarga las imágenes de nuevo o transfiérelas con docker save | docker load; traslada los volúmenes con nombre que contienen datos mediante un archivo tar, como se muestra arriba. Los volúmenes con cachés u otros datos desechables pueden recrearse sin más.
¿Qué ocurre con mis credenciales de los registros?
Si una descarga pide credenciales, ejecuta docker login una vez. Oxcart guarda la contraseña en el Llavero de macOS mediante docker-credential-osxkeychain; config.json solo conserva el nombre del registro.
¿Puedo mantener mi flujo de desarrollo actual?
Sí. Sigue usando la CLI docker, Compose, Buildx, Dev Containers y Testcontainers. Oxcart admite contenedores privilegiados, incluido privileged: true en Compose. Traslada primero un proyecto, comprueba sus puertos y datos y cambia el resto cuando estés listo. Tu otro contexto Docker seguirá disponible durante todo el proceso.
¿Las actualizaciones conservan mis contenedores?
Sí. Una actualización de Oxcart conserva todos los contenedores, imágenes, volúmenes y redes.
¿Cómo vuelvo al entorno anterior?
Ejecuta docker context use con el nombre del contexto de la otra app. Si desinstalas Oxcart, Uninstall restaura las herramientas docker que había sustituido.
Fuentes y método
- Configuración, herramientas de línea de comandos y contexto Docker: Oxcart 0.1.3 tal como se distribuye.
- Compatibilidad: probada en Oxcart el 2026-10-10 (guardado y carga conservando etiquetas y digests, Compose y socket Docker dentro de contenedores).
- Pruebas de rendimiento: Oxcart 0.1.2, OrbStack 2.2.3 y Docker Desktop 4.94.0, medidos el 2026-10-10 en un Apple M5 Max, con 8 CPU y 12 GB cada uno, un producto a la vez, medianas de cinco muestras.
- Los nombres de contexto de las otras apps varían según la app y la versión: consúltalos con
docker context ls.