Ir al contenido

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

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.

Necesitará

  • Docker Engine o Docker Desktop instalado y en ejecución;
  • conexión a internet para descargar las imágenes;
  • un navegador web.

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.

Abra una terminal y ejecute el siguiente comando.

Ventana de terminal
docker run --rm -p 8000:8000 elliottking/doom-wasm:0.1.1

Docker 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.

Abra el navegador y visite la siguiente dirección.

http://localhost:8000
Tecla o acción Función
↑ ↓ ← → Movimiento
Click izquierdo Disparar
Click derecho Abrir puertas
Esc Menú o pausa

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 + C en 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.

Ejecute el siguiente comando.

Ventana de terminal
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:latest

Las 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.

Abra el navegador y visite la siguiente dirección.

http://localhost:8443

Utilice esta contraseña.

docker123

Abra la terminal integrada desde Terminal > New Terminal y compruebe que Python esté disponible.

Ventana de terminal
python3 --version

Cree 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.

Ventana de terminal
python3 hola.py

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 + C en la terminal donde lo ejecutó.

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.

Ejecute el siguiente comando.

Ventana de terminal
docker run --rm -p 8888:8888 quay.io/jupyter/scipy-notebook

Docker descargará la imagen si es necesario y después iniciará JupyterLab dentro del contenedor.

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.

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 np
import pandas as pd
import 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

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 + C en la terminal. En algunos casos puede ser necesario hacerlo dos veces.

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.

Ventana de terminal
docker images

El comando muestra las imágenes almacenadas localmente.

Si ya no necesita las imágenes de este laboratorio, puede eliminarlas con los siguientes comandos.

Ventana de terminal
docker rmi elliottking/doom-wasm
docker rmi lscr.io/linuxserver/code-server
docker rmi quay.io/jupyter/scipy-notebook

Docker también puede eliminar de manera conjunta las imágenes que no estén asociadas con ningún contenedor.

Ventana de terminal
docker image prune -a

Advertencia. docker image prune -a afecta 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.

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 -p publica un puerto para permitir acceso desde el sistema anfitrión.
  • La opción -e proporciona valores de configuración mediante variables de entorno.
  • La opción --rm elimina 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.

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