Введение
На предыдущем занятии мы подготовили кухню — установили Terraform. Теперь пора составить меню.
В Terraform обычно не нужно вручную описывать каждый низкоуровневый шаг. Вместо этого вы описываете требуемые объекты инфраструктуры. Каждый объект, которым управляет Terraform, представлен как ресурс.
Ресурсы — основные единицы управления Terraform. Они связывают код в файлах .tf с реальными объектами целевой платформы.
Представьте, что вы заказываете еду в ресторане. Вы не говорите повару: «Нарежьте лук, обжарьте его, взбейте два яйца…» — вы просто говорите: «Я хочу омлет». Terraform выступает в роли официанта: принимает ваш заказ (конфигурацию) и следит, чтобы кухня (Docker) приготовила именно то, что вы попросили.
Это основной рабочий процесс Terraform: определить ресурсы, предварительно просмотреть предлагаемые изменения, а затем применить их.
Определите образ
Начнём с указания необходимых ингредиентов. В мире Docker перед запуском контейнера нужен образ — своего рода замороженный пакет программного обеспечения.
Сначала перейдите в папку проекта и создайте файл заказа main.tf.
cd ~/project
touch main.tf
Откройте main.tf в текстовом редакторе nano.
nano main.tf
Сначала нужно сообщить Terraform, кто будет выполнять работу, то есть указать провайдер. Скопируйте стандартный блок в начало файла, чтобы настроить провайдер Docker:
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "~> 3.0.1"
}
}
}
provider "docker" {}
Теперь добавьте первый заказ — образ Nginx. Добавьте этот код в main.tf ниже блока провайдера. Для перемещения вниз используйте клавиши со стрелками:
resource "docker_image" "nginx" {
name = "nginx:latest"
keep_locally = false
}
После вставки кода сохраните файл. Нажмите Ctrl + O, затем нажмите Enter для подтверждения и нажмите Ctrl + X, чтобы выйти из редактора.
Разберём эту конструкцию:
resource: это слово сообщает Terraform: «Я хочу заказать объект»."docker_image": это тип заказываемого объекта. При работе с AWS это, например, может бытьaws_instance."nginx": это имя, которое мы даём объекту в своей записной книжке, чтобы обращаться к нему позже. В реальном мире оно ничего не изменяет.name = "nginx:latest": это конкретный параметр, передаваемый Docker. Он точно указывает Docker, какой образ нужно скачать.
Теперь в вашем описании есть провайдер и инструкция для создания одного ресурса.
Определите контейнер
Образ хранится на диске, а контейнер — это запущенное приложение. Это примерно как разница между рецептом и готовым блюдом на тарелке.
Теперь добавьте второй ресурс в файл main.tf. Этот новый ресурс зависит от первого.
Снова откройте main.tf с помощью nano:
nano main.tf
С помощью клавиш со стрелками перейдите в конец файла и вставьте следующий блок:
resource "docker_container" "web" {
image = docker_image.nginx.image_id
name = "tutorial"
ports {
internal = 80
external = 8000
}
}
Обратите внимание на строку image = docker_image.nginx.image_id.
Эта ссылка — не просто удобный способ записи. Она позволяет Terraform построить граф зависимостей и автоматически определить порядок создания ресурсов.
Вместо повторного указания "nginx:latest" мы ссылаемся на ресурс, определённый ранее (docker_image.nginx). Так Terraform получает указание: «Не создавай этот контейнер, пока не будет подготовлен образ». Так создаются зависимости.
Мы также добавили блок ports. Он создаёт доступ с вашего компьютера к контейнеру: порт 8000 на компьютере направляется на порт 80 внутри контейнера. Благодаря этому вы сможете открыть веб-сайт.
Инициализируйте проект и создайте план
Прежде чем разрешить Terraform вносить изменения, нужно инициализировать проект — скачать необходимые инструменты — и затем предварительно просмотреть план.
Сначала выполните init, чтобы установить плагины провайдера Docker:
terraform init
Представьте, что официант сразу принёс вам еду, не подтвердив заказ. Это было бы рискованно! В Terraform есть защитный механизм под названием Plan. Он сравнивает запрошенную вами конфигурацию с уже существующими объектами и вычисляет различия.
Выполните команду создания плана:
terraform plan
Внимательно изучите вывод. Рядом с ресурсами вы увидите зелёные знаки +. Они означают: «Этот ресурс будет создан».
Этап планирования — одна из самых важных защитных возможностей Terraform. Он позволяет проверить предлагаемые изменения до того, как будут изменены реальные объекты.
Полезный совет: всегда читайте план. Это последний шанс обнаружить ошибки до того, как они превратятся в реальную инфраструктуру.
Примените изменения
План выглядит правильно. Теперь скажите официанту: «Приступайте!»
Команда apply выполняет план.
terraform apply
Terraform действует очень осторожно. Он ещё раз покажет план и попросит окончательно подтвердить операцию. Для продолжения нужно ввести yes.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
После ввода yes и нажатия Enter Terraform подключится к Docker, скачает образ и запустит контейнер.
Проверим результат. С помощью стандартной команды Docker убедитесь, что контейнер запущен:
docker ps
Также можно проверить только что развёрнутый веб-сайт. Поскольку мы сопоставили порт 8000, обратитесь к нему с помощью curl:
curl localhost:8000
Если вы видите HTML-код с текстом «Welcome to nginx!», значит, вы успешно развернули свою первую инфраструктуру с помощью кода!
Итоги
Поздравляем! Вы завершили основной рабочий процесс Terraform.
В этой лабораторной работе вы научились:
- Определять ресурсы: указывать в
main.tf, что именно нужно создать — образы и контейнеры. - Использовать ссылки: связывать ресурсы между собой, например указывать контейнеру, какой образ использовать.
- Создавать план: предварительно просматривать «счёт» до подтверждения изменений.
- Применять изменения: создавать реальную инфраструктуру.
Этот цикл Write -> Plan -> Apply — именно так специалисты управляют масштабной облачной инфраструктурой. Вы сделали первый шаг к профессии DevOps-инженера.



