Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • Машинное обучение
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Истории успеха
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Практические руководства
    • Все руководства
    • Архитектура и защита базового интернет-сервиса
    • Анализ поресурсной детализации расходов с помощью Object Storage
      • Начало работы с Terraform
      • Источники данных Terraform
      • Загрузка состояний Terraform в Object Storage
      • Начало работы с Packer
      • Сборка образа ВМ с набором инфраструктурных инструментов с помощью Packer
      • Блокировка состояний Terraform с помощью Managed Service for YDB
      • Использование модулей Yandex Cloud в Terraform
      • Создать ВМ и группу ВМ с Container Optimized Image с помощью Terraform
        • Обзор
        • Консоль управления, CLI и API
        • Terraform
      • Передача логов через HTTP-вход Unified Agent в Cloud Logging
      • Запуск языковой модели DeepSeek-R1 в кластере GPU Compute Cloud

В этой статье:

  • Подготовьте облако к работе
  • Необходимые платные ресурсы
  • Настройте окружение
  • Создайте инфраструктуру
  • Соберите и загрузите Docker-образ в Container Registry
  • Загрузите Docker-образ на ВМ
  • Проверьте результат
  • Как удалить созданные ресурсы
  • См. также
  1. Базовая инфраструктура
  2. Инструменты
  3. Запуск Docker-образа на виртуальной машине
  4. Terraform

Запуск Docker-образа на виртуальной машине с помощью Terraform

Статья создана
Yandex Cloud
Улучшена
Обновлена 21 апреля 2025 г.
  • Подготовьте облако к работе
    • Необходимые платные ресурсы
    • Настройте окружение
  • Создайте инфраструктуру
  • Соберите и загрузите Docker-образ в Container Registry
  • Загрузите Docker-образ на ВМ
  • Проверьте результат
  • Как удалить созданные ресурсы
  • См. также

Чтобы запустить Docker-образ на ВМ с использованием реестра Yandex Container Registry с помощью Terraform:

  1. Подготовьте облако к работе.
  2. Создайте инфраструктуру.
  3. Соберите и загрузите Docker-образ в Container Registry.
  4. Загрузите Docker-образ на ВМ.
  5. Проверьте результат.

Если созданные ресурсы вам больше не нужны, удалите их.

Подготовьте облако к работеПодготовьте облако к работе

Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:

  1. Перейдите в консоль управления, затем войдите в Yandex Cloud или зарегистрируйтесь.
  2. На странице Yandex Cloud Billing убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе ACTIVE или TRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.

Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака.

Подробнее об облаках и каталогах.

Необходимые платные ресурсыНеобходимые платные ресурсы

В стоимость поддержки инфраструктуры входят:

  • плата за постоянно запущенную ВМ (см. тарифы Yandex Compute Cloud);
  • плата за использование динамического или статического публичного IP-адреса (см. тарифы Yandex Virtual Private Cloud);
  • плата за хранение Docker-образа в реестре и исходящий трафик (см. тарифы Yandex Container Registry).

Настройте окружениеНастройте окружение

  1. Установите интерфейс командной строки Yandex Cloud.
  2. Подготовьте SSH-ключ для доступа к ВМ.
  3. Создайте реестр в Container Registry и загрузите в него Docker-образ для тестирования.
  4. Установите и настройте Docker.

Создайте инфраструктуруСоздайте инфраструктуру

Terraform позволяет быстро создать облачную инфраструктуру в Yandex Cloud и управлять ею с помощью файлов конфигураций. В файлах конфигураций хранится описание инфраструктуры на языке HCL (HashiCorp Configuration Language). При изменении файлов конфигураций Terraform автоматически определяет, какая часть вашей конфигурации уже развернута, что следует добавить или удалить.

Terraform распространяется под лицензией Business Source License, а провайдер Yandex Cloud для Terraform — под лицензией MPL-2.0.

Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform или в зеркале.

