Запуск Docker-образа на виртуальной машине с помощью консоли управления, CLI и API
Чтобы запустить Docker-образ на ВМ с использованием реестра Yandex Container Registry, выполните следующие шаги:
- Подготовьте облако к работе.
- Создайте ВМ.
- Соберите и загрузите 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.
Создайте сервисный аккаунт
-
Создайте сервисный аккаунт и назначьте ему роль
container-registry.images.puller
на реестр, созданный ранее:Консоль управленияCLIAPI- В консоли управления
выберите каталог, в котором вы хотите создать сервисный аккаунт. - В списке сервисов выберите Identity and Access Management.
- Нажмите кнопку Создать сервисный аккаунт.
- Введите имя сервисного аккаунта и нажмите кнопку Создать.
- Вернитесь в консоль управления
в каталог, в котором вы создали сервисный аккаунт. - В списке сервисов выберите Container Registry.
- Выберите реестр и нажмите на строку с его именем.
- Перейдите на вкладку Права доступа.
- В правом верхнем углу нажмите кнопку Назначить роли.
- Нажмите кнопку
Выбрать пользователя и добавьте сервисный аккаунт, указав его идентификатор. - Нажмите Добавить роль и выберите роль
container-registry.images.puller
. - Нажмите кнопку Сохранить.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
-
Посмотрите описание команды CLI для создания сервисного аккаунта:
yc iam service-account create --help
-
Создайте сервисный аккаунт:
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
.yc iam service-account create --name <имя_сервисного_аккаунта>
Результат:
id: ajelabcde12f******** folder_id: b0g12ga82bcv******** created_at: "2020-11-30T14:32:18.900092Z" name: myservice-acc
-
Назначьте роль сервисному аккаунту:
yc <имя_сервиса> <ресурс> add-access-binding <имя_или_идентификатор_ресурса> \ --role <идентификатор_роли> \ --subject serviceAccount:<идентификатор_сервисного_аккаунта>
Где:
<имя_сервиса>
— имя сервисаcontainer
.<ресурс>
— категория ресурсаregistry
.<имя_или_идентификатор_ресурса>
— имя или идентификатор ресурса, на который назначается роль.--role
— идентификатор ролиcontainer-registry.images.puller
.--subject
— идентификатор сервисного аккаунта (например:ajelabcde12f********
), которому назначается роль.
-
Чтобы создать сервисный аккаунт, воспользуйтесь методом ServiceAccountService/Create gRPC API или методом create для ресурса
ServiceAccount
REST API. -
Чтобы назначить роль сервисному аккаунту на реестр, воспользуйтесь методом REST API updateAccessBindings для ресурса Registry или вызовом gRPC API RegistryService/UpdateAccessBindings.
- В консоли управления
Создайте виртуальную машину
Создайте ВМ с публичным IP-адресом и привяжите к ней созданный сервисный аккаунт:
-
На странице каталога в консоли управления
нажмите кнопку Создать ресурс и выберитеВиртуальная машина
. -
В блоке Образ загрузочного диска выберите один из образов и версию операционной системы на базе Linux.
-
В блоке Расположение выберите зону доступности, в которой будет создана ВМ. Если вы не знаете, какая зона доступности вам нужна, оставьте выбранную по умолчанию.
-
(Опционально) В блоке Диски и файловые хранилища задайте нужный тип и размер загрузочного диска.
Если вы хотите добавить на ВМ новый дополнительный диск или подключить существующий, нажмите кнопку Добавить.
Также вы можете создать ВМ из существующего диска.
-
В блоке Сетевые настройки:
- В поле Подсеть выберите сеть и подсеть, к которым нужно подключить ВМ. Если нужной сети или подсети еще нет, создайте их.
- В поле Публичный адрес оставьте значение
Автоматически
, чтобы назначить ВМ случайный внешний IP-адрес из пула Yandex Cloud, или выберите статический адрес из списка, если вы зарезервировали его заранее. Чтобы не назначать публичный IP-адрес, выберитеБез адреса
. - При необходимости разверните блок Дополнительно и включите защиту от DDoS-атак.
-
В блоке Доступ выберите вариант SSH-ключ и укажите данные для доступа на ВМ:
- В поле Логин введите имя пользователя. Не используйте имя
root
или другие имена, зарезервированные ОС. Для выполнения операций, требующих прав суперпользователя, используйте командуsudo
. -
В поле SSH-ключ выберите SSH-ключ, сохраненный в вашем профиле пользователя организации.
Если в вашем профиле нет сохраненных SSH-ключей или вы хотите добавить новый ключ:
- Нажмите кнопку Добавить ключ.
- Задайте имя SSH-ключа.
- Загрузите или вставьте содержимое открытого SSH-ключа. Пару SSH-ключей для подключения к ВМ по SSH необходимо создать самостоятельно.
- Нажмите кнопку Добавить.
SSH-ключ будет добавлен в ваш профиль пользователя организации.
Если в организации отключена возможность добавления пользователями SSH-ключей в свои профили, добавленный открытый SSH-ключ будет сохранен только в профиле пользователя создаваемой виртуальной машины.
- В поле Логин введите имя пользователя. Не используйте имя
-
В блоке Общая информация задайте имя ВМ. Требования к имени:
- длина — от 3 до 63 символов;
- может содержать строчные буквы латинского алфавита, цифры и дефисы;
- первый символ — буква, последний — не дефис.
Примечание
Имя виртуальной машины используется для генерации внутреннего FQDN единожды — при создании ВМ. Если для вас важен внутренний FQDN, учитывайте это и задавайте нужное имя ВМ при создании.
-
В блоке Дополнительно выберите созданный на предыдущем шаге сервисный аккаунт.
-
Нажмите кнопку Создать ВМ.
-
Посмотрите описание команды CLI для создания ВМ:
yc compute instance create --help
-
Подготовьте пару ключей (открытый и закрытый) для SSH-доступа на ВМ.
-
Выберите в Cloud Marketplace один из публичных образов на базе операционной системы Linux (например, CentOS 7).
Чтобы получить список доступных образов с помощью CLI, выполните команду:
yc compute image list --folder-id standard-images
Результат:
+----------------------+-------------------------------------+--------------------------+----------------------+--------+ | ID | NAME | FAMILY | PRODUCT IDS | STATUS | +----------------------+-------------------------------------+--------------------------+----------------------+--------+ ... | fdvk34al8k5n******** | centos-7-1549279494 | centos-7 | dqni65lfhvv2******** | READY | | fdv7ooobjfl3******** | windows-2016-gvlk-1548913814 | windows-2016-gvlk | dqnnc72gj2is******** | READY | | fdv4f5kv5cvf******** | ubuntu-1604-lts-1549457823 | ubuntu-1604-lts | dqnnb6dc7640******** | READY | ... +----------------------+-------------------------------------+--------------------------+----------------------+--------+
Где:
-
ID
— идентификатор образа. -
NAME
— имя образа. -
FAMILY
— идентификатор семейства образов, к которому относится образ. -
PRODUCT IDS
— идентификаторы продуктов Yandex Cloud Marketplace, связанных с образом. -
STATUS
— текущий статус образа. Может принимать одно из значений:STATUS_UNSPECIFIED
— статус образа не определен.CREATING
— образ в процессе создания.READY
— образ готов к использованию.ERROR
— образ нельзя использовать из-за возникшей с ним проблемы.DELETING
— образ в процессе удаления.
-
-
Посмотрите список доступных подсетей:
yc vpc subnet list
Результат:
+----------------------+---------------------------+----------------------+----------------+-------------------+-----------------+ | ID | NAME | NETWORK ID | ROUTE TABLE ID | ZONE | RANGE | +----------------------+---------------------------+----------------------+----------------+-------------------+-----------------+ | b0c6n43f9lgh******** | default-ru-central1-d | enpe3m3fa00u******** | | ru-central1-d | [10.130.0.0/24] | | e2l2da8a20b3******** | default-ru-central1-b | enpe3m3fa00u******** | | ru-central1-b | [10.129.0.0/24] | | e9bnlm18l70a******** | default-ru-central1-a | enpe3m3fa00u******** | | ru-central1-a | [10.128.0.0/24] | +----------------------+---------------------------+----------------------+----------------+-------------------+-----------------+
-
Создайте ВМ в каталоге по умолчанию:
yc compute instance create \ --name first-instance \ --zone ru-central1-b \ --network-interface subnet-name=default-ru-central1-b,nat-ip-version=ipv4 \ --create-boot-disk image-folder-id=standard-images,image-family=centos-7 \ --ssh-key ~/.ssh/id_ed25519.pub --service-account-name service-acc
Где:
-
--name
— имя ВМ.Примечание
Имя виртуальной машины используется для генерации внутреннего FQDN единожды — при создании ВМ. Если для вас важен внутренний FQDN, учитывайте это и задавайте нужное имя ВМ при создании.
-
--zone
— зона доступности, которая соответствует выбранной подсети. -
subnet-name
— имя выбранной подсети. -
image-family
— семейство образов, напримерcentos-7
. Эта опция позволит установить последнюю версию операционной системы из указанного семейства. -
Публичный IP. Чтобы создать ВМ без публичного IP, исключите опцию
nat-ip-version=ipv4
. -
--ssh-key
— путь до публичного SSH-ключа. Для этого ключа на ВМ будет автоматически создан пользовательyc-user
. -
--service-account-name
— имя сервисного аккаунта, созданного на предыдущем шаге.
В результате будет создана ВМ
first-instance
. -
Создайте ВМ с помощью метода Create для ресурса Instance
:
-
Подготовьте пару ключей (открытый и закрытый) для SSH-доступа на ВМ.
-
Получите Yandex Identity and Access Management-токен, используемый для аутентификации в примерах:
- Инструкция для пользователя с аккаунтом на Яндексе.
- Инструкция для сервисного аккаунта.
-
Получите идентификатор каталога.
-
Получите информацию об образе, из которого надо создать ВМ (идентификатор образа и минимальный размер диска):
-
Если вы знаете семейство образа, получите информации о последнем образе в этом семействе:
export IAM_TOKEN=CggaATEVAgA... export FAMILY=ubuntu-1804 curl --header "Authorization: Bearer ${IAM_TOKEN}" \ "https://compute.api.cloud.yandex.net/compute/v1/images:latestByFamily?folderId=standard-images&family=${FAMILY}"
-
Вы можете получить информацию об образе из списка публичных образов.
-
-
Получите идентификатор подсети и идентификатор зоны доступности. В запросе укажите идентификатор каталога, в котором создана подсеть:
export IAM_TOKEN=CggaATEVAgA... export FOLDER_ID=b1gvmob95yys******** curl --header "Authorization: Bearer ${IAM_TOKEN}" \ "https://vpc.api.cloud.yandex.net/vpc/v1/subnets?folderId=${FOLDER_ID}" { "subnets": [ { "v4CidrBlocks": [ "10.130.0.0/24" ], "id": "b0c6n43ftldh********", "folderId": "b1gvmob95yys********", "createdAt": "2018-09-23T12:15:00Z", "name": "default-ru-central1-b", "description": "Auto-created default subnet for zone ru-central1-b", "networkId": "enpe3m3faglu********", "zoneId": "ru-central1-b" }, ... ]}
-
Создайте файл с телом запроса на создание ВМ, например
body.json
:{ "folderId": "b1gvmob95yys********", "name": "instance-demo-no-pwauth", "zoneId": "ru-central1-b", "platformId": "standard-v3", "resourcesSpec": { "memory": "2147483648", "cores": "2" }, "metadata": { "user-data": "#cloud-config\nusers:\n - name: user\n groups: sudo\n shell: /bin/bash\n sudo: 'ALL=(ALL) NOPASSWD:ALL'\n ssh_authorized_keys:\n - ssh-ed25519 AAAAB3N... user@example.com" }, "bootDiskSpec": { "diskSpec": { "size": "2621440000", "imageId": "fd8rc75pn12f********" } }, "networkInterfaceSpecs": [ { "subnetId": "b0c6n43ftldh********", "primaryV4AddressSpec": { "oneToOneNatSpec": { "ipVersion": "IPV4" } } } ], "serviceAccountId": "ajelabcde12f********" }
Где:
-
folderId
— идентификатор каталога. -
name
— имя, которое будет присвоено ВМ при создании. -
zoneId
— зона доступности, которая соответствует выбранной подсети. -
platformId
— платформа. -
resourceSpec
— ресурсы, доступные ВМ. Значения должны соответствовать выбранной платформе. -
metadata
— в метаданных необходимо передать открытый ключ для SSH-доступа на ВМ. Подробнее в разделе Метаданные виртуальной машины. -
bootDiskSpec
— настройки загрузочного диска. Укажите идентификатор выбранного образа и размер диска. Размер диска должен быть не меньше минимального размера диска, указанного в информации об образе. -
networkInterfaceSpecs
— настройки сети:-
subnetId
— идентификатор выбранной подсети. -
primaryV4AddressSpec
— IP-адрес, который будет присвоен ВМ. Чтобы добавить публичный IP-адрес ВМ, укажите:"primaryV4AddressSpec": { "oneToOneNatSpec": { "ipVersion": "IPV4" } }
-
-
serviceAccountId
— идентификатор созданного на предыдущем шаге сервисного аккаунта.
Подробнее про формат тела запроса в справочнике API.
-
-
Создайте ВМ:
export IAM_TOKEN=CggaATEVAgA... curl --request POST \ --header "Content-Type: application/json" \ --header "Authorization: Bearer ${IAM_TOKEN}" \ --data '@body.json' \ https://compute.api.cloud.yandex.net/compute/v1/instances
После создания ВМ, соберите и загрузите 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
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы:
- Удалите ВМ.
- Удалите статический публичный IP-адрес, если вы его зарезервировали.
- Удалите Docker-образ.
- Удалите реестр.