С помощью этого руководства вы научитесь сохранять данные проекта, размещенного в Container Apps, с помощью Object Storage. Вы будете использовать репозиторий GitVerse с исходным кодом готового nginx-сервиса для раздачи фотографий и django-приложения для управления фотографиями. На примере этих приложений вы научитесь создавать сервис Container Apps без потери данных, когда трафик падает до нуля.
Вы будете использовать следующие сервисы:
-
Artifact Registry для хранения, совместного использования и управления Docker-образами и Helm-чартами.
-
Container Apps — сервис для запуска контейнерных приложений в облаке. Не требует знания Kubernetes и создания виртуальных машин.
-
Object Storage — объектное S3-хранилище с бесплатным хранением файлов, объемом до 15 ГБ.
Шаги:
Перед началом работы
Если вы уже зарегистрированы, войдите под своей учетной записью.
1. Подготовьте среду
Подготовьте среду, если не сделали этого ранее.
2. Клонируйте или скачайте репозиторий c GitVerse
Вы можете зарегистрироваться в GitVerse, если у вас еще нет аккаунта, и познакомиться с новой системой контроля версий. Этот шаг необязательный и не влияет на дальнейшее прохождение сценария.
В этом репозитории находится исходный код django-приложения, написанного на Python, а также nginx-сервис для публикации фотографий.
git clone https://gitverse.ru/cloudru/evo-container-apps-django-app
3. Соберите образ с django-приложением и присвойте тег
Убедитесь, что Docker Desktop запущен и пользователь авторизован в приложении.
Используйте реестр, созданный на этапе подготовки среды.
-
Перейдите в подкаталог с django-приложением.
cd django_app -
Выполните команду для сборки образа:
docker build . \--tag django-app.cr.cloud.ru/manage-photos-django-app \--platform linux/amd64 \--provenance false
Для создания контейнера Docker-образ должен быть собран под платформу linux/amd64, поэтому в команде используется флаг platform со значением linux/amd64.
4. Загрузите Docker-образ c django-приложением в реестр
Загрузите образ в реестр Artifact Registry, выполнив команду:
docker push <registry_name>.cr.cloud.ru/manage-photos-django-app
Где:
-
<registry_name> — название реестра, которое вы указывали при его создании в Artifact Registry.
-
manage-photos-django-app — название будущего репозитория в Artifact Registry. Название репозитория соответствует имени Docker-образа.
5. Соберите образ с nginx-сервисом и присвойте тег
Убедитесь, что Docker Desktop запущен и пользователь авторизован в приложении.
Используйте реестр, созданный на этапе подготовки среды.
-
В исходном коде приложения в файле nginx.conf убедитесь, что в качестве каталога для хранения файлов указан /files/media/.
-
Перейдите в подкаталог с nginx-сервисом.
cd nginx_share_media_files -
Выполните команду для сборки образа:
docker build . \--tag django-app.cr.cloud.ru/nginx-service \--platform linux/amd64 \--provenance false
Для создания контейнера Docker-образ должен быть собран под платформу linux/amd64, поэтому в команде используется флаг platform со значением linux/amd64.
6. Загрузите Docker-образ c nginx-сервисом в реестр
Загрузите образ в реестр Artifact Registry, выполнив команду:
docker push <registry_name>.cr.cloud.ru/manage-photos-nginx
Где:
-
<registry_name> — название реестра, которое вы указывали при его создании в Artifact Registry.
-
manage-photos-nginx — название будущего репозитория в Artifact Registry. Название репозитория соответствует имени Docker-образа.
7. Создайте бакеты в Object Storage
В сервисе Object Storage создайте бакет для базы данных и бакет для хранения медиаданных.
Бакет для базы данных SQLite:
SQLite не поддерживает одновременную многопоточную запись, особенно при размещении файла базы в Object Storage. Этот пример предназначен исключительно для демонстрационных целей и быстрого запуска приложения.
Для production-среды настоятельно рекомендуется использовать полноценную СУБД, например PostgreSQL — она обеспечит надежность, масштабируемость и поддержку конкурентного доступа.
-
Название — <your_name>, например django-app-media-data.
-
Доменное имя — не задано.
-
Класс хранения по умолчанию — Стандартный.
-
Максимальный размер — отключите или укажите на свое усмотрение.
Этот бакет используется для размещения SQLite-базы данных, в которой хранятся учетные данные пользователей и ссылки на их фотографии. Он будет примонтирован в приложение по пути /files/database.
Бакет для хранения медиаданных:
-
Название — <your_name>, например django-app-media-db.
-
Доменное имя — не задано.
-
Класс хранения по умолчанию — Стандартный.
-
Максимальный размер — отключите или укажите на свое усмотрение.
Этот бакет предназначен для хранения загруженных фотографий. Он будет примонтирован в приложение по пути /files/media.
Убедитесь, что в личном кабинете на странице сервиса Object Storage:
в списке бакетов отображаются созданные вами бакеты;
класс хранения созданных бакетов — Стандартный.
8. Создайте и запустите контейнер c django-приложением
-
Откройте меню загруженного образа django-app и нажмите Создать Container App.
-
Заполните поля и активируйте опции:
-
Название контейнера — глобально уникальное имя, на базе которого формируется адрес вашего приложения в домене *.containers.cloud.ru.
-
Порт контейнера — порт контейнера, который должен совпадать с портом вашего приложения. В этом сценарии используем порт 8000.
-
vCPU/RAM — количество vCPU и RAM, которые выделяются для каждого экземпляра контейнера при обработке вызова. Выберите конфигурацию 0.2 vCPU - 512 MB.
-
Минимальное и максимальное количество экземпляров при масштабировании сервиса. По умолчанию происходит масштабирование с 0, что может вызывать небольшую задержку при старте вашего приложения. Установите минимальное количество экземпляров — 0, а максимальное — 1.
-
Публичный адрес — активируйте опцию, чтобы получить URL-адрес для вызова приложения из интернета.
-
Автоматическое развертывание — активируйте опцию, чтобы каждый раз после загрузки в Artifact Registry новой версии образа на стороне Container Apps автоматически создавалась новая ревизия контейнера.
-
-
Нажмите Создать.
Контейнер будет создан в течение нескольких секунд. Отобразится интерфейс Container Apps с информацией о созданном контейнере.
-
Нажмите Создать ревизию на основе выбранной.
-
Добавьте том — бакет в сервисе Object Storage для БД приложения:
-
В разделе Тома главного контейнера выберите Добавить том.
-
Укажите тип тома — постоянный.
-
Введите название тома, например django-app-db.
-
Выберите созданный на предыдущем этапе бакет для базы данных.
-
Нажмите Добавить.
-
В разделе Параметры монтирования в поле Путь укажите путь до папки с базой данных.
-
-
Добавьте том — бакет в сервисе Object Storage для хранения медиаданных:
-
В разделе Тома главного контейнера выберите Добавить том.
-
Укажите тип тома — постоянный.
-
Введите название тома, например django-media.
-
Выберите созданный на предыдущем этапе бакет для медиаданных.
-
Нажмите Добавить.
-
В разделе Параметры монтирования в поле Путь укажите путь до папки с медиаданными.
-
-
Перейдите на вкладку Переменные контейнера и укажите в качестве значения переменных пути к папкам с БД и с медиафайлами:
-
DB_DIR=/files/database
-
MEDIA_ROOT=/files/media
-
ADMIN_USERNAME=admin
-
ADMIN_PASSWORD=****
-
-
Нажмите Создать.
Откроется страница сервиса Container Apps. Контейнер будет запущен в течение нескольких секунд.
Дождитесь, когда контейнер и ревизия перейдут в статус «Выполняется».

