Перейти к содержимому
Главная страница » Запуск образа Docker с помощью Terraform

Запуск образа Docker с помощью Terraform

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

  1. Windows: Чтобы установить Docker на компьютер с Windows, ознакомьтесь с официальным руководством по установке для Windows. Убедитесь, что ваш компьютер соответствует всем системным требованиям (включая включение аппаратной виртуализации и функции WSL 2 или Hyper-V), и следуйте инструкциям для успешной установки программного обеспечения на ваш компьютер.
  2. MacOS: Независимо от того, используете ли вы Mac с процессором Intel или Apple, убедитесь, что вы работаете под управлением одной из трёх последних версий MacOS, а затем следуйте официальным инструкциям по установке Docker для macOS.
  3. 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™, обеспечивает отказоустойчивость инфраструктуры программного обеспечения.

В этом руководстве вы узнали, как использовать два из этих методов для создания и автоматизации развёртывания контейнера.

Источник: How to Deploy a Docker Image with Terraform

Используем Terraform для работы с Docker

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *