Laboratorio 03 - Gestión de contenedores y servicios con Docker
En los laboratorios anteriores ejecutó contenedores a partir de imágenes existentes. En este laboratorio avanzará hacia un flujo de trabajo más completo. Desplegará un servidor web Apache con contenido personalizado, ejecutará PostgreSQL con persistencia de datos y utilizará herramientas de Docker para inspeccionar, diagnosticar y limpiar los recursos creados.
El propósito es observar el ciclo de vida de un contenedor y relacionarlo con tres conceptos que aparecen de forma recurrente en Docker. La publicación de puertos permite acceder a servicios desde el sistema anfitrión, los montajes permiten separar datos y contenido del ciclo de vida del contenedor, y las herramientas de diagnóstico permiten comprender qué ocurre durante la ejecución.
Una imagen puede publicarse con diferentes tags. Cada tag identifica una variante o versión que puede tener diferencias en software, dependencias o sistema base.
Descargue primero la versión estándar de Apache HTTP Server.
Ventana de terminal
dockerpullhttpd:2.4
Descargue después la variante basada en Alpine Linux.
Ventana de terminal
dockerpullhttpd:2.4-alpine
Consulte las imágenes disponibles.
Ventana de terminal
dockerimageshttpd
Una salida aproximada puede verse así.
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd 2.4 f84fe51ff5d3 10 days ago 250MB
httpd 2.4-alpine c7b8040505e2 3 years ago 82.8MB
Nota
La variante Alpine ocupa menos espacio porque utiliza Alpine Linux como sistema base. En este laboratorio se utilizará httpd:2.4.
Apache escucha en el puerto 80 dentro del contenedor. Para acceder al servicio desde el sistema anfitrión, publique ese puerto mediante el puerto 8080.
Ventana de terminal
dockerrun-d--namemi-apache-p8080:80httpd:2.4
Las opciones utilizadas cumplen funciones diferentes.
Elemento
Función
-d
Ejecuta el contenedor en segundo plano
--name mi-apache
Asigna el nombre mi-apache al contenedor
-p 8080:80
Publica el puerto 80 del contenedor mediante el puerto 8080 del sistema anfitrión
httpd:2.4
Indica la imagen y el tag utilizados para crear el contenedor
Compruebe que el contenedor continúa en ejecución.
Ventana de terminal
dockerps
Abra después la siguiente dirección en el navegador.
El proceso de Apache se ejecuta dentro del contenedor y escucha en su puerto 80. La opción -p 8080:80 crea la publicación necesaria para que una conexión dirigida al puerto 8080 del sistema anfitrión llegue al servicio que escucha dentro del contenedor.
Hasta este punto Apache utiliza el contenido incluido en la imagen. El siguiente paso reemplaza ese contenido por archivos almacenados en el sistema anfitrión.
El ciclo de vida del contenido dejó de depender del sistema de archivos interno del contenedor. Los archivos permanecen en el sistema anfitrión y el contenedor los utiliza mediante el montaje.
Este patrón también permite modificar los archivos desde el host y observar los cambios inmediatamente desde la aplicación que se ejecuta en el contenedor.
Una base de datos requiere conservar información incluso cuando el contenedor que ejecuta el servidor se elimina. Para separar esos dos ciclos de vida utilizará un volumen nombrado.
Compruebe que existe e inspeccione su configuración.
Ventana de terminal
dockervolumels
dockervolumeinspectpgdata-laboratorio
En un volumen nombrado, Docker administra la ubicación donde se almacenan los datos. El contenedor utiliza el volumen mediante un nombre en lugar de depender de una ruta elegida directamente en el sistema anfitrión.
PostgreSQL utiliza variables de entorno durante la inicialización. En lugar de escribir las credenciales directamente en docker run, cree un archivo .env.
Ventana de terminal
cat>~/docker-laboratorio/.env<<'EOF'
POSTGRES_USER=estudiante
POSTGRES_PASSWORD=docker2025
POSTGRES_DB=universidad
EOF
Advertencia
En un proyecto real, un archivo .env con credenciales no debe incluirse en el repositorio de código. Inclúyalo en .gitignore cuando corresponda.
El contenedor utilizado inicialmente fue eliminado. Los datos sobrevivieron porque no dependían de su sistema de archivos efímero, sino del volumen pgdata-laboratorio.
La prueba separa dos ciclos de vida. El contenedor puede destruirse y recrearse, mientras que el volumen puede mantenerse y conectarse a una nueva instancia del servicio.
Hasta este momento utilizó Docker para crear y ejecutar servicios. Las siguientes herramientas permiten observar el estado de esos servicios durante la ejecución.
Los registros permiten observar la salida generada por el proceso principal del contenedor.
Consulte las últimas 20 líneas de Apache.
Ventana de terminal
dockerlogs--tail20mi-apache
Siga los nuevos registros en tiempo real.
Ventana de terminal
dockerlogs-fmi-apache
Mientras el comando permanece activo, abra http://localhost:8080 varias veces desde otra terminal o desde el navegador. Las solicitudes HTTP deberían aparecer en los registros.
Presione Ctrl + C para dejar de seguir la salida.
Para PostgreSQL puede solicitar además marcas de tiempo.
docker exec inicia un proceso adicional dentro de un contenedor que ya está en ejecución. Esto permite consultar archivos, ejecutar herramientas de diagnóstico o abrir una sesión interactiva sin detener el servicio principal.
La limpieza forma parte del ciclo de vida de los recursos creados durante las pruebas. En esta sección eliminará primero los contenedores y después los recursos que ya no necesitan conservarse.
Eliminar un volumen borra los datos almacenados en él. En un entorno real, asegúrese de contar con el respaldo necesario antes de eliminar un volumen que contenga información que deba conservarse.
Docker puede eliminar recursos que ya no están siendo utilizados.
Ventana de terminal
dockersystemprune
Para incluir volúmenes huérfanos puede utilizar
Ventana de terminal
dockersystemprune--volumes
Advertencia
docker system prune --volumes no se limita a los recursos de este laboratorio. Puede eliminar volúmenes huérfanos asociados con otros proyectos del mismo sistema. Revise el entorno antes de ejecutarlo.
El laboratorio original propone como alternativa crear un volumen nombrado.
Ventana de terminal
dockervolumecreateapache-content
Este comando crea el volumen, pero no sustituye por sí solo el montaje utilizado por Apache. Para utilizarlo sería necesario ejecutar el contenedor con una configuración que monte ese volumen en el directorio correspondiente.
Después de completar el laboratorio debería poder distinguir varias responsabilidades dentro de una ejecución de Docker.
Una imagen proporciona la base utilizada para crear un contenedor.
Un tag identifica una variante concreta de una imagen.
Un contenedor ejecuta uno o más procesos a partir de esa imagen.
La opción -p publica un puerto del contenedor mediante un puerto del sistema anfitrión.
Un bind mount conecta una ruta del sistema anfitrión con una ruta del contenedor.
Un volumen nombrado permite conservar datos fuera del ciclo de vida de un contenedor específico.
Un archivo utilizado con --env-file proporciona variables de entorno durante la creación del contenedor.
docker inspect permite consultar configuración y estado.
docker logs permite revisar la salida generada por el proceso del contenedor.
docker exec permite iniciar procesos adicionales dentro de un contenedor en ejecución.
Los ejemplos de Apache y PostgreSQL muestran que crear un contenedor es solo una parte del trabajo. Una ejecución útil también requiere decidir cómo exponer el servicio, dónde conservar los datos, cómo proporcionar configuración, cómo observar su comportamiento y qué recursos deben permanecer después de eliminar el contenedor.