Восстановление предпросмотра точным планом

DockerIntermediate
Практиковаться сейчас

Введение

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. Источники данных оставили общие сети и образы вне управляемого владения этого корня. Вы сравнили конфигурацию, состояние и реальные объекты, применили одно проверенное создание, прошли весь путь посетителя и получили план без изменений, сохранив основной и эталонный сайты.