Кафедра ИСиТ УО ВГТУ
  • Специальности
    • Экономика электронного бизнеса
    • Информационные системы
    • Information Control Systems
  • Каталог
  • Сайт кафедры
  • Сервисы
    • GitLab
    • JupyterHub
    • Soft
  1. ИСиТ
  2. ИППРПО
  3. Практика
  4. Лаб. работа “Основы Docker. Управление контейнерами”
  • ИСиТ
    • АОС
      • Теория
        • Введение в операционные системы
        • Управление памятью
        • Управление процессами
        • Система ввода-вывода
        • Информационная безопасность
        • Виртуализация
      • Практика
    • РВПсИПП
      • Теория
        • Настройка среды разработки для PHP
        • Разработка web-приложений на базе фреймворков
        • Основы Laravel
        • Шаблоны в Laravel
        • Модели и базы данных в Laravel
        • Формы и валидация в Laravel
        • Аутентификация и авторизация в Laravel
        • Создание REST API в Laravel
        • Работа с файлами и изображениями в Laravel
        • Тестирование и отладка в Laravel
        • Введение в фреймворк Symfony
        • Маршруты и контроллеры в Symfony
        • Шаблоны и Twig в Symfony
        • Формы и валидация в Symfony
        • Доступ к базам данных в Symfony
        • Аутентификация и авторизация в Symfony
        • Сервисы и зависимости в Symfony
        • Создание REST API в Symfony
        • Работа с файлами и медиа в Symfony
        • Сравнение и выбор фреймворка
        • Развертывание веб-приложения
      • Практика
        • Лаб. работа 1 “Создание нового приложения Laravel”
        • Лаб. работа 2 “Добавление главной страницы и базовых маршрутов”
        • Лаб. работа 3 “Создание моделей, миграций и сидеров”
        • Лаб. работа 4 “Создание индексных страниц и пагинация”
        • Лаб. работа 5 “Создание форм для работы с сущностями”
        • Лаб. работа 6 “Работа с файлами (эмуляция S3-хранилища)”
        • Лаб. работа “Создание маршрутов в Laravel”
        • Лаб. работа “Работа с базами данных в Laravel”
        • Лаб. работа “Работа с формами в Laravel”
        • Лаб. работа “Аутентификация и авторизация в Laravel”
        • Лаб. работа “Работа с файлами в Laravel”
        • Лаб. работа “Тестирование и оптимизация в Laravel”
        • Лаб. работа “Создание REST API в Laravel”
        • Лаб. работа “Основы Symfony”
        • Лаб. работа “Шаблоны и представления в Symfony”
        • Лаб. работа “Работа с базами данных в Symfony”
        • Лаб. работа “Фомы и аутентификация в Symfony”
        • Лаб. работа “Сервисы и зависимости в Symfony”
        • Лаб. работа “REST API в Symfony”
        • Лаб. работа “Работа с медиа контентом в Symfony”
        • Лаб. работа “Создание и развертывание проекта”
        • Расчетно-графическая работа: Разработка веб-приложения с использованием Laravel
          • Методические рекомендации по выполнению работы
          • Варианты заданий для расчетно-графической работы
    • ПСП
      • Теория
        • Введение
        • Протокол HTTP
        • Программирование с использованием сокетов
        • Введение в PHP
        • Работа с базами данных в PHP
        • Объектно-ориентированные возможности PHP
        • Настройка среды разработки для PHP
        • Разработка web-приложений на базе фреймворков
      • Практика
        • Программное обеспечение
        • Регистрация в JupyterHub
        • Лаб. работа “Почтовые протоколы”
        • Лаб. работа “Протокол FTP”
        • Лаб. работа “Протокол HTTP”
        • Лаб. работа “Программирование сетевых приложений с использованием сокетов”
        • Лаб. работа “Основы PHP”
        • Лаб. работа “Массивы в PHP”
        • Лаб. работа “Создание веб-приложений с использованием Slim”
      • Темы курсовых проектов по дисциплине “Программирование сетевых приложений”
    • Компьютерные сети
      • Теория
        • Введение в компьютерные сети
        • Топологии сетей
        • Кодирование и мультиплексирование
        • Стеки протоколов
        • Адресация в компьютерных сетях
        • Система доменных имен (DNS)
        • Программирование с использованием сокетов
        • Введение в PHP
        • Протокол HTTP
        • Введение в компьютерные сети
      • Практика
        • Программное обеспечение
        • Регистрация в JupyterHub
        • Лаб. работа “Почтовые протоколы”
        • Лаб. работа “Протокол FTP”
        • Лаб. работа “Протокол HTTP”
        • Лаб. работа “Программирование сетевых приложений с использованием сокетов”
        • Лаб. работа “Основы PHP”
        • Лаб работа “Массивы в PHP”
    • РиОИИС
      • Теория
        • Классификация оптимизационных задач
        • Генетические алгоритмы
        • Системы массового обслуживания
        • Теория игр
        • Машинное обучение
        • Глубокое обучение (Deep learning)
        • Основы функционального программирования
        • Основы программирования на Haskell
        • Введение в логическое программирование
        • Инференция и рассуждения в логическом программировании
        • Разработка экспертных систем
        • Интеллектуальные системы и их архитектура
        • Веб-скрэйпинг
        • Сбор данных с открытых API
      • Практика
        • JupyterHub
        • Лаб. работа "Методы одномерной оптимизации"
          • Лаб. работа “Методы одномерной оптимизации”
        • Лаб. работа “Методы многомерной оптимизации”
        • Лаб. работа “Основы программирования на Python”
        • Лаб. работа “Функции в Python”
        • Лаб. работа “Рекурсия в Python”
        • Лаб. работа “Итераторы в Python”
        • Лаб. работа “Генетические алгоритмы”
        • Лаб. работа “Haskell”
        • Лаб. работа “Логическое программирование”
        • Лаб. работа “Сбор данных с помощью веб-скрейпинга”
        • Лаб. работа “Предобработка данных”
        • Лаб. работа “Машинное обучение: классификация”
        • Лаб. работа “Создание и обучение простейших нейронных сетей”
        • Лаб. работа “Системы массового обслуживания”
        • Лаб. работа “Обработка естественного языка”
        • Лаб. работа “Компьютерное зрение”
        • Лаб. работа “Нейросети и глубокое обучение”
    • КСКР
      • Практика
        • Лаб. работа “Одномерные и двумерные массивы в C#”
        • Лаб. работа “Обращение матриц в C#”
    • Системное программирование
      • Теория
        • Управление памятью в Windows
        • Файловые операции в Windows
        • Управление процессами в Windows
        • Графический интерфейс Windows
        • ОС Unix
      • Практика
        • Лаб. работа “Работа с динамической памятью в Windows”
        • Лаб. работа “Операции с файлами в Windows”
        • Лаб. работа “Управление процессами в Windows”
        • Лаб. работа “Работа с виртуальной машиной Linux”
        • Лаб. работа “Язык командного энтерпритатора Shell”
        • Лаб. работа “Работа с файлами в Linux”
        • Лаб. работа “Работа с процессами в Linux”
    • ИППРПО
      • Теория
      • Практика
        • Лаб. работа “Язык командного энтерпритатора Shell”
        • Лаб. работа “Управление процессами в Shell”
        • Лаб. работа “Управление файловой системой в Shell”
        • Лаб. работа “Управление пакетами в ОС Linux”
        • Лаб. работа “Сетевые инструменты в Linux”
        • Лаб. работа “Мониторинг и анализ системы Linux”
        • Лаб. работа “Основы Docker. Управление контейнерами”
        • Лаб. работа “Docker: Сети”
        • Лаб. работа "Docker: Образы"
        • Лаб. работа “Docker Compose: Управление многоконтейнерными приложениями”
        • Лаб. работа “CI/CD с GitLab”

Содержание

  • Лабораторная работа по теме “Основы Docker. Управление контейнерами”
    • Цель работы
    • Краткие теоретические сведения
    • Краткий справочник по параметрам командной строки Docker
    • Требования к окружению
    • Порядок выполнения работы
    • Задания для самостоятельного выполнения
    • Контрольные вопросы
    • Требования к отчету
  1. ИСиТ
  2. ИППРПО
  3. Практика
  4. Лаб. работа “Основы Docker. Управление контейнерами”

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

Инструменты промышленной разработки
Практика
Автор

Бизюк Андрей

Дата публикации

16 декабря 2025 г.

Лабораторная работа по теме “Основы 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 запущен и работает корректно.

    docker version

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

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

    docker run hello-world

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

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

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

    docker search nginx

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

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

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

    docker images

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

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

    docker rmi hello-world

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

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

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

    docker run alpine ls -l

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

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

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

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

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

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

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

    docker ps

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

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

    curl http://localhost:8080

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

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

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

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

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

    docker exec -it web-server bash

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

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

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

    # Останавливаем
    docker stop web-server
    
    # Удаляем
    docker rm web-server
    
    # Проверяем, что он удален
    docker ps -a

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

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

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

    docker container prune

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

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

    docker system prune -a

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

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

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

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

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

    docker 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. Вывод, в котором необходимо кратко описать полученные знания и навыки.
Наверх
Лаб. работа “Мониторинг и анализ системы Linux”
Лаб. работа “Docker: Сети”