Laboratorio 02 - Docker en acción
Docker permite ejecutar aplicaciones junto con sus dependencias sin instalarlas directamente en el sistema anfitrión. Esta capacidad resulta útil para probar software, preparar entornos reproducibles y distribuir aplicaciones con una configuración consistente.
En este laboratorio ejecutará tres aplicaciones con características diferentes. Los ejemplos permiten observar cómo Docker descarga imágenes, crea contenedores, publica puertos y configura el entorno de ejecución.
| Ejemplo | Aplicación | Capacidad que permite observar |
|---|---|---|
| 1 | DOOM | Ejecución de una aplicación completa desde un contenedor |
| 2 | code-server con Python | Ejecución de un entorno de desarrollo accesible desde el navegador |
| 3 | JupyterLab | Ejecución de un entorno de análisis de datos con sus dependencias |
Lo que aprenderá
Sección titulada «Lo que aprenderá»Al finalizar podrá
- ejecutar aplicaciones empaquetadas en imágenes de Docker;
- acceder desde el navegador a servicios que se ejecutan dentro de contenedores;
- publicar puertos para comunicar el sistema anfitrión con un contenedor;
- configurar un contenedor mediante variables de entorno;
- identificar las imágenes descargadas y eliminarlas cuando ya no sean necesarias.
Antes de comenzar
Sección titulada «Antes de comenzar»Necesitará
- Docker Engine o Docker Desktop instalado y en ejecución;
- conexión a internet para descargar las imágenes;
- un navegador web.
Ejemplo 1 - Ejecutar DOOM
Sección titulada «Ejemplo 1 - Ejecutar DOOM»El primer ejemplo utiliza una versión de DOOM compilada para WebAssembly y distribuida mediante una imagen de Docker. El propósito es observar que un contenedor puede ejecutar una aplicación completa y exponerla mediante un servicio accesible desde el navegador.
Ejecutar el contenedor
Sección titulada «Ejecutar el contenedor»Abra una terminal y ejecute el siguiente comando.
docker run --rm -p 8000:8000 elliottking/doom-wasm:0.1.1Docker descargará la imagen si todavía no está disponible en su equipo y después iniciará el contenedor.
La opción --rm indica que el contenedor debe eliminarse automáticamente cuando termine su ejecución. La opción -p 8000:8000 publica el puerto 8000 del contenedor en el puerto 8000 del sistema anfitrión.
Acceder a la aplicación
Sección titulada «Acceder a la aplicación»Abra el navegador y visite la siguiente dirección.
http://localhost:8000Controles
Sección titulada «Controles»| Tecla o acción | Función |
|---|---|
↑ ↓ ← → |
Movimiento |
Click izquierdo |
Disparar |
Click derecho |
Abrir puertas |
Esc |
Menú o pausa |
Qué demuestra este ejemplo
Sección titulada «Qué demuestra este ejemplo»La aplicación se ejecuta dentro del contenedor, pero puede utilizarse desde el navegador del sistema anfitrión. La publicación de puertos establece la comunicación entre ambos entornos.
No fue necesario instalar DOOM directamente en el equipo. Docker utilizó la imagen como base para crear un entorno aislado con los componentes necesarios para ejecutar la aplicación.
Sugerencia. Para detener el contenedor, presione
Ctrl + Cen la terminal donde lo ejecutó.
Ejemplo 2 - Ejecutar un entorno de desarrollo con Python
Sección titulada «Ejemplo 2 - Ejecutar un entorno de desarrollo con Python»El segundo ejemplo utiliza code-server, una aplicación que proporciona un entorno de desarrollo accesible desde el navegador. El contenedor incorpora Python mediante un módulo adicional.
Este ejemplo permite observar cómo una imagen puede servir como base para un entorno de trabajo más completo y cómo las variables de entorno modifican la configuración de un contenedor.
Ejecutar el contenedor
Sección titulada «Ejecutar el contenedor»Ejecute el siguiente comando.
docker run --rm -p 8443:8443 \ -e PUID=1000 \ -e PGID=1000 \ -e PASSWORD=docker123 \ -e SUDO_PASSWORD=docker123 \ -e DOCKER_MODS=linuxserver/mods:code-server-python3 \ lscr.io/linuxserver/code-server:latestLas opciones -e definen variables de entorno que el contenedor utiliza durante su inicialización. En este caso se establecen identificadores de usuario, una contraseña y el módulo encargado de incorporar Python.
Nota. La primera ejecución puede tomar algunos minutos porque Docker debe descargar la imagen y preparar el módulo de Python.
Acceder al entorno
Sección titulada «Acceder al entorno»Abra el navegador y visite la siguiente dirección.
http://localhost:8443Utilice esta contraseña.
docker123Verificar Python
Sección titulada «Verificar Python»Abra la terminal integrada desde Terminal > New Terminal y compruebe que Python esté disponible.
python3 --versionCree después un archivo llamado hola.py.
print("¡Hola desde Docker!")
for i in range(1, 6): print(f"Iteración {i}")Ejecute el programa desde la terminal integrada.
python3 hola.pyQué demuestra este ejemplo
Sección titulada «Qué demuestra este ejemplo»El navegador actúa como interfaz para un entorno de desarrollo que se ejecuta dentro del contenedor. Python, la terminal Linux y los demás componentes pertenecen a ese entorno y no requieren una instalación equivalente en el sistema anfitrión.
El ejemplo también muestra que un mismo comando puede definir tanto la conectividad como parte de la configuración inicial del contenedor.
Sugerencia. Para detener el contenedor, presione
Ctrl + Cen la terminal donde lo ejecutó.
Ejemplo 3 - Ejecutar JupyterLab
Sección titulada «Ejemplo 3 - Ejecutar JupyterLab»El tercer ejemplo utiliza una imagen de Jupyter que incluye Python y un conjunto de bibliotecas para análisis de datos, computación científica y visualización.
El objetivo es observar cómo una imagen puede proporcionar un entorno de trabajo preparado para una tarea específica sin instalar cada dependencia de manera individual.
Ejecutar el contenedor
Sección titulada «Ejecutar el contenedor»Ejecute el siguiente comando.
docker run --rm -p 8888:8888 quay.io/jupyter/scipy-notebookDocker descargará la imagen si es necesario y después iniciará JupyterLab dentro del contenedor.
Acceder a JupyterLab
Sección titulada «Acceder a JupyterLab»Observe la salida de la terminal. Durante el inicio aparecerá una dirección similar a la siguiente.
http://127.0.0.1:8888/lab?token=abc123...Copie la dirección completa y ábrala en el navegador.
Importante. La dirección contiene un token de autenticación generado para esa ejecución. Incluya el parámetro
token=completo cuando abra JupyterLab.
Probar el entorno
Sección titulada «Probar el entorno»En JupyterLab, cree un notebook desde File > New > Notebook y seleccione el kernel de Python 3.
Escriba el siguiente código en una celda y ejecútelo con Shift + Enter.
import numpy as npimport pandas as pdimport matplotlib.pyplot as plt
datos = { "Mes": ["Ene", "Feb", "Mar", "Abr", "May"], "Ventas": [150, 200, 180, 220, 250],}
df = pd.DataFrame(datos)print(df)
plt.figure(figsize=(8, 4))plt.bar(df["Mes"], df["Ventas"], color="steelblue")plt.title("Ventas por mes")plt.ylabel("Ventas ($)")plt.show()La imagen utilizada incluye varias bibliotecas de uso frecuente.
| Biblioteca | Uso principal |
|---|---|
| NumPy | Computación numérica |
| Pandas | Análisis y manipulación de datos |
| Matplotlib | Visualización |
| SciPy | Computación científica |
| Seaborn | Visualización estadística |
Qué demuestra este ejemplo
Sección titulada «Qué demuestra este ejemplo»El contenedor proporciona Python, JupyterLab y las bibliotecas necesarias para ejecutar el notebook. El entorno queda definido por la imagen y puede reproducirse en otro equipo que disponga de Docker y pueda acceder a la misma imagen.
Este enfoque reduce la necesidad de configurar manualmente cada dependencia antes de comenzar a trabajar.
Sugerencia. Para detener el contenedor, presione
Ctrl + Cen la terminal. En algunos casos puede ser necesario hacerlo dos veces.
Limpiar las imágenes descargadas
Sección titulada «Limpiar las imágenes descargadas»Los tres ejemplos requieren descargar imágenes que permanecen almacenadas localmente después de detener los contenedores. Puede conservarlas para futuras ejecuciones o eliminarlas si desea recuperar espacio en disco.
Consultar las imágenes disponibles
Sección titulada «Consultar las imágenes disponibles»docker imagesEl comando muestra las imágenes almacenadas localmente.
Eliminar las imágenes utilizadas
Sección titulada «Eliminar las imágenes utilizadas»Si ya no necesita las imágenes de este laboratorio, puede eliminarlas con los siguientes comandos.
docker rmi elliottking/doom-wasmdocker rmi lscr.io/linuxserver/code-serverdocker rmi quay.io/jupyter/scipy-notebookEliminar imágenes que no estén en uso
Sección titulada «Eliminar imágenes que no estén en uso»Docker también puede eliminar de manera conjunta las imágenes que no estén asociadas con ningún contenedor.
docker image prune -aAdvertencia.
docker image prune -aafecta todas las imágenes que Docker considere sin uso. No se limita a las descargadas durante este laboratorio. Revise las imágenes almacenadas antes de ejecutar este comando en un entorno donde existan otros proyectos.
Lo que debe poder reconocer ahora
Sección titulada «Lo que debe poder reconocer ahora»Los tres ejemplos utilizan aplicaciones diferentes, pero comparten el mismo mecanismo básico. Docker parte de una imagen, crea un contenedor y ejecuta un proceso dentro de un entorno aislado.
Cuando la aplicación necesita recibir conexiones desde el sistema anfitrión, Docker publica uno o más puertos. Cuando necesita parámetros de configuración, estos pueden proporcionarse mediante opciones como las variables de entorno.
Después de completar el laboratorio debería poder reconocer estas relaciones en los comandos ejecutados.
- La imagen define el entorno disponible para crear el contenedor.
- El contenedor ejecuta la aplicación a partir de esa imagen.
- La opción
-ppublica un puerto para permitir acceso desde el sistema anfitrión. - La opción
-eproporciona valores de configuración mediante variables de entorno. - La opción
--rmelimina el contenedor cuando termina su ejecución.
Docker como mecanismo de distribución de entornos
Sección titulada «Docker como mecanismo de distribución de entornos»Estos ejemplos muestran una de las ventajas prácticas de los contenedores. Una aplicación puede distribuirse junto con buena parte del entorno que necesita para ejecutarse, en lugar de exigir que cada usuario reproduzca manualmente la misma instalación.
Esto no significa que cualquier aplicación pueda ejecutarse sin modificaciones dentro de Docker. La aplicación, sus dependencias y la plataforma de destino deben ser compatibles con el entorno proporcionado por el contenedor. Cuando esa condición se cumple, una imagen puede facilitar la reproducción del mismo entorno en diferentes equipos.
Referencias
Sección titulada «Referencias»| Recurso | Enlace |
|---|---|
| Docker Hub | hub.docker.com |
| Imagen DOOM | elliottking/doom-wasm |
| LinuxServer Code-Server | Documentación de Code-Server |
| Jupyter Docker Stacks | Repositorio de Jupyter Docker Stacks |