Docker — это инструмент для контейнеризации, а Terraform — для управления инфраструктурой. В этой статье рассказывается, как создать и развернуть образ Docker с помощью Terraform.

Контейнеризация произвела революцию в разработке программного обеспечения, позволив заключать приложения со всеми их зависимостями в переносимые автономные блоки. Это обеспечивает единообразное поведение в разных средах. Наряду с контейнеризацией используется концепция инфраструктура как код (IaC) — эффективный подход к управлению инфраструктурой с помощью кода. IaC упрощает предоставление и настройку инфраструктуры, исключая ручные процессы и позволяя управлять инфраструктурой непосредственно из среды разработки.
Лидерами в области этих технологий являются Docker для контейнеризации и Terraform и Ansible для управления инфраструктурой. Docker упрощает упаковку приложений и их зависимостей в переносимые, самодостаточные контейнеры. Эти контейнеры содержат всё, что необходимо для работы приложения, от кода до библиотек, обеспечивая согласованность в разных средах. Terraform и Ansible, с другой стороны, рассматривают инфраструктуру как код, позволяя определять желаемое состояние с помощью простых декларативных файлов конфигурации.
Другой не менее мощный современный метод разработки программного обеспечения, наряду с IaC,использующий Terraform, — это Kubernetes, который управляет контейнерами Docker. Но мы не будем рассматривать его в этой статье.
В этом руководстве вы узнаете, как создать и развернуть образ Docker с помощью Terraform.
Понимание Ansible и Terraform
Прежде чем мы обсудим развёртывание образов Docker с помощью Terraform, давайте разберёмся в различиях между Ansible и Terraform.
Ansible, известный своей бессерверной архитектурой и простотой, ориентирован на управление конфигурацией и развёртывание приложений. Он отлично подходит для:
- Автоматизация повторяющихся задач
- Организация сложных рабочих процессов
- Обеспечение согласованности между несколькими серверами
Terraform, с другой стороны, специализируется на подготовке инфраструктуры. Он позволяет определять инфраструктуру как код и управлять ею, абстрагируясь от сложностей взаимодействия с такими ресурсами, как серверы и хранилища у различных поставщиков облачных услуг.
Сильные стороны:
- Развертывание в нескольких средах
- Поддержка различных платформ
Подготовка окружающей среды
Прежде чем развертывать образы Docker с помощью Terraform, вам нужно будет установить необходимые инструменты на локальный компьютер.
Установка Docker
- Windows: Чтобы установить Docker на компьютер с Windows, ознакомьтесь с официальным руководством по установке для Windows. Убедитесь, что ваш компьютер соответствует всем системным требованиям (включая включение аппаратной виртуализации и функции WSL 2 или Hyper-V), и следуйте инструкциям для успешной установки программного обеспечения на ваш компьютер.
- MacOS: Независимо от того, используете ли вы Mac с процессором Intel или Apple, убедитесь, что вы работаете под управлением одной из трёх последних версий MacOS, а затем следуйте официальным инструкциям по установке Docker для macOS.
- Linux: Чтобы установить Docker на компьютер с Linux, убедитесь, что вы используете версию Ubuntu, Debian, RHEL или Fedora x86_64 или amd64, а затем установите Docker, как описано в руководстве по установке.
После установки убедитесь, что Docker работает правильно, открыв терминал и выполнив следующую команду:
$ docker --version
При успешной установке будет отображена информация о версии Docker.
Установка Terraform
Чтобы установить Terraform, перейдите на официальную страницу установки Terraform и установите программное обеспечение для своей операционной системы с помощью менеджера пакетов (macOS и Linux) или загрузив двоичный файл.
После загрузки извлеките исполняемый файл и добавьте путь к переменной среды (Windows). Убедитесь, что установка прошла успешно, выполнив следующую команду в командной строке:
$ terraform -help
Эта команда должна вывести список доступных команд Terraform, что свидетельствует об успешной установке.
Создание каталога проекта
Чтобы поддерживать порядок в процессе развертывания, создайте специальный каталог для нашего проекта под названием docker-terraform.
Создание образа Docker
Мы создадим образ Docker для приложения Python Flask. Затем мы развернём его с помощью Terraform. Если у вас уже есть свой готовый образ с вашим приложением, то можете пропустить эти разделы.
Настройте приложение Flask
Создайте исходный каталог: перейдите в каталог вашего проекта (docker-terraform) и создайте подкаталог с именем src для хранения кода вашего приложения:
$ cd docker-terraform
$ mkdir src
Создайте приложение Flask
В каталоге src создайте файл с именем app.py и добавьте следующий код Python для реализации базового приложения «Привет, мир!»:
from flask import Flask
app = Flask(__name__)
@app.route(code>’/’)
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
Создание файла Dockerfile
Файл Dockerfile служит основой для создания образа Docker. В нём указаны инструкции, которым будет следовать Docker при создании образа слой за слоем.
В основном каталоге проекта (docker-terraform) создайте файл с именем Dockerfile со следующим содержимым:
# Use the official Python base image
FROM python:3.11-slim
# Set the working directory in the container
WORKDIR /app
# Copy the dependencies file to the working directory
COPY requirements.txt .
# Install Flask and other dependencies
RUN pip install --no-cache-dir -r requirements.txt
# Copy the content of the local src directory to the working directory
COPY src/ .
# Specify the command to run on container start
CMD ["python", "app.py"]
Этот файл Dockerfile определяет следующие шаги:
- Загрузка официального Docker образа python:3.11-slim в качестве основы для нашего образа.
- Устанавливаем в качестве рабочего каталога внутри контейнера каталог /app.
- Копируем файл requirements.txt (описано ниже) в рабочий каталог.
- Устанавливаем Flask и другие зависимости, перечисленные в requirements.txt.
- Копируем всё содержимое каталога src (содержащего код вашего приложения) в рабочий каталог.
- Указываем команду запуска приложения Flask.
Создадим requirements.txt файл
Создайте файл с именем requirements.txt (в том же каталоге, что и Dockerfile) и добавьте следующую строку:
Flask==1.1.2
В этом файле перечислены зависимости Python, необходимые вашему приложению. Здесь указана версия Flask 1.1.2. При необходимости вы можете добавить дополнительные зависимости.
Создание Docker образа
Когда все файлы будут на своих местах, перейдите в каталог, содержащий Dockerfile (docker-terraform), и выполните следующую команду для создания образа Docker:
$ docker build -t pure_image:latest .
- сборка в docker: Эта команда инструктирует Docker создать образ.
- -t pure_image:latest: Это помечает изображение тегом pure_image и тегом latest. Вы можете изменить эти теги по своему усмотрению.
- .: Это указывает на текущий каталог, в котором находится Dockerfile.

