Главная/Основы Containerization/Обзор

Раздел 2. Основы Containerization

Раздел отвечает на главный вопрос курса: что такое container на самом деле. Ответ короткий — это обычный Linux process, которому ядро подменило представление о системе. Всё остальное в курсе является следствием этого факта.

Здесь вводятся механизмы ядра, на которых построена контейнеризация: namespaces (изоляция того, что процесс видит), cgroups (ограничение того, что процесс потребляет) и capabilities (ограничение того, что процессу разрешено). Затем разбирается, как эти механизмы использует стек Docker: CLI → daemon → containerd → shim → runc, и какую роль в этом играют спецификации OCI.

Раздел даёт словарь, которым пользуется весь остальной курс: image, container, registry, repository, tag, digest. Без него последующие разделы читаются как набор заклинаний.

Цели обучения

После раздела учащийся сможет:

  • объяснить, что container — это процесс host-системы, и доказать это, найдя его PID на host;
  • назвать, какие ресурсы container изолирует, а какие разделяет с host, — в том числе главный из разделяемых: kernel;
  • сформулировать отличие container от virtual machine на уровне механизма, а не аналогии, и назвать цену каждого подхода;
  • перечислить типы Linux namespaces и показать namespaces конкретного процесса;
  • прочитать cgroup-ограничения container и связать их с флагами docker run;
  • объяснить, что такое Linux capabilities и какие из них Docker отбирает по умолчанию;
  • описать цепочку компонентов, которая приводит к запуску процесса, и роль каждого;
  • объяснить, зачем нужен OCI и что именно он стандартизирует;
  • корректно употреблять термины image, container, registry, repository, tag, digest.

Предварительные знания

  • Раздел 01. Подготовка среды — нужен работающий Docker;
  • понимание процессов в Linux: PID, родительский процесс, ps, kill;
  • представление о файловой системе и точках монтирования.

Материалы

  1. Процессы и containers
    Что такое process в Linux и что добавляет к нему контейнеризация. Практическое сравнение: один и тот же процесс на host и в container, разные PID для одного объекта.

  2. Containers против virtual machines
    Механизм каждого подхода, разделяемый kernel, стоимость запуска, плотность размещения, граница изоляции. Когда VM остаётся правильным выбором.

  3. Linux namespaces
    Все типы namespaces: PID, mount, network, UTS, IPC, user, cgroup, time. Что изолирует каждый, как посмотреть namespaces процесса, как войти в чужой namespace.

  4. Cgroups
    Управление ресурсами: CPU, память, I/O, число процессов. Иерархия cgroup v2, связь флагов docker run с файлами в /sys/fs/cgroup, что происходит при превышении лимита.

  5. Capabilities
    Почему root внутри container — это не полноценный root. Модель capabilities, список отбираемых Docker по умолчанию, флаги --cap-add и --cap-drop.

  6. Container runtime и OCI
    Архитектура Docker Engine: клиент, daemon, containerd, shim, runc. Что такое OCI Image Specification и OCI Runtime Specification. Что происходит между нажатием Enter и запуском процесса.

  7. Терминология Docker
    Image, container, registry, repository, tag, digest, layer, manifest. Точные определения и типичные ошибки словоупотребления, которые приводят к ошибкам в работе.

  8. Практические задания
    Лабораторные задания раздела с проверкой результата.

Рекомендуемый порядок чтения

Последовательный: 01 → 02 → 03 → 04 → 05 → 06 → 07 → exercises.

Урок 07 можно прочитать раньше — он справочный и не требует уроков 03–06. Если терминология путается уже на уроке 01, откройте его сразу.

Уроки 03 и 04 получают углублённое продолжение в разделе 17. Docker internals. Сейчас достаточно уровня «вижу и понимаю».

Практические задания

ЗаданиеТип
1Запустить sleep на host и в container, найти оба процесса в ps на host, объяснить разницу PIDобяз.
2Показать список namespaces процесса container через lsns и /proc/<pid>/ns/обяз.
3Запустить container с --memory и найти соответствующий лимит в /sys/fs/cgroupобяз.
4Сравнить вывод capsh --print на host и внутри containerобяз.
5Проследить цепочку процессов: dockerdcontainerdcontainerd-shim → процесс приложениядоп.
6Продемонстрировать, что container и host используют один kernel: uname -r в обоихдоп.
7Войти в network namespace container с host через nsenter и увидеть его интерфейсы
8Container с --pid=host видит все процессы host — объяснить, почему это опаснодиаг.

Полные формулировки — в exercises.md.

Критерии завершения раздела

Раздел пройден, когда учащийся может без подсказок:

  1. Объяснить за две минуты, что такое container, не употребляя слов «лёгкая виртуальная машина».
  2. Показать процесс container в выводе ps на host и объяснить, почему PID различаются.
  3. Перечислить не менее шести типов namespaces и сказать, что изолирует каждый.
  4. Найти лимит памяти запущенного container в файловой системе /sys/fs/cgroup.
  5. Объяснить, почему root внутри container не может выполнить mount без дополнительных флагов.
  6. Нарисовать по памяти цепочку от docker run до запущенного процесса.
  7. Объяснить разницу между tag и digest и сказать, какой из них неизменен.

Проверьте себя: Quiz 02 и Checkpoint 1.

Что дальше

Раздел объяснил, как процесс изолируется. Следующий раздел объясняет, откуда берётся файловая система, которую этот процесс видит как корневую.

Навигация

Диаграмма: namespaces и cgroups

← Предыдущий раздел: Подготовка среды
Вернуться к главному оглавлению
Следующий раздел: Работа с Images →

Markdown на GitHub ↗