9. Проверьте работоспособность развернутого django-приложения
-
Перейдите по публичному URL-адресу контейнера с django-приложением:
Отобразится окно входа в панель администратора.
-
Укажите логин и пароль. Отобразится каталог с изображениями.
-
Попробуйте загрузить изображение.
Даже если страница закрыта и приложение не используется, загруженные в базу данных изображения сохранятся.
10. Создайте и запустите контейнер c nginx-сервисом
-
Перейдите в сервис Container Apps через меню в левом верхнем углу экрана.
-
Нажмите Создать.
-
Укажите название контейнера и активируйте опцию Привилегированный режим, чтобы обеспечить доступ nginx-сервиса к root-пользователю.
-
Не меняйте конфигурацию. Для nginx-сервиса достаточно минимальной конфигурации, выбранной по умолчанию: vCPU и RAM: 0.1 vCPU – 256 MB.
-
Выберите Docker-образ, который вы загрузили в Artifact Registry, перейдя в реестр django-app.cr.cloud.ru и репозиторий nginx-service.
-
Укажите порт контейнера — 80.
-
Добавьте том — бакет в сервисе Object Storage для хранения медиаданных:
-
В разделе Тома главного контейнера выберите Добавить том.
-
Укажите тип тома — постоянный.
-
Введите название тома, например django-app-media-data.
-
Выберите созданный на шаге 7 бакет для медиаданных.
-
Нажмите Добавить.
-
В разделе Параметры монтирования в поле Путь укажите путь до папки с медиаданными /files/media.
-
-
Нажмите Следующий шаг.
-
Задайте количество ресурсов:
-
Минимальное количество экземпляров: 0.
-
Максимальное количество экземпляров: 1.
-
-
Нажмите Создать.
Откроется страница сервиса Container Apps. Контейнер будет запущен в течение нескольких секунд.
Дождитесь, когда контейнер и ревизия перейдут в статус «Выполняется».
11. Проверьте работоспособность развернутого nginx-сервиса
Перейдите по публичному URL-адресу контейнера с nginx-сервисом.
Отобразится каталог изображений, загруженных с помощью сервиса Django.
Результат
Вы научились:
-
создавать репозитории в существующих реестрах Artifact Registry;
-
создавать и запускать контейнер через быстрое меню в Artifact Registry;
-
добавлять постоянный том Object Storage, который позволяет сохранить ваши данные, когда запросы к приложению не поступают;
-
разворачивать приложения, которые совместно используют один и тот же бакет Object Storage.
Смотрите обучающее видео по сервису Container Apps и узнайте о том, как сохранять данные в бакете при нулевом трафике.
- Перед началом работы
- 1. Подготовьте среду
- 2. Клонируйте или скачайте репозиторий c GitVerse
- 3. Соберите образ с django-приложением и присвойте тег
- 4. Загрузите Docker-образ c django-приложением в реестр
- 5. Соберите образ с nginx-сервисом и присвойте тег
- 6. Загрузите Docker-образ c nginx-сервисом в реестр
- 7. Создайте бакеты в Object Storage
- 8. Создайте и запустите контейнер c django-приложением
- 9. Проверьте работоспособность развернутого django-приложения
- 10. Создайте и запустите контейнер c nginx-сервисом
- 11. Проверьте работоспособность развернутого nginx-сервиса
- Результат