Введение
TIDE открывает две мастерские художников для посетителей на один день. На сайте есть программа, маршрут и загружаемый путеводитель. Основной сайт City и эталонный предпросмотр Riverside работают. Контейнер предпросмотра Courtyard исчез. Восстановите эту площадку, не заменяя соседние сайты и общие сети.
Нужны основы терминала и опыт работы с образами, контейнерами и опубликованными портами Docker. Terraform изучается здесь: конфигурация HCL, провайдеры, ресурсы, источники данных, планы и состояние. Инструменты и полные образы сайта предоставлены. Это локальный Docker на одном учебном инстансе, без облачного аккаунта и программирования приложения.
Используйте Live Studios, Reference Preview, Venue Preview и Workstation. Venue Preview недоступен до восстановления. Среда начинается независимо. Зафиксированы Terraform 1.14.3 и общественный провайдер kreuzwerker/docker 3.0.2. Локальное зеркало провайдера позволяет инициализировать проект без зависимости от публичного реестра во время обучения.
Объявить предпросмотр и границы владения
На этом шаге вы пройдёте обычный путь посетителя, а затем объявите только отсутствующий контейнер площадки. Начните в Live Studios. Главная страница показывает LIVE PROGRAMME / City. Выберите Meet the two studios, прочитайте о Form & Field и Small Editions, затем выберите Find directions and the programme. Нажмите Download the day programme и откройте текст: он должен содержать City и расписания обеих мастерских. Разверните Do I need to book? — вход бесплатный, запись не нужна.
Перейдите в Reference Preview. Тот же путь показывает REFERENCE PREVIEW / Riverside. Сохраните этот контейнер: он принадлежит этой конфигурации Terraform и по-прежнему нужен. Venue Preview не подключается, потому что его контейнер отсутствует. Отсутствующий сервер отличается от HTTP 404: ответ 404 выдаёт работающий сервер, который не находит определённую страницу.
Прочитать корень и состояние
Перейдите в Workstation. Корень Terraform — каталог, чьи файлы .tf обрабатываются вместе. Запуск в другом каталоге выбирает другой корень, а не автоматически просматривает соседние каталоги. pwd выводит текущий путь:
pwd
/home/labex/project/preview/courtyard
ls перечисляет файлы, cat показывает текстовый файл. Прочитайте подготовленную конфигурацию:
ls
cat main.tf
Файл .tf использует язык конфигурации HCL. Блоки объединяют параметры фигурными скобками; name = value присваивает значение. Текст в кавычках — строка, номера портов — числа без кавычек. Блок terraform фиксирует основную программу и требуемый провайдер. Провайдер переводит операции Terraform в запросы к API Docker. provider "docker" {} использует Docker daemon этого инстанса и не подключается к публичному облаку.
Два блока data "docker_network" читают существующие сети. Источник данных находит объект, но не получает права управления его созданием и удалением. city и venue — локальные метки для ссылок. Имена сетей обозначают реальные объекты Docker. Источники образов аналогично читают ID подготовленных образов. Настоящий ID позволяет не считать тег и разрешённый ID разными образами при каждом повторении.
cat reference.tf
Ресурс объявляет объект, которым управляет этот корень. docker_container.reference — адрес Terraform из типа ресурса и локальной метки. Его имя Docker — tide-reference. Контейнер обслуживает внутренний порт 80 и публикует его на порту инстанса 8083. Выражение data.docker_image.reference.id читает атрибут id источника образа. Это выражение, поэтому кавычки не нужны.
Оставьте main.tf и reference.tf неизменными. Обе сети, все записи образов и основной контейнер находятся вне управляемого владения этого корня. Корень управляет двумя контейнерами: эталоном и отсутствующим предпросмотром.
Состояние связывает адреса Terraform с ID реальных объектов. Подготовленный terraform.tfstate помнит оба контейнера, включая отсутствующий. Состояние — не конфигурация и не резервная копия сайта. Не редактируйте и не удаляйте его. Последующий план спрашивает Docker о реальных объектах, а не полагается только на записанный ID.
Записать декларацию отсутствующего ресурса
Создайте preview.tf. Terraform объединяет его с остальными .tf этого корня; имя файла не создаёт отдельную среду. cat > preview.tf заменяет только этот файл. Заключённый в кавычки HCL начинает here-document: вставьте весь блок, включая завершающий HCL на отдельной строке. Кавычки сохраняют буквальное содержимое.
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
Объявляется один контейнер из полного образа Courtyard. Вложенный блок ports публикует HTTP; networks_advanced подключает его к существующей сети площадки. Основной сайт использует 8081, эталон — 8083, поэтому 8082 избегает конфликта. Ссылка на сеть не превращает её в управляемый ресурс.
Инициализируйте корень. init подготавливает плагин провайдера, а не создаёт инфраструктуру:
terraform init
Ожидается Terraform has been successfully initialized!. Локальное зеркало предоставляет версию 3.0.2. .terraform содержит инициализированный провайдер, .terraform.lock.hcl записывает выбор и контрольные суммы. Храните файл блокировки с конфигурацией. terraform state list выводит запомненные адреса:
terraform state list
Вы увидите docker_container.preview, docker_container.reference и источники образов и сетей. Наличие адреса предпросмотра не доказывает, что его контейнер ещё существует.
fmt форматирует пробелы HCL; validate проверяет синтаксис и типы аргументов провайдера. Ни одна команда не доказывает работу сайта:
terraform fmt
terraform validate
Ожидается Success! The configuration is valid.. При синтаксической ошибке прочитайте имя файла и строку, сравните preview.tf с полным блоком выше, исправьте и повторите fmt и validate. Не удаляйте состояние и не переписывайте общую конфигурацию ради устранения ошибки. Теперь декларация может воссоздать цель, сохранив эталон.
Проверить и применить точное восстановление
На этом шаге вы отличите записанное состояние от реальной инфраструктуры, восстановите полный путь Courtyard и убедитесь, что остальное не меняется. Начните в Workstation в том же корне.
Посмотреть изменения заранее
terraform plan обновляет сведения, читая Docker, сравнивает реальность с декларацией и предлагает изменения. -out=recovery.tfplan сохраняет предложение в двоичный план, чтобы apply выполнил проверенный вариант. Сохранённый план может содержать конфиденциальную конфигурацию; в этом упражнении нет учётных данных. Оставьте файл в каталоге проекта.
terraform plan -out=recovery.tfplan
Найдите обновление записанного ID предпросмотра, а затем:
## docker_container.preview will be created
...
Plan: 1 to add, 0 to change, 0 to destroy.
+ означает создание. ~ означал бы изменение на месте, - — уничтожение, -/+ — замену. Отсутствующему предпросмотру нужно одно создание. Для эталона изменений быть не должно. Ни одну сеть нельзя создавать, заменять или уничтожать: это существующие общие источники данных, а не принадлежащие этому корню ресурсы.
Если видите уничтожение, замену или другой ресурс, остановитесь перед apply. Проверьте pwd, preview.tf и случайные правки reference.tf. Исправьте только свою ошибку по примеру и создайте новый план. Неверное имя сети может дать network not found; сравните его с блоками data, а не создавайте заменяющую общую сеть. Не удаляйте контейнеры по префиксу имени и не используйте terraform destroy как способ восстановления.
Выполнить проверенный план
terraform apply recovery.tfplan исполняет сохранённые изменения. В отличие от apply без имени плана, повторный yes не запрашивается. Само сохранение плана не означает разрешение выполнить его, поэтому сначала проверьте:
terraform apply recovery.tfplan
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Сообщение об устаревшем плане означает, что другая операция изменила состояние после планирования. Создайте и проверьте новый план перед применением. Если порт 8082 занят, исследуйте конкретный конфликтующий контейнер, а не удаляйте все. В подготовленной среде порт должен быть свободен; перепроверьте внешний порт и сохраните 8081 и 8083.
Перейдите в Venue Preview и обновите после запуска контейнера. Должно появиться VENUE PREVIEW / Courtyard. Пройдите Meet the two studios → Find directions and the programme → Download the day programme. Откройте загрузку и подтвердите Courtyard и время обеих демонстраций. Полные страницы, стили, иллюстрация и загрузка происходят из предоставленного образа, а не из новой пустой приветственной страницы Nginx.
Перейдите в Live Studios и Reference Preview. Оба исходных пути должны работать, показывая City и Riverside соответственно. Разных имён на главной странице недостаточно: базовые объекты должны оставаться теми же.
Подтвердить сходимость и сохранность
Вернитесь в Workstation. Второй план заново наблюдает текущую декларацию и реальный Docker:
terraform plan
No changes. Your infrastructure matches the configuration.
Это сходимость: нужные ресурсы существуют с объявленными параметрами. Terraform не следит за контейнерами и не чинит их непрерывно; после следующего изменения человек или автоматизация должны снова запустить процесс. Восстанавливаются заменяемая инфраструктура и предоставленное содержимое сайта, а не потерянные данные пользователей или весь хост.
terraform state show показывает записанные атрибуты одного ресурса. Сравните его id с реальным ID Docker. Параметр Docker --format выбирает поле; одинарные кавычки сохраняют шаблон буквально:
terraform state show docker_container.preview
docker inspect --format '{{.Id}}' tide-preview
Оба значения должны указывать на один новый контейнер. ID меняются; не копируйте пример в состояние. Прочитайте исходных соседей и обе существующие сети, не изменяя их:
docker inspect --format '{{.Name}} {{.Id}} {{.State.StartedAt}}' tide-live tide-reference
docker network inspect --format '{{.Name}} {{.Id}}' tide-city tide-courtyard
Курс сравнивает эти идентификаторы с исходными значениями. Основной контейнер вне этого корня, а эталон — намеренно сохранённый управляемый ресурс внутри. Обе границы важны. Вы восстановили отсутствующий предпросмотр и сохранили остальные сайты и общую инфраструктуру.
Резюме
Вы объявили отсутствующий контейнер площадки через HCL и фиксированный провайдер Docker. Источники данных оставили общие сети и образы вне управляемого владения этого корня. Вы сравнили конфигурацию, состояние и реальные объекты, применили одно проверенное создание, прошли весь путь посетителя и получили план без изменений, сохранив основной и эталонный сайты.



