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.

13 KiB

Задания

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