Introdução
A TIDE abre dois ateliês de artistas aos visitantes durante um dia. Seu site oferece programação, orientações e um guia para download. O site City está publicado e a prévia de referência Riverside continua funcionando. O contêiner da prévia Courtyard desapareceu. Recupere esse local sem substituir os sites vizinhos nem as redes compartilhadas.
Você precisa de noções básicas de terminal e experiência com imagens, contêineres e portas publicadas do Docker. Terraform é apresentado aqui: configuração HCL, provedores, recursos, fontes de dados, planos e estado. As ferramentas e as imagens completas do site são fornecidas. Trata-se de Docker local em uma instância de treinamento, sem conta de nuvem nem programação de aplicação.
Use Live Studios, Reference Preview, Venue Preview e Workstation. Venue Preview fica indisponível até a recuperação. Este ambiente começa de forma independente. O exercício fixa Terraform 1.14.3 e o provedor comunitário kreuzwerker/docker 3.0.2. Um espelho local do provedor torna a inicialização do aluno independente do registro público.
Declarar a prévia e seu limite de propriedade
Nesta etapa, você usará o percurso normal do visitante e depois declarará apenas o contêiner ausente do local. Comece em Live Studios. A página inicial mostra LIVE PROGRAMME / City. Selecione Meet the two studios, leia as sessões Form & Field e Small Editions e selecione Find directions and the programme. Clique em Download the day programme e abra o texto baixado: ele deve conter City e os horários dos dois ateliês. Expanda Do I need to book?; a entrada é gratuita e não exige reserva.
Mude para Reference Preview. O mesmo percurso mostra REFERENCE PREVIEW / Riverside. Preserve esse contêiner: ele pertence a esta configuração Terraform e continua necessário. Venue Preview não conecta porque seu contêiner está ausente. Um servidor ausente difere de HTTP 404: um 404 vem de um servidor em execução que não encontra determinada página.
Ler a raiz e o estado
Mude para Workstation. Uma raiz Terraform é o diretório cujos arquivos .tf são avaliados juntos. Executar Terraform em outro diretório seleciona outra raiz; ele não procura automaticamente nos diretórios vizinhos. pwd imprime o caminho atual:
pwd
/home/labex/project/preview/courtyard
ls lista arquivos e cat exibe um arquivo de texto. Leia a configuração preparada:
ls
cat main.tf
Um arquivo .tf usa HCL, uma linguagem de configuração. Blocos agrupam ajustes entre chaves; name = value atribui um valor. Texto entre aspas é uma string, enquanto portas são números sem aspas. O bloco terraform fixa o programa principal e o provedor necessário. Um provedor traduz operações Terraform em requisições à API do Docker. provider "docker" {} usa o daemon Docker desta instância; não conecta a uma nuvem pública.
Os dois blocos data "docker_network" leem redes existentes. Uma fonte de dados consulta um objeto sem assumir a criação ou exclusão dele. city e venue são rótulos locais usados em referências. Nomes de rede identificam objetos Docker reais. Fontes de imagens também leem os IDs preparados. Usar um ID real evita tratar repetidamente uma tag e seu ID resolvido como imagens diferentes.
cat reference.tf
Um recurso declara um objeto gerenciado por esta raiz. docker_container.reference é um endereço Terraform formado pelo tipo de recurso e rótulo local. Seu nome Docker é tide-reference. O contêiner atende internamente na porta 80 e a publica na porta 8083 da instância. A expressão data.docker_image.reference.id lê o atributo id da fonte de imagem. Como é uma expressão, não usa aspas.
Mantenha main.tf e reference.tf intactos. As duas redes, todos os registros de imagens e o contêiner público estão fora da propriedade gerenciada por esta raiz. A raiz gerencia dois contêineres: a referência e a prévia ausente.
O estado relaciona endereços Terraform a IDs reais de objetos. O terraform.tfstate preparado lembra os dois contêineres, inclusive o desaparecido. Estado não é configuração nem backup do site. Não o edite nem o apague. Um plano posterior pergunta ao Docker o que realmente existe, em vez de confiar apenas no ID lembrado.
Escrever a declaração do recurso ausente
Crie preview.tf. Terraform o combina com os outros arquivos .tf desta raiz; o nome não cria um ambiente separado. cat > preview.tf substitui somente esse arquivo. O HCL entre aspas inicia um here-document: cole o bloco inteiro, inclusive o último HCL sozinho na linha. As aspas preservam o conteúdo literal.
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
Isso declara um contêiner da imagem completa Courtyard. O bloco aninhado ports publica HTTP; networks_advanced o conecta à rede existente do local. O serviço público usa 8081 e a referência 8083, então 8082 evita conflito. Uma referência à rede não a transforma em recurso gerenciado.
Inicialize esta raiz. init prepara o plugin do provedor; não cria infraestrutura:
terraform init
Espere Terraform has been successfully initialized!. O espelho local fornece a versão 3.0.2. .terraform contém o provedor inicializado e .terraform.lock.hcl registra a escolha e as somas de verificação. Preserve o arquivo de bloqueio com a configuração. terraform state list imprime os endereços lembrados:
terraform state list
A saída inclui docker_container.preview, docker_container.reference e as fontes de imagens e redes. O endereço da prévia na lista não prova que seu contêiner ainda existe.
fmt formata os espaços HCL; validate confere sintaxe e tipos dos argumentos do provedor. Nenhum prova que o site está funcionando:
terraform fmt
terraform validate
Espere Success! The configuration is valid.. Se houver erro de sintaxe, leia arquivo e linha, compare preview.tf com o bloco completo acima, corrija e repita fmt e validate. Não apague o estado nem reescreva a configuração compartilhada para eliminar um erro. Agora a declaração pode recriar o destino mantendo a referência intacta.
Revisar e aplicar uma recuperação precisa
Nesta etapa, você distinguirá estado lembrado de infraestrutura real, restaurará o percurso completo de Courtyard e confirmará que nada mais muda. Comece em Workstation, na mesma raiz.
Visualizar antes de mudar
terraform plan atualiza seu entendimento lendo Docker, compara a realidade com a declaração e propõe alterações. -out=recovery.tfplan salva a proposta em um plano binário para apply executar o plano revisado. Um plano salvo pode conter configuração sensível; este exercício não contém credenciais. Mantenha-o no diretório do projeto.
terraform plan -out=recovery.tfplan
Procure a atualização do ID lembrado da prévia e, depois:
## docker_container.preview will be created
...
Plan: 1 to add, 0 to change, 0 to destroy.
+ significa criar. ~ indicaria atualização no objeto existente; -, destruição; -/+, substituição. A prévia ausente precisa de uma criação. A referência não deve ter alterações propostas. Nenhuma rede deve ser criada, substituída ou destruída: são fontes de dados compartilhadas existentes, não recursos pertencentes a esta raiz.
Se aparecer destruição, substituição ou outro recurso, pare antes de aplicar. Confira pwd, preview.tf e alguma edição acidental em reference.tf. Corrija apenas seu erro com o exemplo fornecido e gere novo plano. Um nome de rede errado pode produzir network not found; compare com os blocos data, em vez de criar uma rede compartilhada substituta. Não remova contêineres por prefixo nem use terraform destroy como atalho de recuperação.
Executar o plano revisado
terraform apply recovery.tfplan executa as alterações salvas. Diferente de apply sem nome de plano, não solicita outro yes; salvar o plano não autoriza sua execução por si só. Revise antes deste comando:
terraform apply recovery.tfplan
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Se Terraform informar que o plano ficou obsoleto, outra operação mudou o estado após o planejamento. Gere e revise outro plano antes de aplicar. Se a porta 8082 estiver ocupada, inspecione o contêiner específico em conflito, em vez de apagar todos. Ela deve estar livre neste laboratório preparado; confira a porta externa e preserve 8081 e 8083.
Mude para Venue Preview. Recarregue após iniciar o contêiner. Deve aparecer VENUE PREVIEW / Courtyard. Siga Meet the two studios → Find directions and the programme → Download the day programme. Abra o download e confirme Courtyard e os horários das duas demonstrações. Páginas, estilos, ilustração e download completos vêm da imagem fornecida, não de uma nova página vazia de boas-vindas do Nginx.
Mude para Live Studios e Reference Preview. Os dois percursos originais devem funcionar, mostrando City e Riverside respectivamente. Nomes diferentes na página inicial não bastam para provar preservação: os objetos subjacentes devem continuar os mesmos.
Confirmar convergência e preservação
Volte a Workstation. Um segundo plano observa novamente a declaração atual e Docker real:
terraform plan
No changes. Your infrastructure matches the configuration.
Isso é convergência: os recursos desejados existem com seus ajustes declarados. Terraform não vigia e repara contêineres continuamente; uma pessoa ou automação deve executar o fluxo novamente após uma mudança posterior. A recuperação restaura infraestrutura substituível e conteúdo fornecido, não dados de usuários perdidos nem um host inteiro.
terraform state show exibe os atributos lembrados de um recurso. Compare seu id com o ID real do Docker. A opção Docker --format seleciona um campo; aspas simples preservam o modelo literal:
terraform state show docker_container.preview
docker inspect --format '{{.Id}}' tide-preview
Ambos devem identificar o mesmo contêiner novo. IDs variam; não copie um exemplo para o estado. Leia os vizinhos originais e as duas redes existentes sem alterá-los:
docker inspect --format '{{.Name}} {{.Id}} {{.State.StartedAt}}' tide-live tide-reference
docker network inspect --format '{{.Name}} {{.Id}}' tide-city tide-courtyard
O curso compara essas identidades com os valores originais. O contêiner público está fora desta raiz, enquanto a referência é um recurso gerenciado preservado deliberadamente nela. Os dois limites importam. Você recuperou uma prévia ausente e preservou os demais sites e a infraestrutura compartilhada.
Resumo
Você usou HCL e um provedor Docker fixado para declarar o contêiner ausente do local. As fontes de dados mantiveram redes e imagens compartilhadas fora da propriedade gerenciada por esta raiz. Comparou configuração, estado e objetos reais, aplicou uma criação revisada, conferiu o percurso completo e chegou a um plano sem alterações preservando os sites público e de referência.



