Introducción
Afterlight es una pequeña exposición comunitaria. Sus visitantes dejan sus impresiones en el libro de visitas; sustituir la aplicación no debe borrarlas. Primero probarás una copia desechable y después volverás a conectar los datos originales del libro real para conservar también mensajes nuevos durante una sustitución.
Basta con conocer lo básico del terminal. Docker, Compose, las rutas de datos, la edición y HTTP se explican cuando se necesitan. La aplicación y las herramientas están preparadas; no escribirás código de base de datos. Todos los visitantes son ficticios.
Usa Workstation para los comandos, Exhibition para el libro real y Practice Copy solo para el experimento deliberado de pérdida de datos. Los dos sitios utilizan contenedores y puertos diferentes. Cada unidad empieza de forma independiente; el sitio, sus etiquetas y la salida permanecen en inglés.
Da un hogar propio a los datos de visitantes
En este paso, probarás la exposición, observarás la pérdida de datos desechables y conectarás el libro real a sus registros existentes. Empieza en Practice Copy. Es una exposición separada y deliberadamente desechable, sin visitantes reales.
Prueba el recorrido normal de un visitante
Abre About the exhibition, lee el horario y selecciona The wall. Selecciona Leave a contribution, escribe Visitor en Your name y A small practice note. en Your message, y pulsa Add to the wall. La página de detalle muestra tu aportación. Selecciona Back to the wall para ver su tarjeta. Los detalles y el formulario son funciones normales que debes preservar.
Observa lo que un contenedor no conserva
Cambia a Workstation. Empieza en /home/labex/project/afterlight. Una ruta identifica un archivo o directorio; esta ruta absoluta comienza en la raíz / del sistema de archivos. pwd imprime el directorio actual:
pwd
Docker ejecuta la aplicación en un contenedor, un proceso con su propia vista del sistema de archivos. Una imagen es el paquete preparado de la aplicación. La imagen afterlight:1 contiene el programa y el diseño, pero no las aportaciones posteriores. Los datos escritos solamente en la capa modificable de un contenedor desaparecen al eliminarlo.
Elimina únicamente el contenedor de práctica desechable. docker rm lo elimina; -f lo detiene antes si hace falta:
docker rm -f afterlight-scratch
docker run crea otro contenedor desde la imagen guardada. -d lo deja en segundo plano y --name le asigna un nombre. Un puerto identifica un servicio de red: -p 8082:8081 reenvía el puerto 8082 del laboratorio al 8081 de la aplicación dentro del contenedor.
docker run -d --name afterlight-scratch -p 8082:8081 afterlight:1
El resultado largo es el ID del contenedor nuevo. Vuelve a Practice Copy, selecciona The wall y recarga. La tarjeta de práctica ha desaparecido. No sigas recargando su antigua URL de detalle: esa entrada ya no existe. Esta pérdida se limita a la copia desechable.
Conecta los datos existentes del libro
Cambia a Exhibition. Su muro vacío usa la misma aplicación, pero actualmente carece de la conexión a los datos. La entrada original de Iris está segura en un volumen Docker preparado llamado afterlight_messages. Tu tarea principal es reconectar esos datos y conservar futuras aportaciones al sustituir la aplicación.
Un volumen con nombre es almacenamiento administrado por Docker fuera de un contenedor concreto. Un montaje conecta ese almacenamiento a una ruta de la aplicación. Esta guarda su base SQLite en /data/wall.sqlite3. SQLite almacena registros en un archivo; aquí no necesitas SQL ni código de aplicación.
Cambia a Workstation. cat muestra un archivo:
cat compose.yaml
Compose lee esta configuración YAML para crear el servicio. YAML utiliza sangría con espacios para expresar la estructura. services agrupa aplicaciones y wall es este servicio. image, container_name y ports describen el paquete, su nombre y el mapeo de red. environment proporciona ajustes de la aplicación. RELEASE elige una edición visual; ambas usan el mismo formato de datos.
Añadirás un montaje y una declaración de volumen. messages:/data conecta el volumen lógico messages al directorio /data del contenedor; la declaración superior le da el nombre Docker existente afterlight_messages. external: true indica a Compose que reutilice el volumen preparado en lugar de crear otro. Un nombre incorrecto causa un error de volumen inexistente: corrige el nombre; no borres el original ni crees un sustituto vacío. Declarar almacenamiento sin conectarlo al servicio no protege los datos.
cat > compose.yaml reemplaza esta configuración. YAML entre comillas inicia un documento incrustado: pega todo el bloque, incluido el YAML final en su propia línea. Las comillas mantienen el contenido literal; conserva los espacios mostrados.
cat > compose.yaml <<'YAML'
name: afterlight
services:
wall:
image: afterlight:1
container_name: afterlight-wall
ports:
- "8081:8081"
environment:
MODE: guestbook
RELEASE: "1"
volumes:
- messages:/data
volumes:
messages:
name: afterlight_messages
external: true
YAML
docker compose config -q valida la configuración sin mensajes si es correcta. Sin salida significa que se pudo interpretar; un error indica que debes corregir la sangría o la escritura y volver a probar antes de aplicarla.
docker compose config -q
docker compose up -d crea o sustituye el servicio para ajustarlo al archivo, en segundo plano. Conserva los volúmenes con nombre. Espera a que termine:
docker compose up -d
En Exhibition, vuelve a The wall y recarga. Debe aparecer A beautiful place to pause. de Iris. Abre su tarjeta y vuelve. Es un registro existente reconectado desde su base real, no un ejemplo generado en cada inicio.
Escribe una aportación e identifica su almacenamiento
En este paso, añadirás una aportación real y relacionarás el resultado visible con el montaje efectivo. Empieza en Exhibition y conserva la tarjeta original de Iris.
Selecciona Leave a contribution. Escribe Mira en Your name y exactamente The light stays with us. en Your message. Pulsa Add to the wall. El detalle debe mostrar ambos valores. Selecciona Back to the wall; deben estar Iris y Mira.
Cambia a Workstation. docker inspect lee la configuración real del contenedor. --format selecciona un campo; las comillas simples mantienen las llaves literales. Esta plantilla muestra la lista de montajes como JSON:
docker inspect afterlight-wall --format '{{json .Mounts}}'
Busca "Type":"volume", "Name":"afterlight_messages", "Destination":"/data" y "RW":true. RW significa que permite lectura y escritura. Un nombre en un archivo solo expresa la intención; aquí ves la conexión real del contenedor en ejecución.
docker volume ls enumera los volúmenes disponibles:
docker volume ls
Puede haber otros volúmenes de la plataforma; no los modifiques. Si el nombre de un volumen externo está mal escrito, Compose se detiene con un error de volumen inexistente. Corrige el nombre del archivo y aplica de nuevo; no crees un sustituto vacío. Si conectas por error un volumen vacío nuevo, un muro vacío no demuestra que los datos originales se hayan borrado. Conserva el volumen original, restaura afterlight_messages en compose.yaml, valida y aplica de nuevo. No uses la eliminación de volúmenes como atajo. docker compose down -v elimina los volúmenes administrados por Compose y sus datos, pero deja intactos los declarados external: true. Eso no hace segura la eliminación manual de un volumen externo.
Considera cada clase de datos
Una entrada puede depender de varios directorios. Este libro guarda texto en /data. Un muro de fotos también almacena los bytes de las imágenes cargadas en /photos; su base conserva cada texto y el nombre del archivo asociado. Conservar solo el texto puede dejar una imagen rota.
| Ruta del contenedor | Contenido | ¿Conservar al sustituir? |
|---|---|---|
/data |
Registros y relaciones entre fotos y textos | Sí |
/photos en el muro de fotos |
Fotografías cargadas | Sí, por separado de la base |
/app |
Programa, diseño y muestras preparados en la imagen | Se recrean desde la imagen suministrada |
Varios directorios usan la misma sintaxis de montaje: una entrada en la lista del servicio y una declaración de volumen para cada uno. No montes un volumen vacío sobre /app, pues ocultaría el programa. Los archivos de caché o incluidos en la imagen no son automáticamente datos de visitantes.
El desafío independiente utiliza un formulario de fotos. Sus enlaces River y Garden descargan imágenes PNG de práctica a tu equipo. Guarda la imagen solicitada, selecciónala en Photograph (PNG), completa el nombre y el texto y pulsa Add to the wall. El navegador envía los bytes elegidos; no hace falta una herramienta de carga por terminal.
Sustituye la aplicación y mantén viva la exposición
En este paso, sustituirás la aplicación por la edición 2, conservarás las dos aportaciones y aceptarás otra. Empieza en Workstation.
nano es un editor de texto de terminal. Abre la configuración:
nano compose.yaml
Con las flechas, cambia solo RELEASE: "1" por RELEASE: "2". Conserva montajes, imagen y puertos. Guarda con Ctrl+O, Enter, y sal con Ctrl+X. Lee el archivo guardado y valídalo:
cat compose.yaml
docker compose config -q
docker compose ps -q wall imprime el ID actual. Recuérdalo o conserva la salida para compararlo; no se pide un informe:
docker compose ps -q wall
Aplica el cambio de edición. --force-recreate solicita un contenedor nuevo aunque el resto de la configuración no haya cambiado:
docker compose up -d --force-recreate
docker compose ps -q wall
El ID debe ser distinto. Es una sustitución, no un simple reinicio. Si falla el inicio, docker compose logs wall muestra los mensajes; corrige la configuración, valida y repite up -d. Conserva los volúmenes originales y no elimines otros contenedores.
En Exhibition, selecciona The wall y recarga. El pie debe mostrar Edition 2. Iris y Mira deben seguir ahí. Abre ambas tarjetas y vuelve. Escribe Leon y exactamente Back for another look. en el formulario y envíalo. Vuelve al muro: las tres aportaciones funcionan en la aplicación sustituta.
Comprueba el servicio además de los datos
Cambia a Workstation. HTTP es el protocolo de peticiones y respuestas del navegador. El estado 200 indica éxito; 404, que el recurso no se encontró. Un fallo de conexión significa que no llegó una respuesta del servidor.
curl envía una petición. -sS oculta el progreso pero muestra errores de conexión; -o /dev/null descarta el cuerpo. -w imprime el formato entre comillas: %{http_code} es el estado y \n termina la línea. En Workstation, 127.0.0.1 significa esta instancia y el puerto 8081 es Exhibition. Ejecuta:
curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8081/about
Espera 200. En Exhibition, abre About the exhibition, confirma el horario y vuelve con The wall. Un estado correcto por sí solo no demuestra contenido correcto ni aportaciones conservadas.
El volumen protege frente a esta sustitución de contenedor. No es una copia independiente ni protege frente a borrar el volumen o perder el host. Mantén reproducibles los archivos de la aplicación y guarda aparte los datos de visitantes.
Resumen
Distinguiste los archivos desechables del contenedor de los datos persistentes, conectaste el volumen existente y conservaste mensajes originales y nuevos durante una sustitución. Una nueva aportación y las páginas siguen funcionando. Ahora aplica el método a los textos y a fotografías almacenadas por separado.



