Si trabajas en macOS o en Windows, llevas todo el curso ejecutando contenedores dentro de una máquina virtual Linux sin verla. Docker Desktop es esa VM, más una interfaz gráfica y un puñado de extras. Esta lección abre la caja: qué hay dentro, por qué eso explica que los bind mounts vayan lentos, qué aporta de verdad, cuánto cuesta —incluida la letra pequeña de la licencia— y qué alternativas tienes en cada sistema.
Contenido
- Qué es exactamente Docker Desktop
- La arquitectura por dentro
- Por qué los bind mounts van lentos
- La VM y sus recursos
- El disco virtual que crece y no se encoge
- Windows: WSL 2 frente a Hyper-V
- macOS: Apple Silicon, Rosetta y VirtioFS
- Lo que aporta la interfaz
- Docker Scout, el Kubernetes de un clic y las extensiones
docker init,docker debugy los contenedores de desarrollo- Licencia y coste
- Alternativas al escritorio
- Recomendación por perfil
- Qué es exactamente Docker Desktop
Docker Desktop no es Docker. Es un paquete que contiene, entre otras cosas:
| Componente | Para qué |
|---|---|
| Una VM Linux ligera | Ejecutar el kernel que los contenedores necesitan |
| Docker Engine dentro de esa VM | El dockerd de siempre (01-03) |
Cliente docker nativo del anfitrión |
El binario que ejecutas en tu terminal |
Plugins: compose, buildx, scout, debug, init |
Subcomandos de la CLI |
| Interfaz gráfica | Paneles de contenedores, imágenes, volúmenes y builds |
| Kubernetes empaquetado | Un clúster de un nodo, opcional |
| Gestor de extensiones | Herramientas de terceros dentro del panel |
| Redirección de puertos y sistema de ficheros | Que localhost:8080 y tus carpetas funcionen |
El punto clave está en la primera fila: los contenedores son una función del kernel de Linux —namespaces y cgroups, tal como viste en 05-07—. macOS y Windows no tienen ese kernel, así que hace falta uno. En Linux, Docker Desktop es opcional precisamente porque el kernel ya está: ahí docker habla directamente con dockerd sin ninguna VM de por medio.
- La arquitectura por dentro
graph TB
subgraph mac["macOS / Windows (anfitrión)"]
CLI["cliente docker + docker compose"]
GUI["Interfaz gráfica de Docker Desktop"]
FS["Tus carpetas: ~/aurora-libros"]
end
subgraph vm["VM Linux (Apple Virtualization / WSL 2)"]
D["dockerd"]
CTD["containerd + runc"]
C1["aurora-api"]
C2["aurora-db"]
SHARE["Capa de compartición de ficheros<br/>(VirtioFS / 9p)"]
end
CLI -->|"socket del anfitrión"| D
GUI --> D
D --> CTD --> C1
CTD --> C2
FS <-->|"bind mount: cruza la frontera"| SHARE
SHARE <--> C1
Todo lo que cruce la frontera entre el anfitrión y la VM tiene un coste. Y hay dos cosas que la cruzan constantemente: los ficheros de los bind mounts y los paquetes de red de los puertos publicados.
- Por qué los bind mounts van lentos
Cuando montas ./src:/app/src en Linux, no pasa nada especial: el contenedor ve el mismo sistema de ficheros del host a través del namespace de montaje. En macOS o Windows, cada open(), cada stat() y cada read() viaja del contenedor a la VM, de la VM al anfitrión y vuelta.
| Escenario | Coste relativo | Motivo |
|---|---|---|
| Ficheros dentro de la VM (volumen nombrado) | 1× (nativo) | No cruza nada |
| Bind mount con VirtioFS (macOS reciente) | 2-5× | Protocolo eficiente, pero cruza |
| Bind mount con 9p / gRPC-FUSE (antiguo) | 10-50× | Muchísimas llamadas por operación |
Bind mount desde /mnt/c/... en WSL 2 |
10-30× | Cruza el traductor de NTFS a Linux |
| Ficheros en el sistema de ficheros de WSL | 1× | Ya está en Linux |
Ahí está el motivo de una recomendación que verás en todas partes y que ahora entiendes: node_modules nunca en un bind mount. Instalar dependencias de aurora-api con la carpeta montada desde macOS puede tardar minutos; con un volumen nombrado, segundos.
# compose.override.yaml — el patrón que salva el rendimiento
services:
api:
volumes:
- ./src:/app/src # tu código: pocas lecturas, cambia a menudo
- node_modules:/app/node_modules # miles de ficheros: dentro de la VM
volumes:
node_modules:Mídelo tú mismo, que es más convincente que cualquier tabla:
# Dentro de un bind mount desde el anfitrión
docker run --rm -v "$PWD":/prueba -w /prueba alpine \
sh -c 'time (for i in $(seq 1 2000); do echo x > f$i; done)'
# Dentro de un volumen nombrado (vive en la VM)
docker run --rm -v prueba-vol:/prueba -w /prueba alpine \
sh -c 'time (for i in $(seq 1 2000); do echo x > f$i; done)'
- La VM y sus recursos
La VM tiene un tamaño fijo que le has asignado, y todo lo que ejecutan tus contenedores compite dentro de él. Cuando un docker compose up de Aurora Libros va lento sin motivo aparente, este es el primer sitio donde mirar.
| Ajuste | Dónde | Recomendación |
|---|---|---|
| CPUs | Settings → Resources | La mitad de los núcleos del anfitrión |
| Memoria | Settings → Resources | 4-8 GB para la pila de Aurora Libros |
| Swap | Settings → Resources | 1-2 GB; no compensa más |
| Tamaño del disco virtual | Settings → Resources | 60 GB o más si construyes mucho |
| Backend | Settings → General | WSL 2 en Windows, VZ en macOS |
docker info --format 'CPUs: {{.NCPU}} Memoria: {{.MemTotal}}'
docker system df -v # dónde se está yendo el disco de verdad
docker stats --no-stream # qué contenedor se come la VM ahora mismoUn síntoma frecuente y confuso: PostgreSQL muere con código 137 al importar los nueve títulos del catálogo. No es un fallo de la base de datos, es el OOM killer del kernel de la VM. Si la VM tiene 2 GB y los contenedores piden 3, alguien muere; súbela y el problema desaparece.
- El disco virtual que crece y no se encoge
El disco de la VM es un fichero disperso en tu anfitrión —Docker.raw en macOS, un .vhdx en Windows— que crece cuando escribes y no mengua cuando borras. Puedes tener 8 GB de imágenes según Docker y 90 GB ocupados en tu portátil.
docker system df
# TYPE TOTAL ACTIVE SIZE RECLAIMABLE
# Images 34 6 18.2GB 12.6GB (69%)
# Build Cache 412 0 21.4GB 21.4GB
du -sh ~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw # macOSRecuperar espacio son dos pasos, y el orden importa:
# 1. Liberar dentro de la VM
docker builder prune -f # la caché de BuildKit suele ser lo más gordo
docker image prune -a -f # imágenes sin contenedor asociado
docker system prune -a --volumes # ¡CUIDADO! borra volúmenes sin usar
# 2. Devolver el espacio al anfitrión
# macOS y Windows: el botón "Clean / Purge data" de Settings → Resources
# Windows con WSL 2, desde PowerShell:
# wsl --shutdown ; Optimize-VHD -Path <ruta>.vhdx -Mode FullLa advertencia del tercer comando es seria: --volumes se lleva por delante aurora-datos si en ese momento no hay ningún contenedor usándolo. Los nueve títulos del catálogo desaparecen sin preguntar. Usa docker volume ls antes y, en general, prefiere prune selectivo.
- Windows: WSL 2 frente a Hyper-V
| Backend WSL 2 | Backend Hyper-V (heredado) | |
|---|---|---|
| Base | Subsistema de Windows para Linux | VM completa de Hyper-V |
| Memoria | Dinámica: crece y devuelve | Fija, reservada al arrancar |
| Arranque | Segundos | Decenas de segundos |
| Ediciones de Windows | Home incluida | Solo Pro/Enterprise |
| Rendimiento de E/S | Muy bueno dentro de WSL | Uniforme y mediocre |
| Integración con distros | Sí: docker desde Ubuntu-WSL |
No |
| Recomendación | Por defecto | Solo si WSL 2 no es viable |
La integración con distribuciones es lo que hace cómodo el día a día: en Settings → Resources → WSL Integration activas tu Ubuntu, y desde su terminal el comando docker funciona sin instalar nada dentro.
Y la regla que más rendimiento te dará en Windows: guarda el código en el sistema de ficheros de Linux, no en el de Windows.
# MAL: el proyecto en C:\Users\... visto desde WSL
cd /mnt/c/Users/tu-usuario/aurora-libros && docker compose up # lentísimo
# BIEN: el proyecto dentro de la distribución
cd ~/aurora-libros && docker compose up # nativoLa diferencia no es de matiz: un npm install de aurora-api puede pasar de tres minutos a veinte segundos solo por mover la carpeta. Si necesitas editar desde Windows, VS Code con la extensión WSL abre el proyecto remoto sin sacar los ficheros de Linux.
- macOS: Apple Silicon, Rosetta y VirtioFS
En un Mac con Apple Silicon, la VM es arm64. Tus imágenes se construyen y ejecutan en arm64 de forma nativa, y todo va rápido... hasta que aparece una imagen que solo existe para amd64.
docker run --rm alpine uname -m
# aarch64 ← nativo, todo bien
docker run --rm --platform linux/amd64 alpine uname -m
# x86_64 ← emulado: funciona, pero cuesta
# WARNING: The requested image's platform (linux/amd64) does not match
# the detected host platform (linux/arm64/v8)| Opción | Cómo funciona | Coste aproximado |
|---|---|---|
| Imagen arm64 nativa | Sin traducción | 1× |
| Rosetta para Linux/x86 | Traducción de instrucciones acelerada por Apple | 1,2-2× |
| QEMU (sin Rosetta) | Emulación por software | 3-10×, y a veces falla |
Rosetta se activa en Settings → General → Use Rosetta for x86/amd64 emulation y mejora mucho la experiencia, pero no es magia: hay binarios que fallan, extensiones de CPU que no están y cargas que siguen siendo lentas.
Por eso el trabajo multiarquitectura del módulo 5 no era académico. Tu ghcr.io/auroralibros/aurora-api:2.0.0 está publicada para linux/amd64 y linux/arm64, así que el Mac descarga la variante arm64 y el servidor de producción la amd64, sin emulación en ninguno de los dos lados. Es la solución correcta al problema.
En cuanto a ficheros, macOS usa VirtioFS con el framework de virtualización de Apple: es notablemente más rápido que el antiguo gRPC-FUSE, aunque sigue sin llegar a lo nativo. Verifica que está activo en Settings → General → Choose file sharing implementation.
- Lo que aporta la interfaz
La GUI no hace nada que la CLI no pueda hacer, pero hay tareas donde ver es más rápido que teclear.
| Panel | Para qué es realmente útil |
|---|---|
| Containers | Ver la pila entera de Aurora Libros agrupada por proyecto de Compose; abrir logs, terminal y estadísticas de un clic |
| Images | Ver tamaños de un vistazo y borrar lo que sobra sin recordar los prune |
| Volumes | Comprobar qué ocupa aurora-datos y explorar sus ficheros, que por CLI exige un contenedor auxiliar |
| Builds | Historial de builds con duración por paso y aciertos de caché |
| Dev Environments / Extensions | Extras opcionales, de utilidad variable |
El panel de Builds es el más infravalorado: te dice qué paso del Dockerfile de aurora-api está costando los segundos y si la caché acertó o no, que es exactamente lo que optimizaste a ciegas en 05-04.
- Docker Scout, el Kubernetes de un clic y las extensiones
Docker Scout viene integrado y analiza las imágenes locales:
docker scout quickview ghcr.io/auroralibros/aurora-api:2.0.0
docker scout cves ghcr.io/auroralibros/aurora-api:2.0.0 --only-severity critical,high
docker scout recommendations ghcr.io/auroralibros/aurora-api:2.0.0Es cómodo para una revisión rápida en el escritorio, pero no sustituye al escaneo del pipeline: el que decide si una imagen se publica es el Trivy de tu GitHub Actions (06-02), que corre sin intervención humana y falla el build. Scout es la comprobación temprana; el pipeline es la puerta.
El Kubernetes de un clic activa un clúster de un solo nodo dentro de la misma VM.
| Sirve para | No sirve para |
|---|---|
| Probar que tus manifiestos aplican sin errores | Nada que se parezca a producción |
Aprender kubectl sin montar nada |
Probar alta disponibilidad o reprogramación |
Depurar un Deployment o un Service |
Medir rendimiento o autoescalado real |
Comprobar un Ingress básico |
Probar StorageClass o CNI del proveedor |
Frente a kind, minikube o k3d (06-04), su ventaja es que ya está ahí; su desventaja es que consume memoria de la misma VM y no puedes tener varios clústeres ni elegir versión con comodidad. Para experimentar con varias versiones o simular varios nodos, kind sigue siendo mejor.
Las extensiones añaden herramientas de terceros al panel (visores de logs, clientes de bases de datos, gestores de discos). Son útiles con una precaución: son código de terceros con acceso a tu daemon. Instala solo las que necesites y de origen conocido.
docker init, docker debug y los contenedores de desarrollo
docker init, docker debug y los contenedores de desarrollocd ~/aurora-libros/aurora-api
docker init
# ? What application platform does your project use? Node
# ? What version of Node do you want to use? 22
# ? Which port does your server listen on? 8080
# Created: .dockerignore, Dockerfile, compose.yaml, README.Docker.mddocker init genera un andamiaje razonable: multietapa, usuario sin privilegios y .dockerignore. Es un excelente punto de partida y un mal punto de llegada: no fija la base por digest, no añade las tres sondas de 06-01 ni el apagado ordenado. Úsalo para arrancar y aplica encima lo que sabes.
docker debug resuelve el problema clásico de las imágenes mínimas: cuando aurora-api:2.0.0 no tiene ni sh ni curl, docker exec no te sirve de nada.
docker debug aurora-api
# Adjunta un shell con herramientas (curl, vim, ps, ss...) SIN modificar la imagenNo instala nada en el contenedor ni cambia la imagen: monta un conjunto de utilidades en una capa aparte. Es la alternativa cómoda al netshoot que verás en 07-04, y una función de la suscripción de pago.
Por último, los contenedores de desarrollo de VS Code: un .devcontainer/devcontainer.json describe el entorno completo —imagen, extensiones, puertos, comandos— y el editor se ejecuta dentro del contenedor.
{
"name": "aurora-api",
"dockerComposeFile": ["../compose.yaml", "../compose.override.yaml"],
"service": "api",
"workspaceFolder": "/app",
"forwardPorts": [8080],
"customizations": { "vscode": { "extensions": ["dbaeumer.vscode-eslint"] } }
}Con esto, alguien nuevo en Aurora Libros clona el repositorio, abre VS Code y tiene Node 22, PostgreSQL 16 y Redis 7 funcionando. Es la respuesta definitiva a los quince pasos de onboarding manual con los que empezó el curso en 01-07.
- Licencia y coste
Docker Desktop es software propietario con licencia comercial, aunque el Docker Engine que lleva dentro sea de código abierto. En los términos vigentes en 2026:
| Uso | Condición |
|---|---|
| Personal | Gratuito |
| Educación y docencia | Gratuito |
| Proyectos de código abierto sin ánimo de lucro | Gratuito |
| Pequeñas empresas | Gratuito por debajo de cierto umbral de empleados y facturación |
| Empresas por encima de ese umbral | Suscripción de pago por usuario |
El umbral ha cambiado más de una vez desde 2021, y la letra concreta —qué cuenta como empleado, si incluye a los contratistas, qué pasa en un grupo de empresas— determina si tu organización debe pagar.
Advertencia práctica: no instales Docker Desktop en un equipo corporativo dando por hecho que es gratis. Consulta los términos vigentes en la web oficial en el momento de instalarlo y valídalo con el departamento legal o de compras de tu empresa. Ha habido auditorías de licencias con facturas retroactivas, y la responsabilidad no recae en quien lo instaló, sino en la compañía. Si tu empresa decide no pagar, la buena noticia es que hay alternativas plenamente funcionales y ninguna de ellas afecta a tus imágenes, que son OCI estándar.
- Alternativas al escritorio
| Herramienta | Sistemas | Licencia | Interfaz gráfica | Fuerte en | Flojo en |
|---|---|---|---|---|---|
| Docker Engine nativo | Linux | Apache 2.0 | No | Rendimiento nativo, cero coste | Solo Linux, sin GUI |
| Rancher Desktop | mac, Win, Linux | Apache 2.0 | Sí | K8s (k3s) integrado, elegir runtime | Menos pulido, más pesado |
| Podman Desktop | mac, Win, Linux | Apache 2.0 | Sí | Sin daemon, rootless, buen soporte K8s | Detalles de compatibilidad (07-05) |
| Colima | mac, Linux | MIT | No | Ligero, brew install, muy simple |
Sin GUI, comunidad pequeña |
| OrbStack | macOS | Propietaria (gratis personal) | Sí | El más rápido y ligero en Mac | Solo macOS, de pago en empresa |
| lima | mac, Linux | Apache 2.0 | No | VMs Linux a medida, base de Colima | Requiere configurar más |
# Colima: alternativa mínima en macOS, con la CLI de Docker de siempre
brew install colima docker docker-compose
colima start --cpu 4 --memory 8 --vm-type vz --mount-type virtiofs
docker context ls # colima aparece como contexto (¡lo de 07-01!)
docker compose up -d # Aurora Libros arranca igualFíjate en el detalle: todas estas alternativas se integran mediante contextos de Docker, el mecanismo de la lección anterior. Y en todas ellas tus imágenes y tu compose.yaml funcionan sin cambios, porque nada de lo que has construido durante el curso depende de Docker Desktop.
- Recomendación por perfil
| Perfil | Recomendación | Motivo |
|---|---|---|
| Aprendiendo, portátil personal | Docker Desktop | Gratuito, todo integrado, menos fricción |
| Desarrollador en Linux | Docker Engine nativo | Sin VM, sin licencia, máximo rendimiento |
| Desarrollador en Mac, empresa que paga | Docker Desktop u OrbStack | Integrado; OrbStack si el rendimiento importa |
| Desarrollador en Mac, sin licencia | Colima o Podman Desktop | Gratuitas y suficientes |
| Desarrollador en Windows | Docker Desktop con WSL 2 | Es lo mejor integrado con diferencia |
| Empresa que evita el propietario | Podman Desktop o Rancher Desktop | Apache 2.0, sin umbrales que vigilar |
| Servidor o CI | Nunca Docker Desktop | Es una herramienta de escritorio; usa Engine |
La última fila no admite matices: en un servidor o en un runner de integración continua se instala Docker Engine, nunca Docker Desktop.
Errores Comunes y Consejos
- Trabajar desde
/mnt/c/...en WSL 2. Es la causa número uno de lentitud en Windows. Mueve el proyecto a~/dentro de la distribución. - Bind-montar
node_modules. Miles de ficheros pequeños cruzando la frontera. Usa un volumen nombrado para esa ruta. - Extrañarse del código 137. Es el OOM killer de la VM. Sube la memoria en Resources o pon límites por servicio.
- Creer que borrar imágenes libera espacio en el portátil. El disco virtual no se encoge solo: hay que compactarlo o purgarlo aparte.
docker system prune -a --volumessin mirar. Se llevaaurora-datosy con él los nueve títulos. Compruebadocker volume lsantes.- Instalarlo en la empresa sin comprobar la licencia. Los términos cambian y las auditorías existen. Verifica y consulta con legal o compras.
- Usar el Kubernetes de Docker Desktop como si fuese producción. Es un nodo único: no prueba disponibilidad, ni reprogramación, ni el CNI real.
- Consejo: activa Rosetta en Apple Silicon, pero resuelve el problema de raíz publicando imágenes multiarquitectura como hiciste en 05-05.
- Consejo: revisa el panel Builds cuando un
docker compose buildse haga lento. Te dirá el paso culpable en segundos. - Consejo: guarda un
.devcontainer/devcontainer.jsonen el repositorio. Convierte el onboarding en «clona y abre».
Ejercicios
Ejercicio 1 — Mide la frontera. Diseña y ejecuta una medición que compare el tiempo de crear 3 000 ficheros pequeños en tres ubicaciones: un bind mount desde tu carpeta del anfitrión, un volumen nombrado y el sistema de ficheros interno del contenedor. Anota los tres tiempos, calcula la proporción y explica el resultado con la arquitectura de §2. Si estás en Linux, explica por qué los tres números se parecen.
Ejercicio 2 — Auditoría de espacio y recuperación. Averigua cuánto ocupa Docker según su propia contabilidad y cuánto ocupa realmente el disco virtual en tu anfitrión. Explica la diferencia. Después libera espacio de forma segura, dejando intacto el volumen aurora-datos, y comprueba el resultado en ambas medidas. Indica qué comando habría destruido los datos y por qué.
Ejercicio 3 — Decisión de herramienta de escritorio. Aurora Libros crece a 14 desarrolladores: 6 en macOS con Apple Silicon, 5 en Windows y 3 en Linux. La empresa supera el umbral de la licencia gratuita. Compras pregunta si hay que pagar 14 suscripciones. Prepara una recomendación con: qué se necesita realmente en cada sistema, qué alternativa propones para cada grupo, qué se pierde con cada alternativa, y qué preguntas concretas hay que hacer a legal antes de decidir.
Soluciones
Solución 1.
mkdir -p /tmp/prueba-bind && docker volume create prueba-vol >/dev/null
CMD='time (for i in $(seq 1 3000); do echo x > /destino/f$i; done)'
echo "== Bind mount desde el anfitrión =="
docker run --rm -v /tmp/prueba-bind:/destino alpine sh -c "$CMD"
echo "== Volumen nombrado (dentro de la VM) =="
docker run --rm -v prueba-vol:/destino alpine sh -c "$CMD"
echo "== Capa de escritura del contenedor =="
docker run --rm alpine sh -c "mkdir /destino && $CMD"
rm -rf /tmp/prueba-bind && docker volume rm prueba-volResultados típicos en un Mac con Apple Silicon y VirtioFS: bind mount alrededor de 8-12 s, volumen nombrado 0,6-1,2 s, capa del contenedor 0,5-1 s. La proporción del bind mount ronda 10×. La explicación es la de §2: cada open(), write() y close() de los 3 000 ficheros atraviesa la capa de compartición entre la VM y el anfitrión, y son 9 000 viajes de ida y vuelta; el volumen nombrado vive dentro del disco de la VM y no cruza nada, igual que la capa de escritura de overlay2 (05-07).
En Linux los tres números salen casi idénticos —décimas de segundo— porque no hay frontera que cruzar: el bind mount es el mismo sistema de ficheros visto desde otro namespace de montaje. Ese es exactamente el motivo por el que un compañero con Linux no reproduce tu problema de lentitud, y por el que la solución no es «tener mejor portátil» sino mover los ficheros al lado correcto de la frontera.
Solución 2.
docker system df # contabilidad interna
du -sh ~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw # macOS
# wsl --shutdown ; (Get-Item <ruta>.vhdx).Length # WindowsLa diferencia es que el disco virtual es un fichero disperso que crece al escribir y nunca se reduce al borrar: cuando eliminas una imagen, los bloques quedan libres dentro de la VM pero el fichero sigue reservando ese tamaño en tu portátil.
docker volume ls # confirmar que aurora-datos existe
docker builder prune -f # caché de BuildKit: lo más voluminoso
docker image prune -a -f # imágenes sin contenedor asociado
docker container prune -f # contenedores parados
docker system df # comprobar la mejora
# Después: Settings → Resources → Clean/Purge data, o compactar el .vhdx
docker volume ls | grep aurora-datos # sigue ahíEl comando destructivo es docker system prune -a --volumes: la opción --volumes incluye los volúmenes sin ningún contenedor asociado, y si en ese momento aurora-db está parado, aurora-datos entra en la criba y los nueve títulos del catálogo desaparecen sin confirmación por volumen. Como red de seguridad, haz docker run --rm -v aurora-datos:/v -v "$PWD":/b alpine tar czf /b/aurora-datos.tgz -C /v . antes de cualquier limpieza agresiva, exactamente el patrón de copia de 05-02.
Solución 3. Recomendación por grupos:
| Grupo | Propuesta | Qué se pierde |
|---|---|---|
| 3 en Linux | Docker Engine nativo | Nada relevante: no necesitan VM ni GUI |
| 6 en macOS | Colima (u OrbStack si se prioriza velocidad) | GUI integrada, Scout local, docker debug |
| 5 en Windows | Docker Desktop o Podman Desktop / Rancher Desktop | Con las alternativas, algo de integración con WSL |
Análisis: de 14 licencias, 3 sobran de inmediato porque en Linux Docker Desktop no aporta nada. En macOS, Colima cubre el caso completo con la CLI de siempre y los mismos contextos; se pierden funciones de escritorio que el equipo probablemente use poco, y conviene preguntarlo antes de decidir por ellos. Windows es donde la integración con WSL 2 tiene más valor real, así que ahí puede compensar pagar unas pocas licencias en lugar de forzar una alternativa. Una salida intermedia razonable: 5 licencias para Windows y alternativas libres en macOS y Linux, revisable en seis meses.
Preguntas para legal y compras, antes de decidir nada: ¿qué dicen exactamente los términos vigentes sobre el umbral, y contamos empleados totales o solo desarrolladores?; ¿los contratistas externos y las filiales cuentan dentro del grupo?; ¿existe ya un acuerdo marco con Docker o un contrato de suscripción de otro producto que cubra esto? Añade una cuarta pregunta interna, que a menudo es la que resuelve el debate: ¿qué funciones concretas de Docker Desktop usa de verdad el equipo cada semana? Si la respuesta es «arrancar Compose y ver logs», la decisión se toma sola.
Conclusión
Ya sabes qué es esa VM que llevabas usando sin verla. Docker Desktop no es Docker: es una máquina virtual Linux con dockerd dentro, más una GUI, plugins y extras, y existe porque los contenedores son una función del kernel de Linux que macOS y Windows no tienen. En Linux es opcional justamente por eso.
De esa arquitectura sale todo lo demás. Entiendes por qué los bind mounts van entre 2 y 30 veces más lentos según el sistema y el protocolo, por qué node_modules debe vivir en un volumen nombrado, y por qué en WSL 2 mover el proyecto de /mnt/c/... a ~/ puede convertir tres minutos en veinte segundos. Sabes dimensionar la VM, diagnosticar un código 137 como lo que es —el OOM killer, no un fallo de PostgreSQL— y recuperar espacio en los dos niveles, con la advertencia de que --volumes se lleva aurora-datos sin preguntar.
Conoces el terreno de cada sistema: WSL 2 frente a Hyper-V y la integración con distribuciones en Windows; Apple Silicon, Rosetta y VirtioFS en macOS, con la constatación de que el trabajo multiarquitectura de 05-05 es la solución de raíz al problema de la emulación. Y sabes qué aporta la herramienta de verdad: el panel de Builds con la duración por paso, Scout como comprobación temprana que no sustituye al escaneo del pipeline, el Kubernetes de un clic con sus límites honestos, docker init como buen punto de partida y mal punto de llegada, docker debug para las imágenes sin shell, y los contenedores de desarrollo como respuesta definitiva a los quince pasos de onboarding de 01-07.
Y te llevas lo que no es técnico: es software propietario con umbrales de licencia que han cambiado varias veces, así que se verifica en la web oficial y se valida con legal o compras antes de instalarlo en la empresa. Si la respuesta es que no se paga, tienes la tabla de alternativas —Engine nativo, Rancher, Podman Desktop, Colima, OrbStack, lima—, todas integradas por contextos y todas ejecutando tus imágenes sin cambiar una línea, porque nada de lo que has construido depende de Docker Desktop.
En la lección siguiente salimos del escritorio para equipar el flujo de trabajo: las herramientas y plugins de terceros que rodean a Docker en un proyecto real. Cómo funciona la extensibilidad de la CLI —construirás tu propio docker aurora—, qué merece la pena en interfaces, inspección, seguridad, registros propios, desarrollo y construcción alternativa, y con qué criterios se decide adoptar una herramienta o dejarla fuera.
Docker: De Principiante a Avanzado
Módulo 1: Introducción a Docker
- ¿Qué es Docker?
- Instalando Docker
- Arquitectura de Docker
- Comandos Básicos de Docker
- Entendiendo las Imágenes de Docker
- Creando tu Primer Contenedor Docker
- El Proyecto del Curso: la Plataforma Aurora Libros
Módulo 2: Trabajando con Imágenes Docker
- Docker Hub y Repositorios
- Construyendo Imágenes Docker
- Conceptos Básicos de Dockerfile
- Instrucciones Avanzadas del Dockerfile
- Gestionando Imágenes Docker
- Etiquetado y Publicación de Imágenes
Módulo 3: Contenedores Docker
- Ejecutando Contenedores
- Ciclo de Vida del Contenedor
- Gestionando Contenedores
- Inspección y Depuración de Contenedores
- Redes en Docker
- Persistencia de Datos con Volúmenes
- Límites de Recursos y Políticas de Reinicio
Módulo 4: Docker Compose
- Introducción a Docker Compose
- Definiendo Servicios en Docker Compose
- Comandos de Docker Compose
- Aplicaciones Multi-Contenedor
- Variables de Entorno en Docker Compose
- Perfiles, Overrides y Múltiples Entornos
- Desarrollo Local con Docker Compose
Módulo 5: Conceptos Avanzados de Docker
- Profundización en Redes Docker
- Opciones de Almacenamiento Docker
- Mejores Prácticas de Seguridad en Docker
- Optimizando Imágenes Docker
- Builds Avanzadas con BuildKit y Buildx
- Registro y Monitoreo en Docker
- El Runtime por Dentro: Namespaces, Cgroups y Capas
Módulo 6: Docker en Producción
- Preparar una Imagen para Producción
- CI/CD con Docker
- Orquestando Contenedores con Docker Swarm
- Introducción a Kubernetes
- Desplegando Contenedores Docker en Kubernetes
- Escalado y Balanceo de Carga
- Estrategias de Despliegue y Rollback
