Empaqueta y ejecuta el menú de la cafetería

DockerBeginner
Practicar Ahora

Introducción

LITTLE HOUR ya tiene un menú completo y su cafetería temporal del fin de semana necesita el mismo sitio. Una página de inicio no basta: los clientes necesitan detalles de las bebidas, precios, ilustraciones locales y horarios. Tu trabajo consiste en entregar toda esa experiencia dentro de una imagen de Docker.

Empaquetarás los archivos proporcionados, ejecutarás tu imagen y después iniciarás un contenedor nuevo para comprobar el sitio real. No escribirás código de aplicación ni instalarás Docker. Basta con conocer lo básico del terminal; Docker, las rutas, los puertos y los comandos se explican al utilizarlos. La cafetería, los productos, los precios y las direcciones son ficticios.

Usa Workstation para los comandos, Reference Menu para consultar el diseño, Your Menu para tu contenedor en ejecución y Topology para el mapa del entorno. Your Menu estará disponible cuando inicies el contenedor en el paso 2; antes puede no responder. Cada unidad comienza de forma independiente.

Construye una imagen del menú completo

En este paso entenderás qué necesita la cafetería y construirás una imagen con todo el sitio de los clientes. Empieza en Reference Menu.

Conoce la experiencia del cliente

La portada presenta LITTLE HOUR. En A few good favourites, abre Flat white. Los detalles muestran $4.00, la ración y los alérgenos. Sigue Find us para leer los horarios y selecciona LITTLE HOUR para volver al inicio. Estos enlaces e ilustraciones forman parte de la entrega; no son adornos opcionales.

Referencia del menú completo de LITTLE HOUR

La referencia está preparada en el puerto 8082. Seguirá disponible aunque detengas tu contenedor, así que no demuestra que hayas entregado el sitio.

Encuentra los archivos que debes entregar

Cambia a Workstation. Este terminal empieza en /home/labex/project/cafe-menu. pwd muestra el directorio actual; ls enumera su contenido:

pwd
/home/labex/project/cafe-menu
ls

Deberías encontrar menu, brand y notes. menu/ contiene las páginas para clientes; brand/, la hoja de estilos y las ilustraciones. notes/ es material del autor y no debe formar parte del menú público. Conserva los archivos proporcionados sin cambios.

Una dirección del sitio es una ruta URL. El servidor asigna /menu/flat-white.html a un archivo dentro de su directorio público. La carpeta de origen exterior menu/ contiene otro directorio menu/ para esas páginas de detalles. Inspecciona ambos grupos:

ls menu
ls brand

Las páginas incluyen index.html, visit.html, 404.html y el directorio de detalles. Los archivos de marca incluyen site.css y tres ilustraciones .svg. SVG es un formato de imagen. Las páginas esperan encontrar todos esos recursos bajo /assets/ en el sitio en ejecución.

Escribe la receta de empaquetado

Docker ejecuta programas en contenedores. Una imagen es el paquete guardado que se utiliza para crear un contenedor; un contenedor es una instancia de esa imagen, en ejecución o detenida. Docker ya está instalado. La imagen preparada menu-base:1 incluye Nginx, el servidor web, y su configuración para páginas inexistentes. Su directorio público es /usr/share/nginx/html/. Todavía no contiene tu menú.

Un Dockerfile describe cómo construir la imagen. FROM elige la imagen base. COPY copia archivos a la imagen: la primera ruta es un origen relativo al directorio de construcción y la segunda, un destino dentro de la imagen. Copiar el contenido de un directorio al destino correcto conserva los enlaces existentes. No conecta el contenedor en ejecución con tu directorio de origen.

Harás dos copias explícitas: las páginas al directorio público y los archivos de marca a su directorio assets/. Así se excluyen las notas del autor. La base de Nginx ya define el comando de inicio del servidor; no tienes que añadirlo.

cat > Dockerfile sustituye ese archivo por el texto siguiente. El DOCKERFILE entre comillas inicia un here-document: pega el bloque completo, incluido el último DOCKERFILE en su propia línea. Las comillas mantienen el contenido literal. Ejecuta lo siguiente en Workstation:

cat > Dockerfile <<'DOCKERFILE'
FROM menu-base:1
COPY menu/ /usr/share/nginx/html/
COPY brand/ /usr/share/nginx/html/assets/
DOCKERFILE

cat también puede mostrar un archivo. Lee la receta guardada y compara ambos destinos antes de construir:

cat Dockerfile

Construye la imagen guardada

docker build lee la receta y crea una imagen. -t le da un nombre y una etiqueta: little-hour-menu es el nombre y 1, nuestra etiqueta de versión. El punto final indica que el directorio actual es el contexto de construcción, los archivos que Docker puede utilizar. Una etiqueta es un nombre práctico, no una prueba de que el contenido esté completo.

docker build -t little-hour-menu:1 .

La salida depende de la versión de Docker. El comando debe terminar correctamente e identificar little-hour-menu:1. Si falla un COPY, revisa pwd, los nombres de origen y el Dockerfile guardado; corrige la receta y repite la construcción. No sustituyas las páginas ni copies todo el proyecto para ocultar un error de rutas.

Ya tienes una imagen de entrega guardada. Todavía no hay ningún contenedor del menú en ejecución.

Publica la imagen como menú en ejecución

En este paso crearás tu propio contenedor y abrirás su sitio. Empieza en Workstation.

Conecta el contenedor a un puerto web

Nginx escucha en el puerto 80 dentro del contenedor. Un puerto identifica un servicio de red. Lo publicaremos en el puerto 8081 de esta instancia para que lo alcance Your Menu. Esto no modifica el sitio de referencia del puerto 8082.

