# Задания Справочную информацию можно найти на сайте Docker: https://docs.docker.com/engine/reference/commandline/cli/ (и на соседних страницах), \ а также в интернете вообще - например, на StackOverflow ### 1. Установка Установите Docker на виртуальную машину ### 2. Базовые команды 1. Запустите Docker hello-world 2. Загрузите образ busybox с Docker Hub 3. Напечатайте 'Hello from busybox!', запустив контейнер на основе образа busybox с командой echo 4. Запустите контейнер с busybox в интерактивном режиме и напечатайте 'Hello, World!' изнутри. После этого завершите выполнение контейнера. 5. Запустите контейнер как в пункте 3, но присвойте ему имя.\ После того, как его выполнение завершится, запустите его же - еще раз, по имени. Убедитесь что он выведет то же самое. 6. Создайте именованный контейнер как в пункте 3, но так, чтобы он не запустился сразу же. Запустите его руками. 7. Запустите контейнер с busybox, который каждую секунду печатает текущее время, но запустите его в отвязанном от терминала режиме.\ Так чтобы он не печатал ничего вам на стандартный вывод. \ Посмотрите логи этого контейнера, и убедитесь что он работает. 8. Выведите список всех контейнеров. Сначала работающих, потом - всех, даже остановленных. Потом - только остановленных. 9. Удалите все остановленные контейнеры, включая те, что так и не запустились, если такие были. 10. Приаттачьтесь к терминалу запущенного контейнера, который печатает текущее время каждую секунду, так чтобы увидеть поток этих строк.\ В параллельном терминале, поставьте выполнение контейнера на паузу, но без его полной остановки.\ Убедитесь что печать приостановилась.\ Возобновите работу контейнера.\ Сделайте детач терминала от контейнера, но так, чтобы он не остановился, а продолжил работу.\ В конечном итоге остановите контейнер извне. 11. Создайте какой-либо текстовый файл.\ Запустите контейнер с busybox в интерактивном режиме.\ В отдельном терминале скопируйте файл внутрь контейнера, прямо в корневую директорию.\ В терминале с интерактивным режимом - выведите содержимое файла на экран.\ Пока что не останавливайте контейнер. 12. В терминале, отдельном от терминала контейнера с интерактивным режимом, сделайте листинг корневой директории контейнера.\ Также, с помощью одной из команд Docker, выведите на экран список изменений в файловой системе контейнера по сравнению\ с базовым образом.\ После этого, в этом же терминале, удалите из контейнера скопированный туда файл.\ Теперь интерактивный контейнер можно остановить. ### 3. Volumes 1. Запустите контейнер с busybox в интерактивном режиме и примонтируйте к нему какую-либо локальную директорию, \ например домашнюю директорию пользователя. \ Просмотрите содержимое директории с помощью, например, команды `ls`. 2. Создайте именованный том данных(volume). 3. Выведите список всех томов данных. Убедитесь что созданный вами том существует. Просмотрите свойства своего тома. 4. Запустите контейнер с busybox, при этом подключив к нему созданный вами именованный том. 5. Создайте в директории тома, внутри контейнера, какой-либо файл. Теперь остановите контейнер, удалите его и запустите снова,\ опять же примонтировав к нему созданный вами том. Убедитесь что файл находится на месте. 6. Остановите контейнеры и удалите все неиспользуемые тома данных. ### 4. Сеть 1. Создайте именованную сеть Docker типа `bridge`, адреса которой находятся в диапазоне `172.168.0.0/16` и \ шлюз которой находится по адресу `172.168.0.1`. 2. Выведите список всех существующих сетей Docker. Просмотрите параметры вашей сети, убедитесь что она создана правильно. 3. В полученной вами директории `cats_app` находится веб-приложение на Python. \ Запустите контейнер с именем `cats_app` из образа `python:3.12` в интерактивном режиме, примонтировав к нему \ директорию с этим приложением, так чтобы внутри образа директория была доступна как `/app`, и также \ чтобы команда, запускающаяся при старте образа была `/bin/bash`, чтобы вам таким образом был доступен шелл, \ и также, чтобы контейнер был подключен к созданной вами сети. 4. В директории `/app` внутри контейнера находятся два скрипта - `install.sh` и `run.sh`, которые скачивают зависимости приложения, и запускают приложение соответственно. \ Сделайте `cd` в эту директорию и последовательно вызовите сначала `install.sh` а затем `run.sh`. 5. Приложение недоступно извне. Для его запуска необходимо запустить обратный прокси в этой же сети. \ В полученной вами директории `cats_app` находится файл конфигурации `nginx`. \ В отдельном терминале, запустите контейнер из образа `nginx`, подключив его к созданной вами сети, и пробросив наружу \ порт 80(на локальный порт 8080, к примеру), при этом примонтировав упомянутый файл конфигурации \ на место файла `/etc/nginx/nginx.conf` внутри контейнера. \ Теперь, убедитесь что приложение доступно на локальной машине на порту 8080. 6. Приложение отслеживает количество запросов, эту статистику можно получить через URL `/request_count`. \ Но nginx настроен таким образом, чтобы URL `/request_count` не был доступен извне. \ Перезапустите контейнер `cats_app` и приложение в нем так, чтобы этот метод был доступен на порту 5001, \ и только с локальной машины, на которой запущен Docker. \ Подсказка: само приложение внутри контейнера работает на порту 5000. 7. Запустите контейнер `cats_app`, так чтобы оно было доступно из `host` сети безо всяких ограничений. \ N.B.: это работает только на Linux, и не поддерживается, например в Docker Desktop для Windows или Mac. ### 5. Работа с образами 1. Напишите Dockerfile на основе busybox, который печает `Hello, World` при запуске. 2. Соберите образ из полученного Dockerfile, и присвойте ему имя `hello`. 3. Выведите список всех созданных и загруженных образов и убедитесь что среди них есть ваш образ. \ Выведите на экран его свойства и просмотрите их. 4. Запустите контейнер созданный из вашего образа, и убедитесь что он печатает `Hello, World` при запуске. 5. Перепишите Dockerfile так, чтобы на печать в результате запуска контейнера вызывалось бы `Hello, $name`, \ при этом чтобы значение `$name` бралось из переменной среды, и по умолчанию оно было бы равно `World`. \ Снова соберите образ `hello`. \ Запустите контейнер, при этом установив при запуске переменную `name` в значение, например, `Student`. \ Убедитесь, что контейнер напечатает `Hello, Student`. 6. Добавьте тэг к вашему образу, например тэг `hello:1.0.0`. 7. Сохраните образ `hello` и все его тэги в tar-архив. Удалите все теги этого образа из Docker. \ Восстановите образы из tar-архива. Убедитесь что все работает. 8. Приложение `cats_app` хорошо подходит для контейнеризации. \ Напишите для него докер-файл, отталкиваясь от образа `python:3.12`. \ Этап установки зависимостей, т.е. запуск скрипта `install.sh` должен происходить \ при сборке образа, а не при его запуске. \ Внутри контейнера, приложение должно находиться в директории `/app`. Создайте из написанного Dockerfile образ с именем `cats_app`. \ Запустите контейнер на основе этого образа, разрешив доступ к нему по порту 5000. \ Убедитесь, что приложение работает. 9. Запустите контейнер из образа `registry:2`, примонтировав куда-либо директорию контейнера \ `/var/lib/registry` чтобы использовать ее как постоянное хранилище, и открыв порт 5000 для этого контейнера, \ перенаправив его на порт 12345 для локальной машины(перенаправьте именно для локальной машины \ дабы реестр контейнеров не был доступен извне). \ 10. Теперь у вас на машине, а именно на `localhost:12345`, запущен Docker Registry, и вы можете сохранять образы туда. \ Создайте для образов `hello` и `cats_app` соответствующие этому реестру теги. \ Загрузите туда образы этих приложений, включая все их теги. \ Удалите их из Docker. \ Теперь загрузите их из registry, проверьте что все работает.