Cómo instalar Docker en Windows 11 (WSL) sin Docker Desktop

Docker es una herramienta de contenedores que permite a los desarrolladores crear, ejecutar y distribuir aplicaciones en diferentes entornos. A su vez Windows Subsystem for Linux 2 (WSL 2) cuenta con un kernel de Linux real, compatible con contenedores Docker.

Docker funciona en WSL 2 y Docker Desktop es la forma más fácil de instalar Docker en Windows, sin embargo, para algunas personas (y me incluyo) suele ser un poco tedioso y pesado. Sobre todo, estar esperando que la ballenita se quede cargando por un largo rato en tu barra de tareas o simplemente no te gusta tener muchos programas abierto al momento de desarrollar. En esas ocasiones entonces quizás quieras ejecutar Docker desde WSL 2 sin necesidad de usar Docker Desktop.

Además, ten en cuenta que Docker Desktop es gratuito solo para personas o pequeñas empresas. Si lo estás utilizando en el trabajo y tu empresa supera una cierta cantidad de empleados o ingresos, entonces deberías pagar una suscripción. Para ver más detalles sobre el modelo de suscripción de Docker puedes ir aquí.

Habilita WSL 2 en Windows 11

Lo primero que debes hacer es habilitar la característica de WSL en Windows 11. Para hacerlo, presionar Windows y escribir "Agregar características de Windows"

Luego en la ventana que se abrirá, buscar la opción "Windows Subsystem for Linux", activa la casilla y reinicia.

Descarga e instala una distribución de Linux

Una vez que hayas habilitado WSL en Windows 11, necesitarás descargar e instalar una distro de Linux para ejecutar Docker. Puedes elegir cualquier distro de Linux que desees, pero en este ejemplo usaremos Ubuntu. Para descargar Ubuntu, ve a la tienda Microsoft Store y busca "Ubuntu":

Preparándose para la instalación de Docker

Primero vamos a hacer update y upgrade de los paquetes de nuestra distro:

sudo apt update && sudo apt upgrade

Luego instalamos algunas dependencias:

sudo apt install --no-install-recommends apt-transport-https ca-certificates curl gnupg2

A continuación, configuramos las direcciones en el repositorio de paquetes, para eso primero vamos configurar temporalmente algunas variables del sistema operativo:

. /etc/os-release

Luego nos aseguramos de que la ruta de descarga sea una ruta segura para apt:

curl -fsSL https://download.docker.com/linux/${ID}/gpg | sudo tee /etc/apt/trusted.gpg.d/docker.asc

Ahora agregamos y actualizamos el repositorio para que esté listo:

echo "deb [arch=amd64] https://download.docker.com/linux/${ID} ${VERSION_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/docker.list

Hacemos un último sudo apt update y con esto estamos listos para instalar Docker.

Si eres observador habrás notado que he usado ${ID} y ${VERSION_CODENAME}. Bueno, estas son variables del sistema, las puedes ubicar si usas el siguiente comando: nano /etc/os-release

Instalando Docker

Ahora podemos instalar el engine de docker y algunas herramientas adicionales, para eso ejecutamos el siguiente comando:

sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Administra Docker sin usar sudo

El daemon Docker se vincula a un socket de Unix, no a un puerto TCP. Por defecto, es el usuario root es el que el puede acceder al socket de Unix, otros usuarios solo pueden acceder a él mediante sudo.

Entonces tienes 2 caminos, acceder a este socket usando sudo todo el tiempo o creando un grupo y dándole permisos a usuarios específicos. En esta ocasión iremos por la segunda opción:

Creamos un grupo llamado docker

sudo groupadd docker

Ahora agregamos nuestro usuario al grupo docker

sudo usermod -aG docker $USER

Cierra la ventana de terminar y vuélvela. Deberías de ver el grupo docker cuando escribas el comando groups de la siguiente manera:

Lanzando dockerd

Casi todas las distros Linux usan systemd u otro sistema de inicio (init), pero WSL tiene su propio sistema de inicio. Para no complicarnos la vida vamos a usar el sistema de inicio de WSL, solo lanzamos dockerd y vemos la magia:

sudo dockerd

Abre otra terminal y prueba el docker cli:

docker run --rm hello-world

Deberías ver un mensaje de "Hello from Docker!" en la terminal:

Iniciando dockerd automáticamente

Lo que haremos a continuación es hacer que dockerdse ejecute automáticamente al iniciar la terminal, para esto tendremos que editar el archivo ~./profile.

Primero abrimos el archivo ~./profileusando nano:

sudo nano ~./profile

Y a continuación agregamos las siguientes sentencias al final del archivo:

DOCKER_DISTRO="Ubuntu-20.04"
DOCKER_LOG_DIR=$HOME/docker_logs
mkdir -pm o=,ug=rwx "$DOCKER_LOG_DIR"
/mnt/c/Windows/System32/wsl.exe -d $DOCKER_DISTRO sh -c "nohup sudo -b dockerd < /dev/null > $DOCKER_LOG_DIR/dockerd.log 2>&1"

Ten en cuenta que a la variable DOCKER_DISTRO se le debe asignar el nombre correcto de la distribución que estés usando. Si no estás seguro del nombre exacto de tu distro, ejecuta wsl -l -q desde tu terminal PowerShell y verás la lista de distros que tienes.

Después de hacer esta configuración notarás que al iniciar la terminal de tu distro te está solicitando la contraseña de `root` esto porque en las sentencias que escribimos líneas arriba se usa en comando `sudo`. Para hacer que no te pida contraseña al iniciar la terminal haremos lo siguiente:

Ejecutamos `sudo visudo` y dentro de este archivo agregamos la siguiente línea al final del archivo:

%docker ALL=(ALL)  NOPASSWD: /usr/bin/dockerd

Guardamos y al abrir nuevamente nuestra terminal ya no volverá a solicitarnos la clave.

Probando Docker

Una vez instalado y configurado Docker podemos probar y empezar a usarlo, para efectos de este tutorial vamos a ejecutar Nginx en Docker.

Primero descargamos la imagen de Nginx desde Docker Hub:

docker pull nginx

Y a continuación ejecutamos Nginx:

docker run --name docker-nginx -p 80:80 nginx

Ahora podemos acceder desde nuestra maquina en Windows a nginx con la siguiente dirección: http://localhost:80

Conclusión

Instalar Docker en Windows 11 sin usar Docker Desktop es posible gracias a la función de WSL2 que permite ejecutar una distribución de Linux dentro de Windows. Este ejercicio es especialmente útil para aquellos desarrolladores (como yo :P ) que prefieren trabajar con herramientas de línea de comando o que quieren tener más control sobre la instalación de Docker en su máquina. Nos leemos pronto :)