Для создания инфраструктуры c помощью Terraform:

  1. Установите Terraform, получите данные для аутентификации и укажите источник для установки провайдера Yandex Cloud (раздел Настройте провайдер, шаг 1).

  2. Подготовьте файлы с описанием инфраструктуры:

    Готовая конфигурация
    Вручную
    1. Клонируйте репозиторий с конфигурационными файлами:

      git clone https://github.com/yandex-cloud-examples/yc-run-docker-on-vm.git
      
    2. Перейдите в директорию с репозиторием. В ней должнен появиться файл run-docker-on-vm-config.tf с конфигурацией создаваемой инфраструктуры.

    1. Создайте папку для файла с описанием инфраструктуры.

    2. Создайте в папке конфигурационный файл 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 см. в документации провайдера:

    • Реестр — yandex_container_registry.
    • Сервисный аккаунт — yandex_iam_service_account.
    • Привязка прав доступа к каталогу — yandex_resourcemanager_folder_iam_member.
    • Сеть — yandex_vpc_network.
    • Подсети — yandex_vpc_subnet.
    • Диск — yandex_compute_disk.
    • Виртуальная машина — yandex_compute_instance.
  3. В блоке 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 — идентификатор образа, из которого будет создана ВМ. Подробнее см. Получить список публичных образов.
  4. Создайте ресурсы:

    1. В терминале перейдите в папку, где вы отредактировали конфигурационный файл.

    2. Проверьте корректность конфигурационного файла с помощью команды:

      terraform validate
      

      Если конфигурация является корректной, появится сообщение:

      Success! The configuration is valid.
      
    3. Выполните команду:

      terraform plan
      

      В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.

    4. Примените изменения конфигурации:

      terraform apply
      
    5. Подтвердите изменения: введите в терминале слово yes и нажмите Enter.

После создания инфраструктуры, соберите и загрузите Docker-образ в Container Registry.

Соберите и загрузите Docker-образ в Container RegistryСоберите и загрузите Docker-образ в Container Registry

  1. Для удобства выполнения команд добавьте переменные:

    • Имя пользователя и публичный IP-адрес вашей ВМ — в переменную ${PUBLIC_IP}:

      export PUBLIC_IP=<имя_пользователя>@<публичный_IP-адрес_ВМ>
      
    • Идентификатор реестра, созданного ранее, в формате crpc9qeoft23******** — в переменную ${REGISTRY_ID}:

      export REGISTRY_ID=<идентификатор_реестра>
      
  2. Аутентифицируйтесь от своего имени:

    OAuth-токен
    IAM-токен
    Docker Credential helper
    1. Если у вас еще нет OAuth-токена, получите его по ссылке.

    2. Выполните команду:

      echo <OAuth-токен> | docker login --username oauth --password-stdin cr.yandex
      

      Результат:

      Login Succeeded
      

    Примечание

    У IAM-токена короткое время жизни — не более 12 часов. Поэтому такой способ подойдет для приложений, которые будут запрашивать IAM-токен автоматически.

    1. Получите IAM-токен.

    2. Выполните команду:

      yc iam create-token | docker login --username iam --password-stdin cr.yandex
      

      Результат:

      ...
      Login Succeeded
      
    1. Если у вас еще нет профиля для CLI, создайте его.

    2. Сконфигурируйте 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 читайте в официальной документации.

    3. Проверьте, что Docker сконфигурирован.

      В конфигурационном файле /home/<user>/.docker/config.json должна появиться строка:

      "cr.yandex": "yc"
      
    4. Docker готов к использованию, например, для загрузки Docker-образов. При этом выполнять команду docker login не надо.

  3. Создайте файл Dockerfile:

    touch .dockerfile
    
  4. Откройте Dockerfile текстовым редактором, например:

    nano .dockerfile
    
  5. Добавьте туда следующие строки:

    FROM ubuntu:latest
    CMD echo "Hi, I'm inside"
    
  6. Соберите Docker-образ:

    docker build . -t cr.yandex/${REGISTRY_ID}/ubuntu:hello -f .dockerfile
    

    Результат:

    ...
    Successfully built b68ee9b6b1af
    Successfully tagged cr.yandex/crpmnjr98tm5********/ubuntu:hello
    
  7. Загрузите собранный 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-образ на ВМЗагрузите Docker-образ на ВМ

  1. Подключитесь по SSH к ВМ.

  2. Пройдите аутентификацию от имени сервисного аккаунта, привязанного к этой машине:

    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
    
  3. Скачайте 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

Как удалить созданные ресурсыКак удалить созданные ресурсы

Чтобы удалить инфраструктуру и перестать платить за созданные ресурсы:

  1. Откройте конфигурационный файл run-docker-on-vm-config.tf и удалите описание создаваемой инфраструктуры из файла.

  2. Примените изменения:

    1. В терминале перейдите в папку, где вы отредактировали конфигурационный файл.

    2. Проверьте корректность конфигурационного файла с помощью команды:

      terraform validate
      

      Если конфигурация является корректной, появится сообщение:

      Success! The configuration is valid.
      
    3. Выполните команду:

      terraform plan
      

      В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.

    4. Примените изменения конфигурации:

      terraform apply
      
    5. Подтвердите изменения: введите в терминале слово yes и нажмите Enter.

См. такжеСм. также

  • Запуск Docker-образа на виртуальной машине с помощью консоли управления, CLI и API

Была ли статья полезна?

Предыдущая
Консоль управления, CLI и API
Следующая
Передача логов через HTTP-вход Unified Agent в Cloud Logging
Проект Яндекса
© 2025 ООО «Яндекс.Облако»