You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

145 lines
13 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Задания
Справочную информацию можно найти на сайте 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, проверьте что все работает.