Проверка сборки
После завершения процесса сборки используйте следующую команду, чтобы вывести список всех образов Docker в вашей системе и убедиться, что ваш недавно созданный образ присутствует:
$ docker images

Эта команда должна вывести список, включающий ваш образ под названием pure_image:latest.

Поздравляем! Вы успешно создали образ Docker, содержащий ваше приложение Flask. На следующих этапах мы будем использовать Terraform для развёртывания этого образа.
Введение в Terraform
Теперь, когда мы создали образы Docker, давайте рассмотрим Terraform — ведущий инструмент для инфраструктуры как кода (IaC). IaC заменяет ручную настройку инфраструктуры кодом, позволяя управлять инфраструктурой как любой другой частью программного проекта. Использование Terraform позволяет:
- Декларативная конфигурация: опишите желаемое состояние инфраструктуры, а Terraform позаботится о деталях подготовки.
- Широкая поддержка провайдеров: Terraform интегрируется с различными поставщиками облачных услуг (AWS, Azure, Google Cloud) и платформами инфраструктуры.
- Планируйте и применяйте рабочий процесс: просматривайте предлагаемые изменения (планируйте) перед их применением (применяйте).
- Управление состоянием: отслеживайте текущее состояние инфраструктуры и обеспечивайте согласованность с помощью файла состояния Terraform.
Написание конфигурации Terraform
Подготовив среду, написав код приложения и создав образ Docker, мы готовы использовать Terraform для автоматизации развёртывания вашего образа Docker.
1. В вашем каталоге docker-terraform создайте новый файл с именем main.tf. Этот файл будет содержать код конфигурации Terraform для развертывания вашего образа Docker.
2. Укажите поставщика Docker:
# Specifying Docker provider
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "3.0.2"
}
}
}
Этот блок указывает Terraform использовать поставщика Docker из источника «kreuzwerker/docker» версии 3.0.2. Этот поставщик позволяет Terraform взаимодействовать с Docker для управления развёртыванием контейнеров.
3. Определение источника данных образа Docker:
data "docker_image" "local_image" {
name = "pure_image"
}
В этом разделе определяется источник данных с именем local_image типа docker_image. Источники данных получают информацию из внешних источников. Здесь он получает сведения об образе Docker с именем «pure_image», который предположительно присутствует локально на вашем хосте Docker.
4. Определите ресурс контейнера Docker
Ядро конфигурации определяет сам контейнер Docker с помощью ресурса docker_container:
resource "docker_container" "pure_app" { name = "pure_app"
image = data.docker_image.local_image.name # Uses output from data source
# Expose port 5000 for Flask app
ports {
internal = 5000
external = 5000
}
}
Этот блок определяет ресурс типа docker_container с именем «pure_app». Атрибут image ссылается на имя образа Docker, полученного из источника данных local_image. Это гарантирует, что ваш контейнер будет использовать локально доступный образ с именем «pure_image». Кроме того, блок портов сопоставляет порт 5000 (на котором, скорее всего, работает ваше приложение Flask) с портом 5000 на вашем локальном компьютере, обеспечивая внешний доступ.
5. Ожидание готовности контейнера
Это необязательный шаг, позволяющий убедиться, что контейнер готов, прежде чем продолжить:
resource "null_resource" "wait_for_container" {
depends_on = [docker_container.pure_app]
provisioner "local-exec" {
command = "sleep 15"
}
}
Полный файл main.tf должен выглядеть следующим образом:
# Specifying Docker provider
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "3.0.2"
}
}
}
# Define the Docker container data source
data "docker_image" "local_image" {
name = "pure_image"
}
# Define the Docker container resource
resource "docker_container" "pure_app" {
name = "pure_app"
image = data.docker_image.local_image.name
# Expose port 5000 for Flask app
ports {
internal = 5000
external = 5000
}
}
# Terraform provisioner to wait for container to be ready
resource "null_resource" "wait_for_container" {
depends_on = [docker_container.pure_app]
# Local-exec provisioner to wait for container to be ready
provisioner "local-exec" {
command = "sleep 10"
}
}
Развертывание образа Docker с помощью Terraform
Теперь, когда у нас есть конфигурация Terraform (main.tf), мы можем использовать рабочий процесс Terraform для развёртывания образа Docker.
1. Инициализируйте Terraform
Откройте терминал в вашем каталоге docker-terraform и выполните следующую команду:
$ terraform init
Эта команда инициализирует Terraform, загружая все необходимые плагины, требуемые для настройки.
2. Спланируйте развертывание
Затем выполните следующую команду, чтобы просмотреть запланированные изменения, которые внесёт Terraform:
$ terraform plan
Эта команда анализирует вашу конфигурацию и выводит подробный отчёт с описанием изменений инфраструктуры, которые внесёт Terraform.
3. Примените Конфигурацию (развертывание)
Как только вы будете удовлетворены запланированными изменениями, приступайте к развёртыванию инфраструктуры, выполнив следующие действия:
$ terraform apply
Эта команда выполняет конфигурацию Terraform, развертывая контейнер Docker в соответствии с вашими требованиями.
4. Проверьте развертывание
После успешного развёртывания вы можете убедиться, что ваше приложение работает, открыв веб-браузер и перейдя по адресу http://localhost:5000. Вы должны увидеть сообщение «Привет, мир!», отображаемое вашим приложением Flask.
Поздравляем! Вы успешно создали образ Docker и автоматизировали развёртывание с помощью Terraform.
Создаем прочие объекты Docker при помощи конфигурации Terraform
Помимо создания контейнеров, при помощи Terraform можно создавать такие объекты Docker, как сети, секреты и тома.
В отдельной новой директории создаем конфигурационный файл main.tf со следующим содержимым:
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "3.0.2"
}
}
}
provider "docker" {
host = "unix:///var/run/docker.sock"
}
resource "docker_network" "private_network" {
name = "new_network"
}
resource "docker_secret" "secret1" {
name = " secret1"
data = base64encode("{"secret1": "s3cr3t"}")
}
resource "docker_volume" "shared_volume" {
name = "shared_volume"
}
Для каждого объекта (сеть, секрет, том) предоставляется свой блок.
В качестве сетевого драйвера будет создана сеть типа bridge с именем new_network.
В качестве секрета будет создан секрет с именем secret1, в котором будет закодировано (base64) слово secret1.
В качестве тома будет создан том с именем shared_volume.
Для запуска конфигурации используем те же команды, что и раньше:
terraform init
terraform validate
terraform apply
Убедимся, что объекты были успешно созданы:
docker network ls
docker volume ls
Ansible против Terraform: нужен ли Ansible с Terraform?
Изучив Terraform для развёртывания, давайте сравним его с Ansible, ещё одним популярным инструментом автоматизации инфраструктуры. Оба они отлично подходят для автоматизации, но у них есть свои преимущества:
Ansible
Ansible предлагает бессерверное управление конфигурацией и оркестрацию с помощью скриптов YAML. Он отлично подходит для задач по настройке и развёртыванию приложений.
Преимущества: простая настройка, декларативная конфигурация, обнаружение изменений конфигурации, обширная библиотека модулей
Terraform
Terraform предоставляет подход «инфраструктура как код» (IaC) для подготовки инфраструктуры и управления ею. Он отлично подходит для развёртывания облачной инфраструктуры и мультиоблачных сред.
Преимущества: декларативная конфигурация, обширная экосистема поставщиков, управление зависимостями, управление состоянием
Выбор правильного инструмента
Выбор зависит от ваших конкретных потребностей:
- Характер задач: решите, нужно ли вам управление конфигурацией и развертывание приложений (Ansible) или подготовка инфраструктуры и управление (Terraform).
- Существующая среда: Рассмотрите существующие инструменты и опыт команды.
- Необходима интеграция: оцените интеграцию с другими инструментами, такими как конвейеры CI/CD и мониторинг.
Ansible и Terraform можно даже использовать вместе. Ansible может управлять конфигурациями ресурсов, подготовленных с помощью Terraform. Такой комбинированный подход предлагает мощное и гибкое решение для автоматизации инфраструктуры.
Итоги
Благодаря современным технологиям, таким как контейнеризация с помощью Docker, управление инфраструктурой с помощью Terraform и оркестрация контейнеров с помощью Kubernetes, развёртывание программного обеспечения стало более управляемым, последовательным и воспроизводимым. Использование этих технологий с различными другими контейнерными технологиями и инструментами развёртывания DevOps, такими как Portworx® или Pure Cloud Block Store™, обеспечивает отказоустойчивость инфраструктуры программного обеспечения.
В этом руководстве вы узнали, как использовать два из этих методов для создания и автоматизации развёртывания контейнера.