Llevo ya un tiempo escuchando a muchos usuarios de Docker Desktop bajo Microsoft Windows de lo poco conveniente que son dos cosas:
- Tener que estar cambiando el contexto de modo Windows Containers a Linux Containers cada vez que necesitan desarrollar en uno u otro.
- El overhead que les supone a su portátil tener que llevar la máquina virtual de MobyLinux arrancada para poder funcionar con contenedores para Linux, que son los mayoritarios.
Definitivamente no conocen LCOW, es decir, Linux Containers on Windows.
Contenedores, arquitectura y sistema operativo
A nadie le sorprenderá leer que las máquinas virtuales deben ejecutarse siempre en la misma arquitectura de CPU que el hardware real que las soporta. Así, en una máquina Windows con Hyper-V podemos instalar casi cualquier sistema operativo para x86 o amd64, tales como GNU/Linux, FreeBSD, Android (en su variante x86), etc... Si quisiéramos correr un sistema operativo para otra arquitectura, ya hablaríamos de emulación, como por ejemplo hace BlueStacks para ejecutar Android para arquitectura ARM sobre hardware x86.
Con los contenedores, dado que hablamos de virtualización basada en sistema operativo, este mismo concepto se extiende hasta el mismo. Contenedores preparados para ejecutarse en Windows/amd64 no van a funcionar en Linux/amd64.
Sin embargo, las tecnologías que soportan los contenedores nacieron en Linux y con diferencia es donde encontramos la inmensa mayoría de contenedores para usar. Por tanto, cuando instalamos Docker Desktop en Windows o Mac este viene acompañado de una máquina virtual llamada MobyLinux que nos permite ejecutar contenedores para Linux con propósitos de desarrollo y testing.
Pero en el caso de Windows 10 1709 o superior tenemos una alternativa muy interesante...
Modos de operación de Docker Desktop para Windows
Cuando instalamos Docker Desktop en Windows 10, veremos que tiene dos modos de operación: Windows Containers y Linux Containers. Se puede cambiar en cualquier momento entre ambos contextos, viendo que cada uno tiene su repositorio local de imágenes.
Y si hacemos clic en Switch to Linux containers...
Cada modo está destinado a que trabajemos con un tipo concreto de contenedores dado su sistema operativo, obviamente Windows o Linux según el modo. ¿Cómo funcionan?
- Windows Containers. Utiliza las capacidades de contenerización del propio Windows para ejecutar contenedores con imágenes de Windows Server Core o Windows Nano Server.
- Linux Containers. Crea y arranca automáticamente una máquina virtual en Hyper-V llamada MobyLinux donde se ejecutarán nuestros contenedores con imágenes basadas en Linux.
Sin embargo, existe una característica experimental que nos permite ejecutar contenedores Linux incluso cuando estamos en modo Windows Containers y sin usar la VM de MobyLinux, evitándonos los cambios de contexto y teniendo nuestras imágenes Windows e imágenes Linux side by side: Linux Containers on Windows o LCOW para los amigos.
Así que nuestro diagrama de opciones queda así:
Linux Containers on Windows
Microsoft ha tenido claro desde el principio que Windows debía poder ejecutar cargas contenereizadas de Linux, y ha considerado muchos planteamientos distintos, tales como utilizar los Windows Services for Linux (WSL); pero por ahora y aunque están abiertos a re-evaluar el plantemiento en el futuro, la aproximación es totalmente distinta.
LCOW utiliza de forma transparente los servicios de Hyper-V para levantar una pequeña máquina virtual altamente optimizada para el único propósito de ejecutar contenedores. Ciértamente, aquí estámos volviendo a tener un kernel por cada contenedor, pero Microsoft lo defiende en pro de una mayor seguridad en el aislamiento de procesos. Esta máquina virtual es bastante más pequeña que MobyLinux, detalles aquí.
When we were looking at ways to run Linux containers on Windows, we considered WSL. Ultimately, we chose a virtualization-based approach so that Linux containers on Windows are consistent with Linux containers on Linux. Using Hyper-V also makes LCOW more secure. We may re-evaluate in the future, but for now, LCOW will continue to use Hyper-V.
¿Y qué tenemos que hacer para utilizarlo? Básicamente lo siguiente:
- Usar Windows 10 1709 o superior en arquitectura x64.
- Habilitar la feature de Containers.
- Habilitar la feature de Hyper-V.
- Instalar Docker Desktop.
- Poner Docker Desktop en modo Windows Containers.
- Lanzar contenedores de Windows y Linux indistintamente tal como se puede ver a continuación.
¿Y Kubernetes?
Kubernetes no está soportado de momento en LCOW, así que si necesitas utilizar el incluido con Docker Desktop debes cambiar a modo Linux Containers con la máquina virtual de MobyLinux.
Cuándo utilizar MobyLinux y cuándo utilizar LCOW
Aunque la aproximación de LCOW me parece más atractiva, no olvidemos que se trata de una capacidad experimental y que por tanto está carente de garantías o soporte. Si estás aprendiendo Docker, entonces recomiendo encarecidamente utilizar MobyLinux, ya que con LCOW puedes no tener claro si algo falla por error propio o bien por la naturaleza experimental de la tecnología.
Más allá de eso y según la documentación oficial de Microsoft:
- Usa MobyLinux cuando...
- ...quieras un entorno estable y soportado.
- ...quieras utilizar el Kubernetes integrado en Docker Desktop.
- ...ejecutes contenedores de Windows y de Linux, pero rara vez al mismo tiempo.
- ...tus contenedores Linux tienen requerimientos de red complicados.
- ...no necesitas que tus contenedores Linux se ejecuten en kernel distintos.
- Usa LCOW cuando...
- ...quieras probar lo último de lo último.
- ...necesites ejecutar contenedores de Windows y Linux al mismo tiempo.
- ...quieras que tus contenedores de Linux se ejecuten en kernel distintos.
Eso es todo por ahora, happy dockering!