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