Restaurar una vista previa con un plan acotado

DockerIntermediate
Practicar Ahora

Introducción

TIDE abre dos estudios de artistas al público durante un día. Su sitio ofrece un programa, indicaciones y una guía descargable. El sitio City está publicado y la vista previa de referencia Riverside funciona. El contenedor de la vista previa Courtyard ha desaparecido. Recupera esa sede sin reemplazar los sitios vecinos ni las redes compartidas.

Necesitas conocimientos básicos de terminal y experiencia con imágenes, contenedores y puertos publicados de Docker. Aquí Terraform es nuevo: aprenderás configuración HCL, proveedores, recursos, fuentes de datos, planes y estado. Las herramientas y las imágenes completas del sitio están preparadas. Gestionarás Docker local en una instancia de formación; no necesitas una cuenta de nube ni programar la aplicación.

Usa Live Studios, Reference Preview, Venue Preview y Workstation. Venue Preview no estará disponible hasta recuperarla. Este entorno empieza de forma independiente. El ejercicio fija Terraform 1.14.3 y el proveedor comunitario kreuzwerker/docker 3.0.2. Un espejo local permite inicializar el proveedor sin depender del registro público durante el aprendizaje.

Declarar la vista previa y su límite de propiedad

En este paso usarás el recorrido normal del visitante y después declararás únicamente el contenedor de la sede ausente. Empieza en Live Studios. La portada muestra LIVE PROGRAMME / City. Selecciona Meet the two studios, lee las sesiones Form & Field y Small Editions y selecciona Find directions and the programme. Pulsa Download the day programme y abre el texto descargado: debe contener City y los horarios de ambos estudios. Despliega Do I need to book?; la entrada es gratuita y no requiere reserva.

Cambia a Reference Preview. El mismo recorrido muestra REFERENCE PREVIEW / Riverside. Conserva este contenedor: pertenece a esta configuración Terraform y sigue siendo necesario. Venue Preview no puede conectarse porque falta su contenedor. La ausencia del servidor difiere de HTTP 404: un 404 procede de un servidor en marcha que no encuentra una página concreta.

Leer la raíz y el estado

Cambia a Workstation. Una raíz Terraform es el directorio cuyos archivos .tf se evalúan juntos. Ejecutar Terraform en otro directorio selecciona otra raíz; no busca automáticamente en los directorios vecinos. pwd muestra tu ruta actual:

pwd
/home/labex/project/preview/courtyard

ls enumera los archivos y cat muestra un archivo de texto. Lee la configuración preparada:

ls
cat main.tf

Los archivos .tf usan HCL, un lenguaje de configuración. Los bloques agrupan ajustes entre llaves; name = value asigna un valor. El texto entre comillas es una cadena, mientras que los números de puerto son números sin comillas. El bloque terraform fija el programa principal y el proveedor requerido. Un proveedor es un complemento que traduce operaciones Terraform a peticiones de la API de Docker. provider "docker" {} usa el daemon Docker de esta instancia; no conecta con una nube pública.

Los dos bloques data "docker_network" leen redes existentes. Una fuente de datos consulta un objeto sin asumir su creación ni eliminación. city y venue son etiquetas locales para referencias. Los nombres de red identifican objetos Docker reales. Las fuentes de imágenes leen de igual modo los ID preparados. Usar un ID real evita tratar repetidamente la etiqueta y el ID resuelto como imágenes distintas.

cat reference.tf

Un recurso declara un objeto que esta raíz gestiona. docker_container.reference es una dirección Terraform que combina el tipo y la etiqueta local. Su nombre Docker es tide-reference. El contenedor sirve internamente en el puerto 80 y lo publica en el 8083 de la instancia. La expresión data.docker_image.reference.id lee el atributo id de la fuente de imagen. Al ser una expresión, no lleva comillas.

No cambies main.tf ni reference.tf. Las dos redes, todos los registros de imágenes y el contenedor público quedan fuera de la propiedad gestionada por esta raíz. La raíz gestiona dos contenedores: la referencia y la vista previa ausente.

El estado relaciona direcciones Terraform con ID de objetos reales. El archivo preparado terraform.tfstate recuerda ambos contenedores, incluido el desaparecido. El estado no es la configuración ni una copia de seguridad del sitio. No lo edites ni lo borres. Un plan posterior pregunta a Docker qué existe realmente en lugar de confiar solo en el ID recordado.

Escribir la declaración del recurso ausente

Crea preview.tf. Terraform lo combina con los demás archivos .tf de esta raíz; su nombre no crea un entorno independiente. cat > preview.tf reemplaza solo ese archivo. El delimitador entre comillas HCL inicia un here-document: pega el bloque completo, incluido el HCL final en su propia línea. Las comillas conservan literalmente el contenido.

cat > preview.tf <<'HCL'
resource "docker_container" "preview" {
  name  = "tide-preview"
  image = data.docker_image.site.id
  ports {
    internal = 80
    external = 8082
  }
  networks_advanced {
    name = data.docker_network.venue.name
  }
}
HCL

Esto declara un contenedor de la imagen completa Courtyard. El bloque anidado ports publica HTTP; networks_advanced lo conecta con la red existente de la sede. El servicio público usa 8081 y la referencia 8083, por lo que 8082 evita una colisión. Una referencia a una red no la convierte en recurso gestionado.

Inicializa esta raíz. init prepara el complemento del proveedor; no crea infraestructura:

terraform init

