- Для выполнения заданий обязательно ознакомьтесь с инструкцией по экономии облачных ресурсов. Это нужно, чтобы не расходовать средства, полученные в результате использования промокода.
- Своё решение к задачам оформите в вашем GitHub репозитории.
- В личном кабинете отправьте на проверку ссылку на .md-файл в вашем репозитории.
- Сопроводите ответ необходимыми скриншотами.
Примечание: Ознакомьтесь со схемой виртуального стенда по ссылке
- Убедитесь что у вас НЕ(!) установлен
docker-compose
, для этого получите следующую ошибку от командыdocker-compose --version
Command 'docker-compose' not found, but can be installed with:
sudo snap install docker # version 24.0.5, or
sudo apt install docker-compose # version 1.25.0-1
See 'snap info docker' for additional versions.
В случае наличия установленного в системе docker-compose
- удалите его.
2. Убедитесь что у вас УСТАНОВЛЕН docker compose
(без тире) версии не менее v2.24.X, для это выполните команду docker compose version
- Сделайте в своем github пространстве fork репозитория. Примечание: В связи с доработкой кода python приложения. Если вы уверены что задание выполнено вами верно, а код python приложения работает с ошибкой то используйте вместо main.py файл old_main.py(просто измените CMD)
- Создайте файл с именем
Dockerfile.python
для сборки данного проекта(для 3 задания изучите https://docs.docker.com/compose/compose-file/build/ ). Используйте базовый образpython:3.9-slim
. Обязательно используйте конструкциюCOPY . .
в Dockerfile. Не забудьте исключить ненужные в имадже файлы с помощью dockerignore. Протестируйте корректность сборки. - (Необязательная часть, *) Изучите инструкцию в проекте и запустите web-приложение без использования docker в venv. (Mysql БД можно запустить в docker run).
- (Необязательная часть, *) По образцу предоставленного python кода внесите в него исправление для управления названием используемой таблицы через ENV переменную.
!!! В процессе последующего выполнения ДЗ НЕ изменяйте содержимое файлов в fork-репозитории! Ваша задача ДОБАВИТЬ 5 файлов: Dockerfile.python
, compose.yaml
, .gitignore
, .dockerignore
,bash-скрипт
. Если вам понадобилось внести иные изменения в проект - вы что-то делаете неверно!
- Создайте в yandex cloud container registry с именем "test" с помощью "yc tool" . Инструкция
- Настройте аутентификацию вашего локального docker в yandex container registry.
- Соберите и залейте в него образ с python приложением из задания №1.
- Просканируйте образ на уязвимости.
- В качестве ответа приложите отчет сканирования.
- Изучите файл "proxy.yaml"
- Создайте в репозитории с проектом файл
compose.yaml
. С помощью директивы "include" подключите к нему файл "proxy.yaml". - Опишите в файле
compose.yaml
следующие сервисы:
-
web
. Образ приложения должен ИЛИ собираться при запуске compose из файлаDockerfile.python
ИЛИ скачиваться из yandex cloud container registry(из задание №2 со *). Контейнер должен работать в bridge-сети с названиемbackend
и иметь фиксированный ipv4-адрес172.20.0.5
. Сервис должен всегда перезапускаться в случае ошибок. Передайте необходимые ENV-переменные для подключения к Mysql базе данных по сетевому имени сервисаweb
-
db
. image=mysql:8. Контейнер должен работать в bridge-сети с названиемbackend
и иметь фиксированный ipv4-адрес172.20.0.10
. Явно перезапуск сервиса в случае ошибок. Передайте необходимые ENV-переменные для создания: пароля root пользователя, создания базы данных, пользователя и пароля для web-приложения.Обязательно используйте уже существующий .env file для назначения секретных ENV-переменных!
-
Запустите проект локально с помощью docker compose , добейтесь его стабильной работы: команда
curl -L http://127.0.0.1:8090
должна возвращать в качестве ответа время и локальный IP-адрес. Если сервисы не стартуют воспользуйтесь командами:docker ps -a
иdocker logs <container_name>
. Если вместо IP-адреса вы получаетеNULL
--убедитесь, что вы шлете запрос на порт8090
, а не 5000. -
Подключитесь к БД mysql с помощью команды
docker exec -ti <имя_контейнера> mysql -uroot -p<пароль root-пользователя>
(обратите внимание что между ключем -u и логином root нет пробела. это важно!!! тоже самое с паролем) . Введите последовательно команды (не забываем в конце символ ; ):show databases; use <имя вашей базы данных(по-умолчанию example)>; show tables; SELECT * from requests LIMIT 10;
. -
Остановите проект. В качестве ответа приложите скриншот sql-запроса.
- Запустите в Yandex Cloud ВМ (вам хватит 2 Гб Ram).
- Подключитесь к Вм по ssh и установите docker.
- Напишите bash-скрипт, который скачает ваш fork-репозиторий в каталог /opt и запустит проект целиком.
- Зайдите на сайт проверки http подключений, например(или аналогичный):
https://check-host.net/check-http
и запустите проверку вашего сервисаhttp://<внешний_IP-адрес_вашей_ВМ>:8090
. Таким образом трафик будет направлен в ingress-proxy. ПРИМЕЧАНИЕ: приложение(old_main.py) весьма вероятно упадет под нагрузкой, но успеет обработать часть запросов - этого достаточно. Обновленная версия (main.py) не прошла достаточного тестирования временем, но должна справиться с нагрузкой. - (Необязательная часть) Дополнительно настройте remote ssh context к вашему серверу. Отобразите список контекстов и результат удаленного выполнения
docker ps -a
- В качестве ответа повторите sql-запрос и приложите скриншот с данного сервера, bash-скрипт и ссылку на fork-репозиторий.
- Напишите и задеплойте на вашу облачную ВМ bash скрипт, который произведет резервное копирование БД mysql в директорию "/opt/backup" с помощью запуска в сети "backend" контейнера из образа
schnitzler/mysqldump
при помощиdocker run ...
команды. Подсказка: "документация образа." - Протестируйте ручной запуск
- Настройте выполнение скрипта раз в 1 минуту через cron, crontab или systemctl timer. Придумайте способ не светить логин/пароль в git!!
- Предоставьте скрипт, cron-task и скриншот с несколькими резервными копиями в "/opt/backup"
Скачайте docker образ hashicorp/terraform:latest
и скопируйте бинарный файл /bin/terraform
на свою локальную машину, используя dive и docker save.
Предоставьте скриншоты действий .
Добейтесь аналогичного результата, используя docker cp.
Предоставьте скриншоты действий .
Предложите способ извлечь файл из контейнера, используя только команду docker build и любой Dockerfile.
Предоставьте скриншоты действий .
Запустите ваше python-приложение с помощью runC, не используя docker или containerd.
Предоставьте скриншоты действий .