[Articulo] Contenedores WSL. Nueva funcionalidad.

Colapsar
X
 
  • Filtrar
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • jmtella
    Administrator
    • Nov
    • 21882

    [Articulo] Contenedores WSL. Nueva funcionalidad.

    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:

    Código:
    wsl --update
    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:

    Código:
    wsl --update --pre-release
    Podemos comprobar la versión instalada mediante:

    Código:
    wsl --version
    Una vez actualizado WSL, abrimos una consola normal, sin necesidad de permisos administrativos, y comprobamos que el comando wslc está disponible:

    Código:
    wslc --help
    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:

    Código:
    wslc run --rm hello-world
    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:

    Código:
    C:\wslc-xml
    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:

    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"]
    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:

    Código:
    cd C:\wslc-xml
    A continuación, creamos una imagen llamada wslc-xml:

    Código:
    wslc build -t 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:

    Código:
    wslc image list
    Obtendremos una salida parecida a esta:

    Código:
    REPOSITORY   TAG      IMAGE ID       CREATED          SIZE
    wslc-xml     latest   5f7921188924   39 minutes ago   138.98 MB
    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:

    Código:
    wslc run -d --name wslc-xml -p 12880:8080 wslc-xml
    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:

    Código:
    wslc container list --all
    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:

    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
    Ahora abrimos un navegador y entramos en:

    Código:
    http://localhost:12880/
    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:

    Código:
    wslc container stop wslc-xml
    Para volver a arrancarlo:

    Código:
    wslc container start wslc-xml
    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:

    Código:
    wslc container logs wslc-xml
    También podemos ver su configuración detallada con:

    Código:
    wslc container inspect wslc-xml
    * Borrar el contenedor y la imagen
    ----------------------------------

    Para borrar el contenedor:

    Código:
    wslc container remove -f wslc-xml
    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:

    Código:
    wslc image remove -f wslc-xml
    * 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.
    Archivos Adjuntos
  • jquilezl
    Super Moderator
    • Dec
    • 806

    #2
    Sí que te lo has currado. Lo probaré.

    Comentario

    Trabajando...
    X