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 dockerd
se ejecute automáticamente al iniciar la terminal, para esto tendremos que editar el archivo ~./profile
.
Primero abrimos el archivo ~./profile
usando 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, ejecutawsl -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 :)