Este artículo es una pequeña introducción práctica a WSL Containers, una función nueva de WSL que permite crear, ejecutar y administrar contenedores Linux directamente desde Windows mediante el comando wslc.
Su funcionamiento y su sintaxis resultarán familiares a quienes hayan usado Docker o Podman. No pretende ser una copia exacta ni ofrece necesariamente todas sus funciones, pero para muchos usos sencillos puede evitar tener que instalar otro gestor de contenedores.
Voy a enfocarlo de una forma práctica y sencilla, pensando especialmente en quien no haya trabajado nunca con contenedores.
Antes de empezar, una explicación rápida:
- Una imagen es una especie de plantilla que contiene la aplicación, sus dependencias y la configuración necesaria para ejecutarla.
- Un contenedor es una instancia creada a partir de esa imagen. Podemos arrancarlo, pararlo, volverlo a arrancar o borrarlo.
* Instalación o actualización de WSL
-----------------------------------
Lo primero es instalar o actualizar WSL, como mínimo, a la versión 2.9.4, que en el momento de escribir estas líneas todavía es una versión preliminar (pre-release).
Para actualizar WSL a la última versión estable, abrimos una consola de PowerShell o Windows Terminal como administrador y ejecutamos:
Actualmente, este comando instala la versión estable 2.7.11. Como WSL Containers requiere una versión más reciente, instalaremos la versión preliminar con:
Podemos comprobar la versión instalada mediante:
Una vez actualizado WSL, abrimos una consola normal, sin necesidad de permisos administrativos, y comprobamos que el comando wslc está disponible:
Este comando muestra la ayuda y la lista de operaciones disponibles. La sintaxis se parece bastante a la de Docker y Podman, por lo que quien ya conozca alguno de ellos se encontrará en terreno conocido.
Como primera prueba opcional, podemos ejecutar:
WSLC descargará la imagen si no la tenemos y ejecutará un pequeño contenedor de prueba. La opción --rm hace que el contenedor se elimine automáticamente cuando termine.
* Qué vamos a crear
-------------------
En este ejemplo vamos a construir una pequeña aplicación que permita pegar un texto JSON o XML sin formatear y mostrarlo correctamente indentado.
Existen herramientas web que hacen lo mismo, y programas como Notepad++ también pueden hacerlo, pero este ejemplo nos servirá para aprender el proceso completo:
- Preparar los archivos de la aplicación.
- Crear una imagen.
- Crear y arrancar un contenedor a partir de esa imagen.
- Publicar un puerto para acceder a la aplicación desde el navegador.
La aplicación estará escrita en Python, pero no es necesario tener Python instalado en Windows: tanto Python como Flask y el resto de las dependencias estarán dentro de la imagen del contenedor.
* Preparación de los archivos
-----------------------------
Creamos una carpeta para el proyecto. El nombre y la ubicación son indiferentes; por ejemplo:
Dentro de esa carpeta crearemos dos archivos:
- Containerfile
- app.py
WSLC puede trabajar con un archivo llamado Containerfile o Dockerfile. En este ejemplo utilizaremos Containerfile. Conviene respetar exactamente el nombre, incluida la extensión inexistente: no debe llamarse Containerfile.txt.
El archivo Containerfile tendrá el siguiente contenido:
Ahora creamos el archivo app.py. Descargar el dichero zip adjunto y desempaquetarlo.
Con esto ya tenemos preparada la aplicación y las instrucciones para construir su imagen.
* Creación de la imagen
-----------------------
Abrimos una consola en la carpeta que contiene Containerfile y app.py. Por ejemplo, si hemos usado la carpeta propuesta anteriormente:
A continuación, creamos una imagen llamada wslc-xml:
Atención al punto final. Debe existir un espacio entre wslc-xml y el punto. Ese punto significa «utiliza la carpeta actual como contexto de construcción», es decir, permite que WSLC encuentre Containerfile y app.py.
La primera construcción puede tardar un poco porque WSLC tendrá que descargar la imagen base de Python e instalar las dependencias.
Cuando termine, podemos comprobar que la imagen existe con:
Obtendremos una salida parecida a esta:
El identificador, el tiempo y el tamaño pueden ser distintos; la salida anterior es solo un ejemplo.
* Creación y arranque del contenedor
------------------------------------
Ahora crearemos un contenedor a partir de la imagen. La aplicación escucha en el puerto 8080 dentro del contenedor, pero nosotros la publicaremos en el puerto 12880 de Windows:
Las opciones utilizadas significan lo siguiente:
- -d: ejecuta el contenedor en segundo plano.
- --name wslc-xml: asigna al contenedor el nombre wslc-xml.
- -p 12880:8080: conecta el puerto 12880 de Windows con el puerto 8080 del contenedor.
- El último wslc-xml es el nombre de la imagen que se utilizará.
Este comando crea el contenedor y lo arranca. Solo hay que ejecutarlo una vez. En ocasiones posteriores utilizaremos start y stop sobre el contenedor ya creado.
Para ver todos los contenedores, tanto los que están funcionando como los que están parados, ejecutamos:
También pueden utilizarse algunos alias abreviados, como wslc ps -a, pero en este artículo usaré los nombres completos para que resulte más claro.
Veremos una salida parecida a esta:
Ahora abrimos un navegador y entramos en:
Ya deberíamos ver la aplicación en funcionamiento. Podemos pegar un JSON o un XML sin formatear y pulsar el botón Formatear.
Conviene tener en cuenta que Flask mostrará un aviso indicando que se está utilizando su servidor de desarrollo. Para esta prueba local es perfectamente válido, pero no sería la forma adecuada de publicar una aplicación real en Internet.
* Parar, arrancar y revisar el contenedor
-----------------------------------------
Para parar el contenedor:
Para volver a arrancarlo:
No es necesario volver a ejecutar wslc run. Ese comando se utilizó para crear el contenedor; start simplemente arranca el que ya existe.
Si la aplicación no funciona como esperábamos, podemos consultar los mensajes generados por el contenedor:
También podemos ver su configuración detallada con:
* Borrar el contenedor y la imagen
----------------------------------
Para borrar el contenedor:
La opción -f fuerza su eliminación incluso si todavía está ejecutándose. Si queremos hacerlo de forma más ordenada, primero podemos pararlo y después eliminarlo sin -f.
Borrar el contenedor no borra la imagen. Mientras la imagen wslc-xml siga existiendo, podremos crear otro contenedor con el comando wslc run, empleando el mismo puerto u otro distinto.
Una vez borrado el contenedor, también podemos borrar la imagen si ya no la necesitamos:
* Una aclaración sobre los datos y la seguridad
-----------------------------------------------
Parar un contenedor no elimina sus datos. Al volver a arrancarlo, su contenido seguirá estando ahí mientras no borremos el propio contenedor.
Sin embargo, si eliminamos el contenedor, también desaparecerán los datos almacenados únicamente dentro de él. Para conservar información importante de forma independiente, podemos mapear una carpeta de Windows dentro del contenedor o utilizar un volumen, igual que se hace con Docker o Podman.
Los contenedores ofrecen aislamiento, pero no deben considerarse una barrera de seguridad absoluta. Es importante utilizar imágenes de confianza, mantenerlas actualizadas, publicar únicamente los puertos necesarios y evitar ejecutar aplicaciones con más permisos de los imprescindibles.
WSLC permite además trabajar con volúmenes, redes, límites de recursos, registros y otras funciones más avanzadas. No las veremos aquí, porque el objetivo de este artículo era simplemente realizar un primer recorrido completo: crear una imagen, arrancar un contenedor y acceder a una aplicación desde Windows.
Su funcionamiento y su sintaxis resultarán familiares a quienes hayan usado Docker o Podman. No pretende ser una copia exacta ni ofrece necesariamente todas sus funciones, pero para muchos usos sencillos puede evitar tener que instalar otro gestor de contenedores.
Voy a enfocarlo de una forma práctica y sencilla, pensando especialmente en quien no haya trabajado nunca con contenedores.
Antes de empezar, una explicación rápida:
- Una imagen es una especie de plantilla que contiene la aplicación, sus dependencias y la configuración necesaria para ejecutarla.
- Un contenedor es una instancia creada a partir de esa imagen. Podemos arrancarlo, pararlo, volverlo a arrancar o borrarlo.
* Instalación o actualización de WSL
-----------------------------------
Lo primero es instalar o actualizar WSL, como mínimo, a la versión 2.9.4, que en el momento de escribir estas líneas todavía es una versión preliminar (pre-release).
Para actualizar WSL a la última versión estable, abrimos una consola de PowerShell o Windows Terminal como administrador y ejecutamos:
Código:
wsl --update
Código:
wsl --update --pre-release
Código:
wsl --version
Código:
wslc --help
Como primera prueba opcional, podemos ejecutar:
Código:
wslc run --rm hello-world
* Qué vamos a crear
-------------------
En este ejemplo vamos a construir una pequeña aplicación que permita pegar un texto JSON o XML sin formatear y mostrarlo correctamente indentado.
Existen herramientas web que hacen lo mismo, y programas como Notepad++ también pueden hacerlo, pero este ejemplo nos servirá para aprender el proceso completo:
- Preparar los archivos de la aplicación.
- Crear una imagen.
- Crear y arrancar un contenedor a partir de esa imagen.
- Publicar un puerto para acceder a la aplicación desde el navegador.
La aplicación estará escrita en Python, pero no es necesario tener Python instalado en Windows: tanto Python como Flask y el resto de las dependencias estarán dentro de la imagen del contenedor.
* Preparación de los archivos
-----------------------------
Creamos una carpeta para el proyecto. El nombre y la ubicación son indiferentes; por ejemplo:
Código:
C:\wslc-xml
- Containerfile
- app.py
WSLC puede trabajar con un archivo llamado Containerfile o Dockerfile. En este ejemplo utilizaremos Containerfile. Conviene respetar exactamente el nombre, incluida la extensión inexistente: no debe llamarse Containerfile.txt.
El archivo Containerfile tendrá el siguiente contenido:
Código:
# Usa una imagen base de Python reducida
FROM python:3.13-slim
# Instala xmlstarlet y elimina la caché de apt para no aumentar la imagen
RUN apt-get update && \
apt-get install -y --no-install-recommends xmlstarlet && \
rm -rf /var/lib/apt/lists/*
# Define el directorio de trabajo dentro del contenedor
WORKDIR /app
# Copia el programa al contenedor
COPY app.py /app/app.py
# Instala Flask sin guardar la caché de pip
RUN pip install --no-cache-dir Flask
# Documenta que la aplicación utiliza el puerto 8080
EXPOSE 8080
# Comando que se ejecutará al arrancar el contenedor
CMD ["python", "app.py"]
Con esto ya tenemos preparada la aplicación y las instrucciones para construir su imagen.
* Creación de la imagen
-----------------------
Abrimos una consola en la carpeta que contiene Containerfile y app.py. Por ejemplo, si hemos usado la carpeta propuesta anteriormente:
Código:
cd C:\wslc-xml
Código:
wslc build -t wslc-xml .
La primera construcción puede tardar un poco porque WSLC tendrá que descargar la imagen base de Python e instalar las dependencias.
Cuando termine, podemos comprobar que la imagen existe con:
Código:
wslc image list
Código:
REPOSITORY TAG IMAGE ID CREATED SIZE wslc-xml latest 5f7921188924 39 minutes ago 138.98 MB
* Creación y arranque del contenedor
------------------------------------
Ahora crearemos un contenedor a partir de la imagen. La aplicación escucha en el puerto 8080 dentro del contenedor, pero nosotros la publicaremos en el puerto 12880 de Windows:
Código:
wslc run -d --name wslc-xml -p 12880:8080 wslc-xml
- -d: ejecuta el contenedor en segundo plano.
- --name wslc-xml: asigna al contenedor el nombre wslc-xml.
- -p 12880:8080: conecta el puerto 12880 de Windows con el puerto 8080 del contenedor.
- El último wslc-xml es el nombre de la imagen que se utilizará.
Este comando crea el contenedor y lo arranca. Solo hay que ejecutarlo una vez. En ocasiones posteriores utilizaremos start y stop sobre el contenedor ya creado.
Para ver todos los contenedores, tanto los que están funcionando como los que están parados, ejecutamos:
Código:
wslc container list --all
Veremos una salida parecida a esta:
Código:
CONTAINER ID NAME IMAGE CREATED STATUS PORTS 72b07e75d2dd wslc-xml wslc-xml 45 minutes ago running 6 seconds ago 127.0.0.1:12880->8080/tcp
Código:
http://localhost:12880/
Conviene tener en cuenta que Flask mostrará un aviso indicando que se está utilizando su servidor de desarrollo. Para esta prueba local es perfectamente válido, pero no sería la forma adecuada de publicar una aplicación real en Internet.
* Parar, arrancar y revisar el contenedor
-----------------------------------------
Para parar el contenedor:
Código:
wslc container stop wslc-xml
Código:
wslc container start wslc-xml
Si la aplicación no funciona como esperábamos, podemos consultar los mensajes generados por el contenedor:
Código:
wslc container logs wslc-xml
Código:
wslc container inspect wslc-xml
----------------------------------
Para borrar el contenedor:
Código:
wslc container remove -f wslc-xml
Borrar el contenedor no borra la imagen. Mientras la imagen wslc-xml siga existiendo, podremos crear otro contenedor con el comando wslc run, empleando el mismo puerto u otro distinto.
Una vez borrado el contenedor, también podemos borrar la imagen si ya no la necesitamos:
Código:
wslc image remove -f wslc-xml
-----------------------------------------------
Parar un contenedor no elimina sus datos. Al volver a arrancarlo, su contenido seguirá estando ahí mientras no borremos el propio contenedor.
Sin embargo, si eliminamos el contenedor, también desaparecerán los datos almacenados únicamente dentro de él. Para conservar información importante de forma independiente, podemos mapear una carpeta de Windows dentro del contenedor o utilizar un volumen, igual que se hace con Docker o Podman.
Los contenedores ofrecen aislamiento, pero no deben considerarse una barrera de seguridad absoluta. Es importante utilizar imágenes de confianza, mantenerlas actualizadas, publicar únicamente los puertos necesarios y evitar ejecutar aplicaciones con más permisos de los imprescindibles.
WSLC permite además trabajar con volúmenes, redes, límites de recursos, registros y otras funciones más avanzadas. No las veremos aquí, porque el objetivo de este artículo era simplemente realizar un primer recorrido completo: crear una imagen, arrancar un contenedor y acceder a una aplicación desde Windows.
Comentario