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