Espera Terraform has been successfully initialized!. El espejo local proporciona la versión 3.0.2. .terraform contiene el proveedor inicializado y .terraform.lock.hcl registra la elección y sus sumas de comprobación. Conserva el archivo de bloqueo con la configuración. terraform state list enumera las direcciones recordadas:

terraform state list

La salida incluye docker_container.preview y docker_container.reference, además de las fuentes de imágenes y redes. Que aparezca la dirección de la vista previa no demuestra que exista su contenedor.

fmt formatea los espacios de HCL; validate comprueba sintaxis y tipos de argumentos del proveedor. Ninguno demuestra que el sitio esté funcionando:

terraform fmt
terraform validate

Espera Success! The configuration is valid.. Si hay un error de sintaxis, lee el archivo y la línea, compara preview.tf con el bloque completo anterior, corrígelo y repite fmt y validate. No borres el estado ni reescribas la configuración compartida para eliminar el error. Ahora tienes una declaración capaz de recrear el destino conservando la referencia.

Revisar y aplicar una recuperación precisa

En este paso distinguirás el estado recordado de la infraestructura real, restaurarás el recorrido completo de Courtyard y confirmarás que nada más cambia. Empieza en Workstation, dentro de la misma raíz.

Previsualizar antes de cambiar

terraform plan actualiza su información leyendo Docker, compara la realidad con la declaración y propone cambios. -out=recovery.tfplan guarda la propuesta en un plan binario para ejecutar después lo revisado. Un plan guardado puede contener ajustes sensibles; este ejercicio no contiene credenciales. Déjalo en el directorio del proyecto.

terraform plan -out=recovery.tfplan

Busca la actualización del ID recordado de la vista previa y después:

## docker_container.preview will be created
...
Plan: 1 to add, 0 to change, 0 to destroy.

El + indica creación. ~ indicaría actualización en el sitio; -, destrucción; -/+, reemplazo. La vista previa ausente requiere una sola creación. La referencia no debe tener cambios propuestos. Ninguna red debe crearse, reemplazarse o destruirse: son fuentes de datos compartidas existentes, no recursos propios de esta raíz.

Si ves destrucción, reemplazo u otro recurso, detente antes de aplicar. Comprueba pwd, preview.tf y si editaste accidentalmente reference.tf. Corrige solo el error con el ejemplo proporcionado y genera otro plan. Un nombre de red incorrecto puede producir network not found; compáralo con los bloques data en vez de crear una red compartida sustituta. No borres contenedores por prefijo ni uses terraform destroy como atajo.

Ejecutar el plan revisado

terraform apply recovery.tfplan ejecuta los cambios guardados. A diferencia de apply sin nombre de plan, no pide otro yes; guardar el plan no autoriza por sí solo su ejecución, así que revísalo antes de este comando:

terraform apply recovery.tfplan
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Si Terraform indica que el plan está obsoleto, otra operación cambió el estado después de planificar. Genera y revisa un plan nuevo antes de aplicarlo. Si el puerto 8082 está ocupado, inspecciona el contenedor concreto que compite en lugar de borrar todos los contenedores. En este laboratorio preparado debe estar libre; revisa el puerto externo configurado y conserva 8081 y 8083.

Cambia a Venue Preview. Recarga cuando arranque el contenedor. Debe mostrar VENUE PREVIEW / Courtyard. Sigue Meet the two studios → Find directions and the programme → Download the day programme. Abre la descarga y confirma Courtyard y los horarios de ambas demostraciones. Las páginas, estilos, ilustración y descarga completos proceden de la imagen proporcionada, no de una página vacía de bienvenida de Nginx.

Cambia a Live Studios y Reference Preview. Los recorridos originales deben funcionar y mostrar City y Riverside respectivamente. Los nombres distintos en la portada no bastan para demostrar conservación: los objetos subyacentes deben seguir siendo los originales.

Confirmar convergencia y conservación

Vuelve a Workstation. Otro plan observa de nuevo la declaración actual y Docker:

terraform plan
No changes. Your infrastructure matches the configuration.

Esto es convergencia: los recursos deseados existen con sus ajustes declarados. Terraform no vigila y repara contenedores continuamente; una persona o automatización debe ejecutar de nuevo el flujo tras otro cambio. Esta recuperación restaura infraestructura reemplazable y contenido suministrado, no datos de usuarios perdidos ni un host completo.

terraform state show muestra los atributos recordados de un recurso. Compara su id con el ID real de Docker. La opción Docker --format elige un campo; las comillas simples conservan literalmente la plantilla:

terraform state show docker_container.preview
docker inspect --format '{{.Id}}' tide-preview

Ambos deben identificar el mismo contenedor nuevo. El ID puede variar; no copies un ID de ejemplo al estado. Lee los vecinos originales y las dos redes existentes sin modificarlos:

docker inspect --format '{{.Name}} {{.Id}} {{.State.StartedAt}}' tide-live tide-reference
docker network inspect --format '{{.Name}} {{.Id}}' tide-city tide-courtyard

El curso compara estas identidades con las originales. El contenedor público queda fuera de esta raíz, mientras la referencia es un recurso gestionado que se conserva deliberadamente. Ambos límites importan. Has recuperado una vista previa ausente conservando los demás sitios y la infraestructura compartida.

Resumen

Usaste HCL y un proveedor Docker fijado para declarar el contenedor de la sede ausente. Las fuentes de datos mantuvieron redes e imágenes compartidas fuera de la propiedad gestionada por esta raíz. Comparaste configuración, estado y objetos reales, aplicaste una creación revisada, comprobaste el recorrido completo y obtuviste un plan sin cambios conservando los sitios público y de referencia.