Docker как практическое применение механизмов операционной системы
1. Docker в контексте операционных систем
Операционная система управляет процессами, памятью, файлами, устройствами, пользователями и сетевыми соединениями. Docker работает поверх этих механизмов и использует их для запуска приложений в изолированной среде.
Для студента важно увидеть простую мысль: контейнер не является отдельным компьютером. Контейнер представляет собой способ организовать выполнение процессов внутри существующей операционной системы с четко заданными границами доступа и потребления ресурсов.
Именно поэтому тема Docker логично входит в дисциплину «Операционные системы». Она показывает, как фундаментальные механизмы ОС используются в реальной инженерной практике.
2. Контейнер как группа процессов
Любая программа в ОС запускается в виде процесса. Контейнер тоже запускает процессы. Разница состоит в том, что эти процессы помещаются в отдельную управляемую среду.
Когда запускается контейнер, Docker создает:
- отдельный набор процессов
- специальную файловую среду
- собственные сетевые параметры
- правила по использованию памяти и процессора
С точки зрения ядра ОС контейнерные процессы остаются обычными процессами Linux. Их планирует тот же планировщик, для них выделяется память, они обращаются к файловой системе и сети через системные механизмы.
Из этого следует важный вывод: Docker помогает на практике изучать тему процессов, потому что контейнер является наглядным примером управляемой группы процессов.
Что полезно подчеркнуть студентам
Процесс внутри контейнера:
- имеет PID внутри своей среды
- запускается от имени пользователя
- использует память и процессор
- пишет в файловую систему контейнера
- может устанавливать сетевые соединения
То есть все базовые понятия курса ОС продолжают действовать и внутри Docker.
3. Изоляция среды: namespaces
Один из ключевых механизмов Docker — namespaces. Это функция ядра Linux, которая создает для процессов отдельное представление о системных ресурсах.
Контейнер благодаря namespaces получает собственный «взгляд» на систему.
Основные пространства имен
PID namespace
Формирует отдельное пространство процессов. Внутри контейнера приложение видит свой список процессов и свою иерархию PID.
Mount namespace
Формирует собственное представление о файловой системе. Контейнер работает со своим набором каталогов и точек монтирования.
Network namespace
Формирует собственные сетевые интерфейсы, IP-адреса, маршруты и таблицы сетевого взаимодействия.
User namespace
Позволяет по-особому отображать пользователей и группы внутри контейнера.
IPC namespace
Изолирует механизмы межпроцессного взаимодействия.
Учебный смысл namespaces
Через эту тему студенты видят, что операционная система умеет выделять процессам отдельные логические области существования. На этом строится безопасность, многозадачность и управляемость современных сервисов.
4. Управление ресурсами: cgroups
Помимо изоляции, ОС должна распределять ресурсы между задачами. Для этого Docker использует механизм cgroups.
cgroups позволяют ограничивать и учитывать:
- объем оперативной памяти
- загрузку процессора
- число процессов
- дисковый ввод-вывод
- сетевые параметры в ряде сценариев
Практический смысл cgroups
Если одно приложение начинает потреблять слишком много памяти или процессорного времени, cgroups удерживают его в заданных пределах. Это особенно важно на серверах, где на одной машине работают сразу несколько сервисов.
Связь с дисциплиной
Тема cgroups напрямую связана с такими разделами курса, как:
- управление ресурсами
- планирование процессов
- контроль потребления памяти
- защита стабильности системы
Docker в этом месте выступает удобной оболочкой над механизмами ОС.
5. Файловая система контейнера
Каждый контейнер работает со своей файловой средой. Эта среда собирается из образа.
Образ
Образ представляет собой шаблон, в котором уже подготовлены:
- базовая система
- библиотеки
- настройки
- приложение
- команда запуска
Контейнер
Контейнер является запущенным экземпляром образа. При запуске контейнера Docker добавляет поверх образа отдельный рабочий слой, в который записываются изменения.
Слои
Файловая система Docker строится по слоистой модели. Это дает несколько преимуществ:
- экономия места на диске
- повторное использование общих слоев
- ускорение сборки
- удобство доставки приложений
Связь с ОС
Через эту тему студенты повторяют и расширяют понятия:
- файловая система
- каталоги и пути
- монтирование
- права доступа
- хранение данных
- временные и постоянные данные
Тома
Отдельный важный элемент — тома, или volumes. Том позволяет хранить данные вне контейнера. Это полезно для баз данных, логов и пользовательских файлов.
Здесь удобно показать студентам разницу между:
- временными данными контейнера
- постоянными данными в томах
- файлами хостовой системы
6. Сеть контейнера
Сеть является еще одной темой курса ОС, которая очень наглядно проявляется в Docker.
Контейнер может получить:
- собственный IP-адрес
- сетевой интерфейс
- правила маршрутизации
- доступ к внутренней сети Docker
- проброс портов наружу
Пример идеи
Если внутри контейнера работает веб-сервер на порту 80, Docker может связать его с портом 8080 на машине пользователя. Тогда запрос из браузера попадет в контейнерное приложение.
Что видят студенты
Через работу с контейнером студент сталкивается с практическими проявлениями тем:
- порты
- IP-адреса
- сетевые интерфейсы
- маршрутизация
- клиент-серверное взаимодействие
Учебная польза
Тема сети в Docker помогает перевести абстрактные понятия ОС и компьютерных сетей в наблюдаемое поведение приложения.
7. Безопасность и права доступа
Docker тесно связан с вопросами безопасности. Контейнеры изолируют приложения и уменьшают область воздействия ошибки, уязвимости или некорректной настройки.
Что дает контейнеризация
- разделение приложений по средам
- ограничение доступа к файлам и сети
- контроль ресурсов
- удобство аудита и журналирования
- предсказуемый состав зависимостей
Права доступа
Процесс внутри контейнера работает от определенного пользователя. Это влияет на его возможности при обращении к файлам, устройствам и сетевым операциям. В учебном курсе здесь удобно напомнить студентам темы:
- пользователи и группы
- права на файлы
- привилегии
- безопасность процессов
Контейнер как элемент безопасной архитектуры
Контейнеры помогают строить сервисы по принципу разделения ролей:
- отдельный контейнер для веб-сервера
- отдельный контейнер для базы данных
- отдельный контейнер для фоновой обработки задач
Такое разделение повышает управляемость среды и упрощает анализ проблем.
8. Образы, контейнеры и жизненный цикл приложения
Чтобы студент понимал Docker как систему, полезно разобрать жизненный цикл приложения.
Этап 1. Подготовка образа
Разработчик описывает состав среды через Dockerfile:
- базовый образ
- установка зависимостей
- копирование файлов
- команда запуска
Этап 2. Сборка образа
Docker собирает образ из слоев.
Этап 3. Запуск контейнера
Из образа создается контейнер, внутри которого стартует главный процесс.
Этап 4. Работа контейнера
Контейнер выполняет задачу, принимает сетевые запросы, пишет логи, использует память и процессор.
Этап 5. Остановка и удаление
После завершения работы контейнер можно остановить и удалить. Образ при этом сохраняется и может использоваться повторно.
Учебный смысл жизненного цикла
На этом этапе студент связывает между собой темы:
- загрузка и запуск процесса
- выделение ресурсов
- работа с файлами
- сетевое взаимодействие
- завершение задачи
- освобождение ресурсов
9. Роль Docker в современной инженерной практике
Docker занял важное место в разработке и сопровождении программных систем, потому что он дает повторяемую и управляемую среду.
Для разработчика
- удобная локальная сборка
- стабильный состав зависимостей
- быстрый запуск сервисов
Для тестировщика
- одинаковые стенды
- быстрое поднятие окружения
- удобное воспроизведение дефектов
Для администратора и DevOps-инженера
- предсказуемое развертывание
- контроль над ресурсами
- масштабирование сервисов
- удобство обновлений
Для преподавания операционных систем
Docker дает редкий дидактический эффект: студент видит работу механизмов ОС в среде, которую можно быстро запустить, изучить и удалить без сложной настройки.
10. Основные термины темы
Docker — платформа для упаковки, доставки и запуска приложений в контейнерах.
Контейнер — изолированная среда выполнения приложения.
Образ — шаблон, из которого создаются контейнеры.
Dockerfile — файл с инструкциями по сборке образа.
Namespace — механизм изоляции системных ресурсов.
cgroups — механизм контроля и учета ресурсов.
Volume — область постоянного хранения данных.
Port mapping — связывание порта контейнера с портом хостовой системы.
11. Ключевые выводы занятия
- Docker тесно связан с предметом «Операционные системы», потому что использует механизмы ядра для изоляции и управления приложениями.
- Контейнер является группой процессов, работающих в специально организованной среде.
- Namespaces создают логическую изоляцию процессов, файловой системы и сети.
- cgroups отвечают за контроль потребления ресурсов.
- Образы и контейнеры демонстрируют практическую работу файловой системы, запуска процессов и жизненного цикла приложений.
- Docker служит удобным инструментом для изучения процессов, изоляции, сети, безопасности и управления ресурсами.
12. Вопросы для закрепления
[task_id id=»21483″]
13. Краткое заключение
Docker стал одним из самых наглядных примеров того, как фундаментальные механизмы операционной системы работают в реальных инженерных задачах. Через контейнеры студент видит процессы, ресурсы, файловую систему, сеть и безопасность в действии. Поэтому тема Docker хорошо дополняет курс операционных систем и делает его ближе к современной практике разработки и эксплуатации программных систем.
Если нужно, я сразу соберу к этой лекции короткую практическую работу в том же стиле, чтобы получился готовый комплект для пары.
14. Практическая работа
[task_id id=»21486″]
Вторая часть
Сборка собственного образа, bind mount и volume в Docker
1. Образ, контейнер, жизненный цикл
Образ хранит подготовленную среду: базовую систему, библиотеки, настройки, приложение и команду запуска. Контейнер является запущенным экземпляром образа. При старте контейнера Docker добавляет поверх образа рабочий слой, куда попадают изменения во время выполнения.
Сначала разработчик описывает среду через Dockerfile, затем Docker собирает образ из слоев, после этого из образа создается контейнер, внутри которого запускается главный процесс. Во время работы контейнер использует память, процессор, файловую систему и сеть.
2. Dockerfile как описание среды
Dockerfile представляет собой текстовый файл с инструкциями для сборки образа. В нем обычно используются инструкции FROM, RUN, WORKDIR, COPY, CMD. . Сборка образа идет на основе этого файла, а тег помогает получить удобное имя для результата сборки.
3. Порты и главный процесс контейнера
Если приложение внутри контейнера слушает внутренний порт, Docker связывает его с портом хостовой машины. В прошлой работе у вас уже использовалась схема 8080:80, где браузер обращался к порту хоста, а запрос попадал в веб-сервер внутри контейнера. Такой проброс порта помогает показать связь между контейнерной сетью и сетью хоста.
Главный процесс контейнера играет центральную роль. Дополнительные команды через docker exec выполняются только пока живет основной процесс PID 1.
4. Временные и постоянные данные
По умолчанию данные контейнера лежат в его writable layer. Этот слой связан с жизненным циклом контейнера. Для постоянных данных Docker предлагает filesystem mounts. Основные варианты здесь такие: named volume и bind mount.
Named volume хранит данные отдельно от контейнера и управляется самим Docker. Такой вариант подходит для данных приложения, журналов, файлов базы данных и любых материалов, которым нужна стабильность между перезапусками и пересозданием контейнеров.
Bind mount связывает конкретный каталог хостовой системы с каталогом внутри контейнера. Этот вариант особенно полезен для исходного кода, конфигурации и учебных экспериментов, где студент сразу видит результат изменения файла на хосте в браузере. При монтировании содержимое каталога контейнера перекрывается содержимым примонтированного пути с хоста.
5. Диагностика контейнера
Команда docker logs показывает вывод контейнера и подходит для первичной диагностики сервиса. Команда docker exec запускает новую команду внутри работающего контейнера. Команда docker inspect выводит подробную информацию о контейнере, включая параметры сети, монтирования и конфигурацию запуска.
Практическое задание
1. Подготовка рабочей папки
Создать папку docker-lab-2.
Внутри создать файл index.html со следующим содержимым:
<html lang=«ru»>
<head>
<meta charset=«UTF-8»>
<title>Docker Lab 2</title>
</head>
<body>
<h1>Практическая работа 2</h1>
<p>Тема: сборка собственного образа</p>
<p>Студент: Фамилия Имя</p>
<p>Группа: ИС-XX</p>
<p>Страница запущена из собственного Docker-образа.</p>
</body>
</html>
2. Создание Dockerfile
В той же папке создать файл Dockerfile:
COPY index.html /usr/share/nginx/html/index.html
Смысл этой сборки : взять готовый веб-сервер и заменить стартовую страницу своим файлом. Через FROM студент выбирает базу образа, через COPY добавляет собственный файл в файловую систему образа.
3. Проверка Docker
В терминале открыть папку docker-lab-2 и выполнить:
Ожидаемый результат: терминал выводит установленную версию Docker.
4. Сборка собственного образа
Выполнить:
Ожидаемый результат: Docker собирает образ из Dockerfile, а в списке образов появляется os-web-v2.
Для проверки выполнить:
5. Запуск контейнера из своего образа
Выполнить:
Проверить список контейнеров:
Открыть в браузере:
Ожидаемый результат: в браузере отображается страница студента из собственного образа. Публикация порта связывает порт контейнера с портом хостовой системы, поэтому страница становится доступна из браузера.
6. Просмотр логов и работа внутри контейнера
Выполнить:
Затем войти внутрь контейнера:
Внутри контейнера выполнить:
cat /usr/share/nginx/html/index.html
exit
Ожидаемый результат: студент видит файл, который попал внутрь образа на этапе сборки. docker logs показывает вывод контейнера, а docker exec запускает команду в уже работающем контейнере.
7. Подробный просмотр конфигурации контейнера
Выполнить:
Ожидаемый результат: в выводе видно конфигурацию контейнера, сетевые параметры и сведения о запуске. inspect подходит для точного анализа свойств контейнера.
8. Работа с постоянными данными через named volume
Создать том:
Проверить список томов:
Записать данные в том через временный контейнер:
Прочитать данные из того же тома через новый контейнер:
Ожидаемый результат: второй контейнер читает файл, созданный первым контейнером. Это показывает, что named volume хранит данные отдельно от жизненного цикла отдельного контейнера.
9. Работа с bind mount
Создать на хостовой системе папку site-bind.
Скопировать в нее новый index.html, например с таким текстом:
<html lang=«ru»>
<head>
<meta charset=«UTF-8»>
<title>Bind Mount Demo</title>
</head>
<body>
<h1>Bind mount</h1>
<p>Эта страница читается прямо из папки хостовой системы.</p>
</body>
</html>
Запустить контейнер, указав абсолютный путь к папке site-bind:
Открыть в браузере:
После этого изменить файл index.html в папке site-bind на хосте и обновить страницу в браузере.
Ожидаемый результат: страница в браузере меняется сразу после редактирования файла на хостовой системе. Bind mount дает контейнеру прямой доступ к каталогу хоста, а содержимое каталога внутри контейнера в точке монтирования заменяется содержимым примонтированной папки.
10. Очистка среды
Остановить и удалить контейнеры:
docker rm os-web-v2-container
docker stop os-nginx-bind
docker rm os-nginx-bind
Проверить тома:
При желании удалить учебный том: