Лаб. работа "Основы Docker. Управление контейнерами"

Лабораторная работа по теме “Основы Docker. Управление контейнерами”

Цель работы

Изучить основные концепции технологии контейнеризации Docker. Получить практические навыки поиска и загрузки образов, запуска, остановки и управления жизненным циклом контейнеров с использованием различных параметров командной строки.

Краткие теоретические сведения

Контейнеризация — это метод виртуализации на уровне операционной системы, который позволяет упаковывать приложение и его зависимости в изолированную среду, называемую контейнером. В отличие от виртуальных машин, контейнеры не включают в себя гостевую ОС, а используют ядро хост-системы. Это делает их легковесными, быстрыми и портативными.

Docker — это открытая платформа для разработки, доставки и запуска контейнеризированных приложений. Ключевые компоненты Docker:

  • Docker Engine: фоновая служба (демон), которая управляет созданием и запуском контейнеров.
  • Образ (Image): шаблон для чтения, содержащий инструкции для создания контейнера. Образ включает в себя код приложения, библиотеки, переменные окружения и файлы конфигурации.
  • Контейнер (Container): запущенный экземпляр образа. Он является изолированным процессом в системе со своим собственным окружением.
  • Реестр (Registry): хранилище для образов. Самый известный публичный реестр — Docker Hub.

Rootless Docker — это режим работы Docker, который позволяет пользователям без правroot запускать и управлять контейнерами. Это значительно повышает безопасность системы, так как потенциальный прорыв из контейнера не предоставит злоумышленнику привилегий суперпользователя на хост-машине. В этом режиме демон Docker и контейнеры запускаются в пространстве имен пользователя.

Краткий справочник по параметрам командной строки Docker

При работе с Docker вы будете постоянно использовать параметры (флаги) для уточнения команд. Ниже приведены наиболее распространенные из них.

Основная команда:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

Эта команда создает и запускает новый контейнер из указанного образа.

  • -d или --detach: Запускает контейнер в фоновом (detached) режиме. Управление возвращается в терминал, а контейнер продолжает работать в фоне.
  • -i или --interactive: Оставляет поток стандартного ввода (STDIN) открытым, позволяя взаимодействовать с контейнером.
  • -t или --tty: Выделяет псевдо-терминал (TTY), что необходимо для работы с командной оболочкой внутри контейнера. Часто используется в связке -it.
  • -p <порт_хоста>:<порт_контейнера> или --publish: Пробрасывает порт из контейнера на хост-машину. Например, -p 8080:80 сделает порт 80 контейнера доступным на порту 8080 хоста.
  • --name <имя>: Присваивает контейнеру человекочитаемое имя. Если не указать, Docker сгенерирует случайное имя (например, vigilant_murdock).
  • --rm: Автоматически удаляет контейнер после его остановки. Удобно для короткоживущих задач, чтобы не засорять систему остановленными контейнерами.
  • -e <КЛЮЧ>=<ЗНАЧЕНИЕ> или --env: Устанавливает переменную окружения внутри контейнера. Например, -e "APP_MODE=production".
  • -v <путь_на_хосте>:<путь_в_контейнере> или --volume: Монтирует директорию или файл с хост-машины внутрь контейнера. Это позволяет сохранять данные или изменять конфигурацию “на лету”.

Другие полезные команды и их параметры

  • docker ps [OPTIONS] (просмотр контейнеров)
    • -a или --all: Показывает все контейнеры, включая остановленные. По умолчанию отображаются только запущенные.
    • -q или --quiet: Выводит только числовые идентификаторы контейнеров.
  • docker images [OPTIONS] (просмотр образов)
    • -a или --all: Показывает все образы, включая промежуточные слои.
  • docker exec [OPTIONS] CONTAINER COMMAND (выполнение команды в запущенном контейнере)
    • -it: Позволяет запустить интерактивную сессию (например, оболочку bash) в уже работающем контейнере.
  • docker rm [OPTIONS] CONTAINER... (удаление контейнеров)
    • -f или --force: Принудительно удаляет контейнер, даже если он запущен (не рекомендуется, лучше сначала остановить через docker stop).
  • docker rmi [OPTIONS] IMAGE... (удаление образов)
    • -f или --force: Принудительно удаляет образ, даже если на его основе есть контейнеры.

Требования к окружению

  • Операционная система: Debian 13 “Trixie” или новее.
  • Доступ в Интернет.
  • Учетная запись пользователя без прав root (стандартный пользователь).

Порядок выполнения работы

Часть 1. проверка работа Docker

  1. Проверка установки. Убедитесь, что Docker Engine запущен и работает корректно.

    1docker version
    

    Вы должны увидеть информацию о клиенте и сервере (в секции Server не должно быть ошибок).

  2. Запуск первого контейнера. Команда hello-world — стандартный способ проверить работоспособность Docker.

    1docker run hello-world
    

    Если вы видите приветственное сообщение от Docker, значит, установка прошла успешно.

Часть 2. Работа с образами

  1. Поиск образов в Docker Hub. Найдем официальный образ веб-сервера nginx.

    1docker search nginx
    

    В выводе вы увидите список образов. Образы с пометкой [OK] в столбце OFFICIAL являются официальными сборками от разработчиков ПО.

  2. Загрузка образа. Скачаем последнюю версию (latest) образа nginx и легковесный образ alpine из Docker Hub.

    1# Скачиваем nginx
    2docker pull nginx
    3
    4# Скачиваем alpine linux
    5docker pull alpine
    
  3. Просмотр списка локальных образов. Выведем список всех образов, которые были загружены на вашу машину.

    1docker images
    

    Обратите внимание на столбцы: REPOSITORY (имя), TAG (версия), IMAGE ID (уникальный идентификатор), CREATED и SIZE.

  4. Удаление образа. Удалим образ hello-world, так как он больше не нужен.

    1docker rmi hello-world
    

    Примечание: Нельзя удалить образ, если на его основе запущен или существует остановленный контейнер. Сначала нужно удалить контейнер.

Часть 3. Запуск и управление контейнерами

  1. Запуск контейнера в интерактивном режиме. Запустим контейнер на основе alpine и выполним в нем команду ls -l. Контейнер завершит работу сразу после выполнения команды.

    1docker run alpine ls -l
    

    Теперь запустим контейнер с доступом к его командной оболочке (sh).

    • Ключ -i (--interactive) оставляет STDIN открытым.
    • Ключ -t (--tty) выделяет псевдо-терминал.
    1docker run -it alpine sh
    

    Вы окажетесь внутри командной строки контейнера. Выполните несколько команд (whoami, pwd, exit для выхода).

  2. Запуск контейнера в фоновом (detached) режиме. Запустим веб-сервер nginx в фоновом режиме.

    • Ключ -d (--detach) запускает контейнер в фоне.
    • Ключ --name задает удобное имя для контейнера.
    • Ключ -p (--publish) пробрасывает порт. Формат: [хост_порт]:[контейнер_порт].

    В rootless-режиме пользователь не может использовать порты ниже 1024. Поэтому мы пробросим порт 80 контейнера на порт 8080 хоста.

    1docker run -d --name web-server -p 8080:80 nginx
    
  3. Просмотр списка запущенных контейнеров.

    1docker ps
    

    Эта команда покажет все активные контейнеры. Для просмотра всех контейнеров (включая остановленные) используйте ключ -a.

    1docker ps -a
    
  4. Проверка работы веб-сервера. Откройте браузер и перейдите по адресу http://localhost:8080 или используйте curl.

    1curl http://localhost:8080
    

    Вы должны увидеть приветственную страницу Nginx.

  5. Просмотр логов контейнера. Посмотрим логи запущенного контейнера web-server.

    1docker logs web-server
    
  6. Выполнение команд внутри работающего контейнера. Используем docker exec, чтобы запустить команду ls внутри контейнера web-server без подключения к нему.

    1docker exec web-server ls /usr/share/nginx/html
    

    Теперь подключимся к командной оболочке запущенного контейнера.

    1docker exec -it web-server bash
    

    Вы окажетесь внутри работающего контейнера Nginx. Введите exit для выхода.

  7. Остановка и запуск контейнера.

     1# Останавливаем контейнер
     2docker stop web-server
     3
     4# Убеждаемся, что он остановлен (в `docker ps` его нет)
     5docker ps
     6
     7# Запускаем его снова
     8docker start web-server
     9
    10# Проверяем, что он снова работает
    11docker ps
    
  8. Удаление контейнера. Чтобы удалить контейнер, его необходимо сначала остановить.

    1# Останавливаем
    2docker stop web-server
    3
    4# Удаляем
    5docker rm web-server
    6
    7# Проверяем, что он удален
    8docker ps -a
    

Часть 4. Очистка системы

Docker может оставлять после себя много “мусора”: остановленные контейнеры, неиспользуемые образы и сети.

  1. Удаление всех остановленных контейнеров.

    1docker container prune
    

    Система запросит подтверждение.

  2. Полная очистка системы. Команда docker system prune удаляет все остановленные контейнеры, неиспользуемые сети, образы без тегов (dangling images) и кэш сборки.

    1docker system prune -a
    

    Ключ -a удаляет все неиспользуемые образы, а не только “висячие”. Используйте с осторожностью!

Задания для самостоятельного выполнения

  1. Запуск контейнера с определенной версией ПО. Найдите в Docker Hub образ базы данных postgres. Используя теги, загрузите и запустите контейнер с версией 14.12 (postgres:14.12). Присвойте контейнеру имя my-postgres.

    Подсказка: Для запуска PostgreSQL требуется установить пароль суперпользователя через переменную окружения POSTGRES_PASSWORD.

    Пример команды для справки:

    1docker run -d --name my-postgres -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 postgres:14.12
    
  2. Работа с томами (volumes) для сохранения данных. Создайте в своей домашней директории папку my_web_content и в ней файл index.html со следующим содержанием: <h1>Hello from my local machine!</h1>. Запустите контейнер nginx, но на этот раз “подключите” вашу локальную папку my_web_content внутрь контейнера по пути /usr/share/nginx/html. Используйте флаг -v. Проверьте, что при обращении к http://localhost:8080 (или на каком порту вы запустили nginx) отображается ваше сообщение. Измените содержимое файла index.html на хосте и обновите страницу в браузере. Изменения должны примениться мгновенно.

  3. Использование флага--rm Запустите контейнер alpine с командой echo "This container will be removed" и флагом --rm. После выполнения команды убедитесь (с помощью docker ps -a), что контейнер не остался в списке остановленных.

  4. Получение детальной информации о контейнере. Запустите любой контейнер (например, nginx) в фоновом режиме. Используя команду docker inspect <имя_или_id_контейнера>, найдите и выпишите в отчет внутренний IP-адрес этого контейнера.

  5. Очистка ресурсов по фильтру. Создайте несколько контейнеров alpine, выполнив команду docker run alpine sleep 1 несколько раз. Некоторые из них завершатся. Затем запустите один контейнер в фоновом режиме с долгой командой: docker run -d --name long-runner alpine sleep 300. С помощью одной команды удалите все контейнеры, которые имеют статус exited (завершен).

    Подсказка: docker container prune делает это, но попробуйте составить команду самостоятельно, используя docker ps -a с фильтрами и docker rm.

Контрольные вопросы

  1. В чем ключевое отличие контейнера от виртуальной машины?
  2. Что такое образ Docker и что такое контейнер Docker? Какая между ними связь?
  3. Каково основное преимущество использования Docker в rootless режиме?
  4. Объясните назначение ключей –d,-p,-it в команде docker run.
  5. Как посмотреть логи контейнера, запущенного в фоновом режиме?
  6. В чем разница между командами docker stop иdocker rm?
  7. Как выполнить команду cat /etc/os-release внутри уже запущенного контейнера с именем my-container?

Требования к отчету

Отчет по лабораторной работе должен содержать:

  1. Титульный лист.
  2. Цель работы.
  3. Пошаговое описание выполнения работы с приведением всех вводимых команд и их выводов (можно в виде скриншотов или текстовых блоков).
  4. Письменные ответы на контрольные вопросы.
  5. Вывод, в котором необходимо кратко описать полученные знания и навыки.
← Лаб. работа "Мониторинг и анализ системы … Лаб. работа "Docker: Сети" →