Контейнеры. Yandex Container Registry

Яндекс.Облако предоставляет отличные инструменты для работы с docker-контейнерами.
Сервис Container Optimized Image даёт возможность одной командой развернуть на вашем сервере в Яндекс.Облаке виртуальную машину с Ubuntu и с предустановленным Docker, а в докере запустить контейнеры из вашего docker-compose.yaml.
Служба Yandex Container Registry — это реестр докер-образов (аналог Docker Hub в Яндекс.Облаке): ваши образы будут храниться в дата-центрах Яндекс.Облака. Это обеспечит высокую скорость загрузки и скачивания образов, а также сократит внешний трафик на ваш сервер. При этом не потребуется изучать новые команды — сервис понимает стандартные команды Docker.

Консольное приложение YandexCloud

Сервисы Яндекс.Облако управляются через собственное консольное приложение (CLI, Command Line Interface). Установите его на свой компьютер: перейдите по ссылке https://cloud.yandex.ru/docs/cli/quickstart#install, выберите инструкцию для своей операционной системы и выполните все шаги по установке CLI и инициализации аккаунта.
CLI Яндекс.Облака вызывается командой yc, список доступных команд можно посмотреть через yc --help.

Создание виртуальной машины и запуск docker-compose.yaml

Создайте сервисный аккаунт:
Скопировать кодBASH
yc iam service-account create --name default-sa
При успешном создании вы получите сообщение с id аккаунта и остальными данными.
Создайте авторизованный ключ для сервисного аккаунта и сохраните его в файл key.json:
Скопировать кодBASH
yc iam key create --service-account-name default-sa --output key.json
В текущей директории появится файл key.json — это ваш ключ для авторизации.
Добавьте авторизованный ключ сервисного аккаунта в профиль CLI.
Создайте новый профиль CLI:
Скопировать кодBASH
yc config profile create sa-profile
Добавьте авторизованный ключ:
Скопировать кодBASH
yc config set service-account-key key.json
Чтобы создать виртуальную машину с установленной Ubuntu и Docker и запустить на ней docker-compose, перейдите в локальный каталог с файлом docker-compose.yaml и выполните команду через yc:
Скопировать кодBASH
yc compute instance create-with-container \ --name my-vm \ # имя новой виртуальной машины --zone=ru-central1-a \ # зона, в которой она будет размещена, можно не менять --ssh-key ssh-key.pub \ # локальный путь до вашего публичного ssh-ключа --network-interface subnet-name=<имя подсети>,nat-ip-version=ipv4 # имя подсети — например, ru-central1-b --service-account-name default-sa \ # имя сервистого аккаунта, можно не менять --docker-compose-file docker-compose.yaml # путь до файла docker-compose.yaml
Через пару минут будет создана виртуальная машина и на ней запустятся необходимые контейнеры. На экран будет выведен отчёт о создании виртуальной машины:
Скопировать кодBASH
id: fhmesl6l6bvbvd1gqrvd folder_id: b1gqfrfs8c424ple0f2d created_at: "2020-07-20T17:43:13Z" name: my-vm mac_address: d0:0d:ee:54:d5:32 subnet_id: e9b555uf8mvhcru8n8ho primary_v4_address: address: 10.128.0.15 one_to_one_nat: address: 84.201.133.117 ip_version: IPV4 ...
Теперь подключитесь к виртуальной машине через ssh. Публичный ip этой виртуальной машины машины есть в отчёте о её создании.
Скопировать кодBASH
ssh <имя_пользователя>@<публичный_IP-адрес_виртуальной машины> # имя пользователя yc-user
Проверьте, что контейнеры запущены:
Скопировать кодBASH
docker container ls
Готово! Одной командой вы создали новую виртуальную машину и запустили контейнеры из файла docker-compose.

Container Registry

Container Registry — это хранилище (репозиторий) докер-образов, такое же, как Docker Hub. Преимущество Container Registry в том, что образы хранятся в дата-центрах Яндекса, там же, где и ваши виртуальные машины. Таким образом достигается очень высокая скорость загрузки и обновления контейнеров.
Для начала надо создать каталог в вашем Яндекс.Облаке. Каталог — это способ сгруппировать и структурировать сервисы Яндекс.Облака, которые вы подключили.
Перейдите на страницу консоли Яндекс.Облака и нажмите «Создать каталог» (эта ссылка спрятана в меню под тремя точками рядом с именем вашего аккаунта). Дайте каталогу имя: оно может быть длиной от 3 до 63 символов и состоять только из символов латинского алфавита, цифр и дефисов. Имя каталога должно начинаться с буквы.
image
На скриншоте видно, что каталогу присвоено имя default.

Создание реестра Container Registry

Создайте собственный реестр, хранилище docker-образов. При вводе команды замените значение my-docker-registry на имя, которое вы хотите дать реестру:
Скопировать кодBASH
yc container registry create --name my-docker-registry
Команда вернет примерно следующее:
Скопировать кодBASH
done (2s) id: crpr4cfaq4v7v2j5u794 folder_id: b1gqfrfs8c424ple0f2d name: my-docker-registry status: ACTIVE created_at: "2020-07-19T22:52:57.572Z"
Реестр для ваших докер-контейнеров успешно создан. Сохраните значение ключа id, оно понадобится для работы с реестром.

Управление реестром образов

Запустите команду создания файла конфигурации реестра: конфиг нужен, чтобы сохранить настройки и не вводить их снова и снова:
Скопировать кодBASH
yc container registry configure-docker
Результат выполнения команды будет примерно таким:
Скопировать кодBASH
Credential helper is configured in '/home/username/.docker/config.json'
Теперь можно запушить в новый реестр первый образ. Потестируйте систему на образе python-alpine. Сначала загрузите этот образ в свой локальный репозиторий на компьютере:
Скопировать кодBASH
docker pull python:3.8-alpine
Переименуйте образ, чтобы имя указывало на ваш реестр в Container Registry:
Скопировать кодBASH
docker tag <IMAGE_ID> cr.yandex/<REGISTRY_ID>/<имя-образа>
По префиксу cr.yandex/<REGISTRY_ID> Docker поймёт, что пушить образ нужно не в Docker Hub, а в реестр Container Registry.
Осталось запушить образ в реестр:
Скопировать кодBASH
docker push cr.yandex/<REGISTRY_ID>/<имя-образа>
Через веб-интерфейс зайдите в реестр и убедитесь, что всё прошло гладко.
Перейдите в консоль вашего аккаунта, нажмите на имя каталога, затем войдите в Container Registry:
image
Щёлкните по имени реестра:
image
Перед вами имя репозитория, он создался из образа python:3.8-alpine.
Нажмите на него:
image
Тут список всех образов с тегами:
image
Подведем итог. Применение облачных сервисов может заметно ускорить вашу работу и снять с вас задачи по рутинным операциям. В большинстве своём такие сервисы — платные, но освободившееся время зачастую дороже.