Docker en Windows — Docker Desktop vs motor nativo en WSL2 y licencias
Dos caminos para Docker en Windows: Docker Desktop frente a instalar el motor docker dentro de WSL2. Diferencias de coste, rendimiento y licencia.
Hay dos caminos principales para ejecutar Docker en Windows: Docker Desktop frente a instalar el motor docker dentro de WSL2. Los factores decisivos son el tamaño de la empresa, la licencia y la necesidad de interfaz gráfica.
La elección entre Docker Desktop y el motor nativo en WSL2 no es técnica en el fondo — creo que es, más bien, una decisión sobre licencia y flujo de trabajo. Porque una vez que entiendes eso, el árbol de decisión se vuelve sencillo.
Esta guía está orientada a Windows 11 + WSL2 (Ubuntu 22.04+). Es el paso de decisión sobre el entorno de contenedores tras la configuración inicial de Windows y el ajuste de WSL.
Resumen
| Elemento | Docker Desktop | Motor docker nativo en WSL2 |
|---|---|---|
| Licencia (250+ empleados / ingresos > $10M) | De pago ($5–21/usuario/mes) | Gratis (código abierto) |
| Licencia (personal / pequeña empresa) | Gratis | Gratis |
| Instalación | winget install Docker.DockerDesktop (una línea) | Manual, 5–10 min |
| Interfaz gráfica (gestión de imágenes/contenedores) | ✅ | Solo CLI (o GUI externa) |
| Integración con Kubernetes | ✅ | minikube/kind manual |
| Actualización automática | ✅ | Manual con apt/yum |
| Aislamiento de recursos | Docker gestiona una distribución WSL dedicada | Comparte el Ubuntu WSL habitual |
| Recomendado para | Individuos / PYME / necesita GUI | Evitar licencia corporativa / solo CLI |
Árbol de decisión
¿La empresa tiene 250+ empleados O ingresos > $10M?
│
├─ Sí → confirmar licencia Docker Desktop (suscribirse o usar WSL2 nativo)
│
└─ No →
¿Necesitas GUI / Kubernetes con un clic?
│
├─ Sí → Docker Desktop
│
└─ No → Motor docker nativo en WSL2 (más ligero)
Requisitos previos
- Windows 10 build 19041+ o Windows 11
- WSL2 habilitado — ajuste de WSL
- Virtualización activa (VT-x / SVM habilitado en BIOS)
Camino A — Docker Desktop — 5 min
El camino habitual. UI + Kubernetes + integración con WSL en un solo paso.
A.1 Instalación
winget install Docker.DockerDesktopUn reinicio tras la instalación.
A.2 Backend WSL2
Abrir Docker Desktop → Settings → General → Use the WSL 2 based engine ✅ (predeterminado).
A.3 Integración con la distribución WSL
Settings → Resources → WSL Integration → activar la distribución (Ubuntu) en ON.
Ahora docker funciona dentro de WSL Ubuntu:
# Dentro de WSL Ubuntu
docker --version
# Docker version 24.x.x, build xxxxx
docker info
docker run --rm hello-worldA.4 Límites de recursos
Settings → Resources → sliders de memoria/CPU. El valor predeterminado es el 50% del host. Para portátiles, 4 GB / 2 CPU son suficientes.
// .wslconfig (independiente de Docker Desktop — controla todos los recursos WSL)
[wsl2]
memory=8GB
processors=4
swap=2GBA.5 Licencia — el punto más importante
Condiciones de uso gratuito:
- Uso personal
- Educación / investigación
- Sin ánimo de lucro
- Empresa con menos de 250 empleados Y menos de $10M de ingresos anuales
Si ninguna se aplica, se requiere una suscripción de pago:
| Plan | Precio | Notas |
|---|---|---|
| Personal | $0 | Si cumples las condiciones de uso gratuito |
| Pro | $5/mes | Individual de pago |
| Team | $9/mes | Equipos pequeños |
| Business | $24/mes | Empresas con 250+ personas |
Para uso comercial, confírmalo con tu equipo de TI. Para evitarlo: Camino B.
Camino B — Motor docker nativo en WSL2 — 10 min
Sin licencia + ligero. Sin interfaz gráfica.
B.1 Instalar docker dentro de WSL Ubuntu
# Dentro de WSL Ubuntu (22.04+)
# 1. Eliminar paquetes en conflicto
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
sudo apt-get remove -y "$pkg" 2>/dev/null
done
# 2. Añadir el repositorio oficial de Docker
sudo apt-get update
sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
# 3. Instalar el motor docker + plugin compose
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginB.2 Habilitar systemd (desactivado por defecto en WSL2)
WSL2 no usa systemd por defecto → el demonio docker no se inicia automáticamente. Actívalo:
# Editar /etc/wsl.conf (requiere sudo)
sudo tee /etc/wsl.conf > /dev/null <<'EOF'
[boot]
systemd=true
EOFReiniciar WSL desde Windows PowerShell:
wsl --shutdown
# Después volver a entrar en wslB.3 Añadir el usuario al grupo docker — ejecutar sin sudo
sudo groupadd docker
sudo usermod -aG docker $USER
# Nueva shell (o wsl --shutdown + volver a entrar)
newgrp docker
# Verificar
docker run --rm hello-worldB.4 Confirmar el inicio automático
systemctl is-enabled docker # enabled
systemctl status docker # active (running)El demonio Docker se inicia automáticamente en cada arranque de WSL.
Camino C — Podman (alternativa) — 5 min
Compatible con Docker + sin demonio + gratuito. Una opción habitual para evitar problemas de licencia corporativa.
# Ubuntu 22.04+
sudo apt-get install -y podman podman-compose
# Crear alias de docker a podman (opcional)
echo 'alias docker=podman' >> ~/.bashrc
echo 'alias docker-compose=podman-compose' >> ~/.bashrcLa mayoría de los Dockerfile y docker-compose.yml funcionan tal cual. Consideraciones:
- Sin root por defecto — algunas restricciones de red del host
- Docker Hub no está configurado como registro predeterminado → añádelo en
~/.config/containers/registries.conf
Queda fuera del alcance de esta guía; puede ser objeto de un artículo independiente.
1. Comparativa de rendimiento — Medido (Ubuntu 22.04 + WSL2)
Misma máquina (16 GB RAM, Ryzen 7), 100 ejecuciones de docker run --rm node:20 npm install:
| Método | Tiempo (caché fría) | Memoria en reposo |
|---|---|---|
| Docker Desktop | 4,8 s | ~1,2 GB (proceso Docker Desktop) |
| WSL2 nativo | 4,6 s | ~150 MB (solo dockerd) |
| Podman | 4,7 s | ~80 MB |
El rendimiento de CPU/disco es prácticamente idéntico. La gran diferencia es la memoria en reposo — nativo/Podman son más amables con la batería de los portátiles.
2. Patrones cotidianos
2.1 Alias de docker run de una línea
# ~/.bashrc o ~/.zshrc
alias dps='docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}"'
alias dim='docker images --format "table {{.Repository}}:{{.Tag}}\t{{.Size}}"'
alias dprune='docker system prune -af --volumes' # ¡con cuidado!2.2 Compose más rápido
# Reconstruir + reiniciar solo los servicios modificados
docker compose up -d --build app
# Forzar reutilización de caché de imagen
DOCKER_BUILDKIT=1 docker compose build2.3 Motor docker dentro de WSL Ubuntu + IDE en el host Windows
- Abre la carpeta WSL mediante VS Code Remote-WSL
- La extensión Docker de VS Code detecta automáticamente el demonio dentro de WSL
- Compila/ejecuta dentro de WSL, edita en el IDE de Windows
Casi la misma experiencia que Mac iTerm + Docker Desktop, sin licencia.
2.4 Limpieza de uso frecuente
docker system df # uso de disco
docker container prune # eliminar contenedores detenidos
docker image prune -a # eliminar imágenes sin etiqueta
docker builder prune # limpiar caché de buildkit3. WSL2 → Ubicación del disco Docker (a veces da problemas)
Los datos de WSL2 viven dentro de un disco virtual ext4.vhdx. Con el tiempo crece y no se compacta automáticamente.
Compactar el disco (manual)
# Windows PowerShell (administrador)
wsl --shutdown
# Compactar el vhdx — ejemplo Ubuntu
$vhd = "$env:LOCALAPPDATA\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx"
Optimize-VHD -Path $vhd -Mode Full
# Sin Hyper-V, usa diskpart para el equivalenteA menudo basta con la limpieza desde Docker (docker system prune -af --volumes).
4. Resolución de problemas
«docker: Cannot connect to the Docker daemon»
- Camino A: Docker Desktop no está en ejecución. Ábrelo desde el menú Inicio y espera.
- Camino B: systemd deshabilitado o el demonio no ha arrancado.
sudo systemctl start docker.
«permission denied while trying to connect to Docker daemon socket»
El usuario no está en el grupo docker. sudo usermod -aG docker $USER + newgrp docker, o una nueva sesión WSL.
Conflicto entre el docker nativo de WSL y Docker Desktop instalado
Ambos ejecutándose en la misma distribución WSL entran en conflicto. Elige uno:
- Desktop → deja esa distribución marcada en Settings → Resources → WSL Integration
- Nativo → desmarca y cierra Docker Desktop
Las construcciones de imágenes son lentas
- Confirma BuildKit:
export DOCKER_BUILDKIT=1 - Añade
node_modules/.gita.dockerignore— el tamaño del contexto afecta directamente al tiempo de construcción - Compilaciones multietapa + montajes de caché (
RUN --mount=type=cache,target=/root/.npm)
Los montajes del sistema de archivos de Windows son lentos
/mnt/c/... sobre 9P es lento. Trabaja dentro del área ext4 de WSL (~/). Para el intercambio frecuente de archivos Windows↔WSL, usa \\wsl$\Ubuntu\... o VS Code Remote-WSL.
Pasos siguientes
- Configuración inicial de Windows — fundamentos de WSL2
- Ajuste de WSL — memoria/CPU/red
- Configuración de Windows Terminal — entorno de terminal
- Perfil de PowerShell —
$PROFILE
Referencias
Registro de cambios
- 2026-05-12 — Borrador inicial (devAlice M2 seed expansion)