docker run crea e inicia un contenedor. -d lo ejecuta en segundo plano para poder seguir usando el terminal. --name cafe-menu le asigna un nombre para usarlo después. -p 8081:80 conecta el puerto 8081 del laboratorio con el 80 del contenedor. El último argumento selecciona la imagen construida. No se monta ningún directorio de origen ni volumen:

docker run -d --name cafe-menu -p 8081:80 little-hour-menu:1

La larga salida es el ID del nuevo contenedor y cambia entre ejecuciones. Tener un ID no demuestra que la aplicación siga funcionando. docker ps enumera los contenedores en ejecución:

docker ps

Busca cafe-menu, la imagen little-hour-menu:1 y una asignación que incluya 8081->80/tcp. Pueden aparecer otros contenedores de formación; no los modifiques.

Si el nombre ya está ocupado, no inicies muchas copias con nombres distintos. Usa docker ps para encontrar tu contenedor y continúa si es correcto. Si ha terminado o tiene una asignación incorrecta, docker logs cafe-menu muestra los mensajes del servidor. Para reemplazar únicamente tu contenedor de menú estático, docker rm -f cafe-menu lo detiene y elimina, conservando la imagen y los archivos de origen.

Después de corregir la receta o el puerto, vuelve a construir si hace falta y repite el comando docker run original. Usa la eliminación solo cuando sea necesario reemplazar el contenedor, no después de cada inicio correcto.

Abre tu propia entrega

Cambia a Your Menu. Si lo abriste antes de iniciar el contenedor, recárgalo. Deberías ver LITTLE HOUR con todo su diseño e ilustraciones. Esta página llega del puerto 8081, no del Reference Menu proporcionado.

Menú servido por el contenedor del estudiante

Abre Flat white en A few good favourites. Debe mostrar ilustración, precio, ración y alérgenos. Sigue Find us, confirma los horarios y selecciona LITTLE HOUR para volver al inicio dentro de la misma pestaña. Una portada de solo texto o una ilustración rota no constituyen una entrega completa.

Cambia a Topology. Ahora puede mostrar Menu homepage reachable. Es una observación limitada, no una aceptación de todas las páginas. A continuación comprobarás la independencia de la entrega y las demás rutas de los clientes.

Comprueba un contenedor nuevo y todo el sitio

En este paso iniciarás una instancia nueva de tu imagen y verificarás toda la experiencia sin depender del directorio del autor. Empieza en Workstation.

Distingue la imagen de su contenedor

La imagen sigue guardada cuando eliminas un contenedor. Este sitio no tiene formularios de clientes ni base de datos, por lo que reemplazar este contenedor no descarta datos comerciales. Esta diferencia sería importante en una aplicación con estado.

Elimina solo cafe-menu con el comando de reemplazo del paso 2:

docker rm -f cafe-menu

Inicia una instancia nueva con el mismo puerto publicado:

docker run -d --name cafe-menu -p 8081:80 little-hour-menu:1

Mostrará otro ID de contenedor. No has repetido la construcción ni montado el directorio del autor: la nueva instancia usa los archivos ya empaquetados en la imagen.

docker inspect muestra la configuración real de un contenedor. --format selecciona un campo en lugar de imprimir el objeto entero. La plantilla entre comillas convierte su lista de montajes en JSON:

docker inspect cafe-menu --format '{{json .Mounts}}'
[]

La lista vacía indica que no hay montajes de directorios del anfitrión ni volúmenes. Esa es la prueba que buscamos: los archivos de origen no completan silenciosamente una entrega incompleta. Los montajes tienen usos válidos en otros casos; esta tarea exige un menú estático autosuficiente.

Prueba las rutas reales de los clientes

Cambia a Your Menu y recarga. Selecciona los tres favoritos por turnos. Flat white cuesta $4.00, Espresso cuesta $3.00 e Iced oat latte, $4.75. Cada detalle debe mostrar la imagen e información correctas. Usa LITTLE HOUR para volver al inicio cada vez. Sigue Find us y confirma el horario entre semana 08:00–17:00. Permanece en Your Menu; Reference Menu comprueba otro servidor.

Detalle completo de una bebida en el menú entregado

Cambia a Workstation. HTTP es el protocolo de solicitudes y respuestas del navegador. Una respuesta correcta tiene estado 200; 404 significa que no se encontró el recurso. Un fallo de conexión es distinto: no se recibió una respuesta válida del servidor.

curl envía una solicitud. -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; no ejecutes estas solicitudes desde el terminal de tu ordenador.

curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8081/menu/flat-white.html

Debe mostrar 200. Las comprobaciones anteriores en el navegador también confirmaron el contenido y la ilustración; un 200 con otra página no bastaría.

Las notas del autor no deben ser públicas. Solicita su posible URL:

curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8081/notes/launch-notes.txt

Espera 404. Es el resultado correcto para el límite del empaquetado. Curl termina normalmente porque no le pedimos que fallara ante errores HTTP. Detener todo el sitio no cumpliría las comprobaciones del menú.

Vuelve a Your Menu y selecciona LITTLE HOUR para regresar al inicio. El menú normal debe seguir funcionando después de rechazar la solicitud de notas. Has comprobado el contenido completo y la respuesta apropiada ante algo que nunca formó parte de la entrega.

Resumen

Construiste una imagen completa del menú estático, publicaste el puerto del servidor e iniciaste un contenedor nuevo sin montajes del origen. Comprobaste páginas reales, imágenes e información de visita, dejando las notas del autor fuera del sitio público. El siguiente desafío independiente aplica estas decisiones a una panadería con otra estructura de archivos.