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

# Задания
Справочную информацию можно найти на сайте 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 для этого контейнера, \
перенаправив его на порт 1235 для локальной машины(перенаправьте именно для локальной машины \
дабы реестр контейнеров не был доступен извне). \
10. Теперь у вас на машине, а именно на `localhost:12345`, запущен Docker Registry, и вы можете сохранять образы туда. \
Создайте для образов `hello` и `cats_app` соответствующие этому реестру теги. \
Загрузите туда образы этих приложений, включая все их теги. \
Удалите их из Docker. \
Теперь загрузите их из registry, проверьте что все работает.