Sistemas · SYS-L-101 · Laboratorio · EC
Seguir una petición desde curl hasta el proceso y el log
Un servicio HTTP mínimo responde dentro de un contenedor. Debes seguir una petición real desde el cliente hasta el socket en escucha, el proceso que la atiende y el evento que deja en el log.
Contenido de la actividad
EC · Contenedor desechable ejecutado con Podman rootless, Docker rootless o Docker Desktop.
Capacidad
Observar una misma operación desde varias interfaces y construir una explicación causal sin modificar el host ni confundir aislamiento con una máquina virtual.
Enunciado
Arranca el servicio preparado, formula una predicción, ejecuta una petición correlacionada y reúne tres observaciones independientes que permitan reconstruir el recorrido y sus límites.
Estado inicial
- Paquete autocontenido con Containerfile, servicio Python y launcher de alcance validado.
- El runtime asigna un puerto efímero ligado a 127.0.0.1; no se abre una interfaz externa.
- El servicio expone /health y /trace, y registra eventos estructurados en stdout.
- No hay un fallo oculto: el objetivo es aprender a relacionar vistas del mismo estado.
Límites del sandbox
- Extrae el paquete en un directorio creado para el intento, nunca dentro de este repositorio.
- Ejecuta el launcher como usuario normal y no antepongas sudo.
- El launcher rechaza Docker Engine rootful; acepta Podman rootless, Docker rootless o Docker Desktop.
- No publiques el endpoint, no cambies el bind de loopback y no uses credenciales reales.
- La limpieza valida etiquetas y nombres exactos antes de retirar el contenedor o la imagen.
Fases de trabajo
1. Preparar un intento aislado
Separar el sistema objetivo del portfolio y obtener un estado reiniciable.
- Descarga el paquete y colócalo en un directorio desde el que puedas extraerlo.
- Crea un directorio temporal nuevo y entra en la carpeta extraída.
- Ejecuta el diagnóstico antes de construir o iniciar recursos.
attempt_dir="$(mktemp -d -t sys-l-101.XXXXXX)"
tar -xzf sys-l-101-lab.tar.gz -C "$attempt_dir"
cd "$attempt_dir/sys-l-101"
./lab doctor2. Predecir y arrancar
Declarar el recorrido esperado antes de mirar todas las salidas.
- Dibuja una primera predicción con host, runtime, puerto publicado, contenedor, socket, proceso y aplicación.
- Inicia el intento y conserva el ID, el runtime y el endpoint que muestra el launcher.
- Comprueba el estado sin interpretar todavía que «en ejecución» equivale a servicio sano.
./lab start
./lab status
./lab endpoint3. Correlacionar cliente, socket, proceso y log
Observar la misma operación mediante interfaces diferentes.
- Asigna un ID a la petición y conserva el verbose de curl.
- Observa el socket dentro del contenedor y registra dirección, puerto y estado.
- Observa el árbol o la tabla de procesos y relaciona el PID con el programa.
- Consulta los logs del runtime y localiza el evento con el mismo ID de petición.
- Para cada salida escribe qué confirma y qué sigue sin demostrar.
endpoint="$(./lab endpoint)"
request_id="manual-$(date +%s)"
curl --verbose --header "X-Request-ID: $request_id" "$endpoint/trace"
./lab exec ss -ltnp
./lab exec ps -eo pid,ppid,user,stat,args
./lab logs4. Reiniciar y retirar
Demostrar que el estado es desechable y que la limpieza tiene alcance exacto.
- Registra el identificador actual del contenedor.
- Reinicia el intento y comprueba qué estado cambió y cuál se conservó.
- Destruye los recursos del intento y confirma que el launcher ya no encuentra el contenedor.
./lab reset
./lab status
./lab destroy
./lab statusEvidencia que debes conservar
- Expediente completado con objetivo, estado inicial e identificador del intento.
- Predicción inicial y mapa corregido del recorrido.
- Tres fragmentos mínimos de salida: socket, proceso y log, además del verbose relevante de curl.
- Interpretación de cada fragmento y una afirmación que todavía no permite sostener.
- Evidencia del reset o destroy y conclusión final.
Criterios de aceptación
- El paquete se extrae en un directorio temporal fuera del checkout del portfolio y se ejecuta sin sudo.
- El puerto se publica únicamente en loopback y el contenedor descarta capacidades, usa filesystem de solo lectura y limita recursos.
- La misma petición se identifica de forma inequívoca en la salida del cliente y en el log del servicio.
- Las observaciones de socket, proceso y log se interpretan por separado, sin afirmar que una sola demuestra la salud completa.
- El mapa diferencia el proceso del host, el runtime, el espacio de red del contenedor y la aplicación.
- El reinicio o la destrucción actúan solo sobre los recursos etiquetados con el ID del intento.
Decisiones abiertas
- Usar Podman rootless, Docker rootless o Docker Desktop según el entorno disponible.
- Representar el mapa como diagrama, tabla o texto estructurado.
- Elegir /proc como observación adicional del proceso, sin sustituir las tres evidencias mínimas.
Materiales
- Paquete de laboratorio SYS-L-101Containerfile, servicio y launcher para un intento desechable; no contiene una solución.
- Plantilla de expediente SYS-L-101Registro para predicción, comandos, salida mínima, interpretación, reset y conclusión.
- README del paqueteRequisitos, límites de seguridad y referencia de comandos del launcher.
Se guarda solo en este navegador. Puedes descargarlo para enviarlo a Codex junto con los materiales que hayas completado.
Sin borrador guardado.
Revisión y reinicio
Revisión: Codex debe comparar la evidencia con estos criterios, señalar primero el supuesto no demostrado y proponer una sola comprobación siguiente. No hay una solución oficial publicada.
Reinicio: Ejecutar ./lab reset para recrear únicamente el contenedor del intento o ./lab destroy para retirar su contenedor e imagen etiquetados.
Pistas graduadas
Pista 1 · Conserva un identificador común
- La cabecera X-Request-ID permite localizar la misma petición en dos perspectivas.
- No pegues todo el log: conserva el evento mínimo que comparte ese identificador.
Pista 2 · Pregunta quién posee cada vista
- curl observa como cliente; ss consulta sockets; ps o /proc muestran procesos; el runtime conserva stdout.
- Que dos herramientas muestren información relacionada no significa que consulten la misma interfaz.
Pista 3 · Distingue publicación y escucha
- El puerto del host y el puerto dentro del contenedor pueden ser distintos.
- Anota en qué espacio de red existe cada dirección antes de unirlas en el mapa.