devAlice
← Windows

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

ElementoDocker DesktopMotor docker nativo en WSL2
Licencia (250+ empleados / ingresos > $10M)De pago ($5–21/usuario/mes)Gratis (código abierto)
Licencia (personal / pequeña empresa)GratisGratis
Instalaciónwinget 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 Kubernetesminikube/kind manual
Actualización automáticaManual con apt/yum
Aislamiento de recursosDocker gestiona una distribución WSL dedicadaComparte el Ubuntu WSL habitual
Recomendado paraIndividuos / PYME / necesita GUIEvitar 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.DockerDesktop

Un 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-world

A.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=2GB

A.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:

PlanPrecioNotas
Personal$0Si cumples las condiciones de uso gratuito
Pro$5/mesIndividual de pago
Team$9/mesEquipos pequeños
Business$24/mesEmpresas 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-plugin

B.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
EOF

Reiniciar WSL desde Windows PowerShell:

wsl --shutdown
# Después volver a entrar en wsl

B.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-world

B.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' >> ~/.bashrc

La 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étodoTiempo (caché fría)Memoria en reposo
Docker Desktop4,8 s~1,2 GB (proceso Docker Desktop)
WSL2 nativo4,6 s~150 MB (solo dockerd)
Podman4,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 build

2.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 buildkit

3. 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 equivalente

A 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 / .git a .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

Referencias

Registro de cambios

  • 2026-05-12 — Borrador inicial (devAlice M2 seed expansion)