# ============================================================ # lab-00-vm — instantaneas, restauracion y ventana de dano # ------------------------------------------------------------ # Este laboratorio simula con contenedores lo que en una maquina # virtual harias con instantaneas: ensuciar un disco, guardar un # estado conocido, romperlo a proposito y volver atras. # # Se usan contenedores y no una VM real por una razon practica: # el curso tiene que poder verificarse en cualquier maquina con # Docker, sin pedir un hipervisor ni 20 GB de disco. Los conceptos # son los mismos y el mapeo esta escrito en LEEME.txt. # # Reglas que este compose respeta y que no se negocian: # - una sola red, con internal: true (sin salida a internet) # - CERO puertos publicados: nada de este laboratorio es # alcanzable desde la red local ni desde el propio host salvo # por "docker compose exec" # - todo lo que se ataca vive dentro de este mismo compose # # docker compose up -d levantar # docker compose ps ver que corre # docker compose down -v destruir, volumenes incluidos # ============================================================ name: lab-00-vm networks: # Equivalente conceptual a la "red solo-anfitrion" de un # hipervisor: las maquinas se ven entre ellas y no salen fuera. # internal: true hace que Docker no cree ruta de salida; sin esa # linea, una maquina que se rompe a proposito tendria internet. vm_interna: driver: bridge internal: true volumes: # El disco mutable de la maquina invitada. Es lo que se ensucia. disco_invitada: # El almacen de instantaneas: copias del disco en un momento # conocido. Vive aparte a proposito, para que se vea que una # instantanea guardada en el mismo disco que protege no es una # instantanea, es una ilusion. almacen_instantaneas: services: # --- la maquina invitada ---------------------------------- # Aqui es donde se rompe todo. Se da por perdida por diseno. invitada: image: alpine:3.20 container_name: lab00vm-invitada hostname: invitada working_dir: /disco volumes: - disco_invitada:/disco networks: - vm_interna command: - sh - -c - | mkdir -p /disco/estado if [ ! -f /disco/estado/marca.txt ]; then echo "estado=limpio" > /disco/estado/marca.txt echo "creado=$$(date -u +%Y-%m-%dT%H:%M:%SZ)" >> /disco/estado/marca.txt echo "hola desde la invitada" > /disco/estado/datos.txt fi sleep infinity restart: unless-stopped # --- gestor de instantaneas ------------------------------- # Monta el disco de la invitada Y el almacen. Es la unica pieza # con acceso a los dos, igual que en un hipervisor la gestion de # instantaneas vive fuera del sistema operativo invitado. instantaneas: image: alpine:3.20 container_name: lab00vm-instantaneas hostname: instantaneas working_dir: /instantaneas volumes: - disco_invitada:/disco - almacen_instantaneas:/instantaneas networks: - vm_interna command: ["sh", "-c", "sleep infinity"] restart: unless-stopped # --- puesto de trabajo ------------------------------------ # Desde aqui se observa la invitada por la red interna. No monta # el disco: solo ve lo que la invitada expone, como tu ves una VM # desde el anfitrion sin tocar su sistema de archivos. consola: image: alpine:3.20 container_name: lab00vm-consola hostname: consola networks: - vm_interna command: - sh - -c - | apk add --no-cache curl bind-tools >/dev/null 2>&1 || true sleep infinity restart: unless-stopped