Запуск Docker-образа на виртуальной машине с помощью Terraform
Чтобы запустить Docker-образ на ВМ с использованием реестра Yandex Container Registry с помощью Terraform:
- Подготовьте облако к работе.
- Создайте инфраструктуру.
- Соберите и загрузите Docker-образ в Container Registry.
- Загрузите Docker-образ на ВМ.
- Проверьте результат.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входят:
- плата за постоянно запущенную ВМ (см. тарифы Yandex Compute Cloud);
- плата за использование динамического или статического публичного IP-адреса (см. тарифы Yandex Virtual Private Cloud);
- плата за хранение Docker-образа в реестре и исходящий трафик (см. тарифы Yandex Container Registry).
Настройте окружение
- Установите интерфейс командной строки Yandex Cloud.
- Подготовьте SSH-ключ для доступа к ВМ.
- Создайте реестр в Container Registry и загрузите в него Docker-образ для тестирования.
- Установите и настройте Docker.
Создайте инфраструктуру
Terraform
Terraform распространяется под лицензией Business Source License
Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform
Для создания инфраструктуры c помощью Terraform:
-
Установите Terraform, получите данные для аутентификации и укажите источник для установки провайдера Yandex Cloud (раздел Настройте провайдер, шаг 1).
-
Подготовьте файлы с описанием инфраструктуры:
Готовая конфигурацияВручную-
Клонируйте репозиторий
с конфигурационными файлами:git clone https://github.com/yandex-cloud-examples/yc-run-docker-on-vm.git
-
Перейдите в директорию с репозиторием. В ней должнен появиться файл
run-docker-on-vm-config.tf
с конфигурацией создаваемой инфраструктуры.
-
Создайте папку для файла с описанием инфраструктуры.
-
Создайте в папке конфигурационный файл
run-docker-on-vm.tf
:Содержимое файла run-docker-on-vm.tf
# Объявление переменных для конфиденциальных параметров locals { zone = "<зона_доступности_по_умолчанию>" username = "<имя_пользователя_ВМ>" ssh_key_path = "<путь_к_публичному_SSH-ключу>" target_folder_id = "<идентификатор_каталога_для_размещения_ВМ>" registry_name = "<имя_реестра>" sa_name = "<имя_сервисного_аккаунта>" network_name = "<имя_облачной_сети>" subnet_name = "<имя_подсети>" vm_name = "<имя_виртуальной_машины>" image_id = "<идентификатор_образа>" } # Настройка провайдера terraform { required_providers { yandex = { source = "yandex-cloud/yandex" version = ">= 0.47.0" } } } provider "yandex" { zone = local.zone } # Создание репозитория Сontainer Registry resource "yandex_container_registry" "my-registry" { name = local.registry_name folder_id = local.target_folder_id } # Создание сервисного аккаунта resource "yandex_iam_service_account" "registry-sa" { name = local.sa_name folder_id = local.target_folder_id } # Назначение роли сервисному аккаунту resource "yandex_resourcemanager_folder_iam_member" "registry-sa-role-images-puller" { folder_id = local.target_folder_id role = "container-registry.images.puller" member = "serviceAccount:${yandex_iam_service_account.registry-sa.id}" } # Создание облачной сети resource "yandex_vpc_network" "docker-vm-network" { name = local.network_name } # Создание подсети resource "yandex_vpc_subnet" "docker-vm-network-subnet-a" { name = local.subnet_name zone = local.zone v4_cidr_blocks = ["192.168.1.0/24"] network_id = yandex_vpc_network.docker-vm-network.id } # Создание загрузочного диска resource "yandex_compute_disk" "boot-disk" { name = "bootvmdisk" type = "network-hdd" zone = local.zone size = "10" image_id = local.image_id } # Создание ВМ resource "yandex_compute_instance" "docker-vm" { name = local.vm_name platform_id = "standard-v3" zone = local.zone service_account_id = "${yandex_iam_service_account.registry-sa.id}" resources { cores = 2 memory = 2 } boot_disk { disk_id = yandex_compute_disk.boot-disk.id } network_interface { subnet_id = "${yandex_vpc_subnet.docker-vm-network-subnet-a.id}" nat = true } metadata = { user-data = "#cloud-config\nusers:\n - name: ${local.username}\n groups: sudo\n shell: /bin/bash\n sudo: 'ALL=(ALL) NOPASSWD:ALL'\n ssh_authorized_keys:\n - ${file("${local.ssh_key_path}")}" } }
Более подробную информацию о параметрах используемых ресурсов в Terraform см. в документации провайдера:
-
-
В блоке
locals
задайте параметры создаваемых ресурсов:zone
— зона доступности, в которой будет находиться ВМ.username
— имя пользователя, который будет создан на ВМ.ssh_key_path
— путь к файлу с открытым SSH-ключом для аутентификации пользователя на ВМ. Подробнее см. Создание пары ключей SSH.target_folder_id
— идентификатор каталога, в котором будет находиться ВМ.registry_name
— имя реестра Container Registry.sa_name
— имя сервисного аккаунта.network_name
— имя облачной сети.subnet_name
— имя подсети.vm_name
— имя ВМ.image_id
— идентификатор образа, из которого будет создана ВМ. Подробнее см. Получить список публичных образов.
-
Создайте ресурсы:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминале слово
yes
и нажмите Enter.
-
После создания инфраструктуры, соберите и загрузите Docker-образ в Container Registry.
Соберите и загрузите Docker-образ в Container Registry
-
Для удобства выполнения команд добавьте переменные:
-
Имя пользователя и публичный IP-адрес вашей ВМ — в переменную
${PUBLIC_IP}
:export PUBLIC_IP=<имя_пользователя>@<публичный_IP-адрес_ВМ>
-
Идентификатор реестра, созданного ранее, в формате
crpc9qeoft23********
— в переменную${REGISTRY_ID}
:export REGISTRY_ID=<идентификатор_реестра>
-
-
Аутентифицируйтесь от своего имени:
OAuth-токенIAM-токенDocker Credential helper-
Если у вас еще нет OAuth-токена, получите его по ссылке
. -
Выполните команду:
echo <OAuth-токен> | docker login --username oauth --password-stdin cr.yandex
Результат:
Login Succeeded
Примечание
У IAM-токена короткое время жизни — не более 12 часов. Поэтому такой способ подойдет для приложений, которые будут запрашивать IAM-токен автоматически.
-
Получите Identity and Access Management-токен.
-
Выполните команду:
yc iam create-token | docker login --username iam --password-stdin cr.yandex
Результат:
... Login Succeeded
-
Если у вас еще нет профиля для YC CLI, создайте его.
-
Сконфигурируйте Docker для использования
docker-credential-yc
:yc container registry configure-docker
Результат:
Credential helper is configured in '/home/<user>/.docker/config.json'
Настройки сохраняются в профиле текущего пользователя.
Важно
Credential helper работает только при использовании Docker без
sudo
. О том, как настроить запуск Docker от имени текущего пользователя без использованияsudo
читайте в официальной документации . -
Проверьте, что Docker сконфигурирован.
В конфигурационном файле
/home/<user>/.docker/config.json
должна появиться строка:"cr.yandex": "yc"
-
Docker готов к использованию, например, для загрузки Docker-образов. При этом выполнять команду
docker login
не надо.
-
-
Создайте файл Dockerfile:
touch .dockerfile
-
Откройте Dockerfile текстовым редактором, например:
nano .dockerfile
-
Добавьте туда следующие строки:
FROM ubuntu:latest CMD echo "Hi, I'm inside"
-
Соберите Docker-образ:
docker build . -t cr.yandex/${REGISTRY_ID}/ubuntu:hello -f .dockerfile
Результат:
... Successfully built b68ee9b6b1af Successfully tagged cr.yandex/crpmnjr98tm5********/ubuntu:hello
-
Загрузите собранный Docker-образ в Container Registry:
docker push cr.yandex/${REGISTRY_ID}/ubuntu:hello
Результат:
The push refers to repository [cr.yandex/crpc9qeoft23********/ubuntu] cc9d18e90faa: Pushed 0c2689e3f920: Pushed 47dde53750b4: Pushed hello: digest: sha256:42068479274f1d4c7ea095482430dcba24dcfe8c23ebdf6d32305928******** size: 943
Загрузите Docker-образ на ВМ
-
Подключитесь по SSH к ВМ.
-
Пройдите аутентификацию от имени сервисного аккаунта, привязанного к этой машине:
curl --header Metadata-Flavor:Google 169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token | \ cut -f1 -d',' | \ cut -f2 -d':' | \ tr -d '"' | \ docker login --username iam --password-stdin cr.yandex
Результат:
Login Succeeded
-
Скачайте Docker-образ на ВМ:
docker pull cr.yandex/${REGISTRY_ID}/ubuntu:hello
Результат:
hello: Pulling from crpc9qeoft23********/ubuntu 6a5697faee43: Pulling fs layer ba13d3bc422b: Pulling fs layer ... Digest: sha256:42068479274f1d4c7ea095482430dcba24dcfe8c23ebdf6d32305928******** Status: Downloaded newer image for cr.yandex/crpc9qeoft23********/ubuntu:hello cr.yandex/crpc9qeoft23********/ubuntu:hello
Проверьте результат
На ВМ запустите Docker-образ:
docker run cr.yandex/${REGISTRY_ID}/ubuntu:hello
Результат:
Hi, I'm inside
Как удалить созданные ресурсы
Чтобы удалить инфраструктуру и перестать платить за созданные ресурсы:
-
Откройте конфигурационный файл
run-docker-on-vm-config.tf
и удалите описание создаваемой инфраструктуры из файла. -
Примените изменения:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминале слово
yes
и нажмите Enter.
-