Раздел 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; - представление о файловой системе и точках монтирования.
Материалы
-
Процессы и containers
Что такое process в Linux и что добавляет к нему контейнеризация. Практическое сравнение: один и тот же процесс на host и в container, разные PID для одного объекта. -
Containers против virtual machines
Механизм каждого подхода, разделяемый kernel, стоимость запуска, плотность размещения, граница изоляции. Когда VM остаётся правильным выбором. -
Linux namespaces
Все типы namespaces: PID, mount, network, UTS, IPC, user, cgroup, time. Что изолирует каждый, как посмотреть namespaces процесса, как войти в чужой namespace. -
Cgroups
Управление ресурсами: CPU, память, I/O, число процессов. Иерархия cgroup v2, связь флаговdocker runс файлами в/sys/fs/cgroup, что происходит при превышении лимита. -
Capabilities
Почемуrootвнутри container — это не полноценныйroot. Модель capabilities, список отбираемых Docker по умолчанию, флаги--cap-addи--cap-drop. -
Container runtime и OCI
Архитектура Docker Engine: клиент, daemon, containerd, shim,runc. Что такое OCI Image Specification и OCI Runtime Specification. Что происходит между нажатием Enter и запуском процесса. -
Терминология Docker
Image, container, registry, repository, tag, digest, layer, manifest. Точные определения и типичные ошибки словоупотребления, которые приводят к ошибкам в работе. -
Практические задания
Лабораторные задания раздела с проверкой результата.
Рекомендуемый порядок чтения
Последовательный: 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 | Проследить цепочку процессов: dockerd → containerd → containerd-shim → процесс приложения | доп. |
| 6 | Продемонстрировать, что container и host используют один kernel: uname -r в обоих | доп. |
| 7 | Войти в network namespace container с host через nsenter и увидеть его интерфейсы | ★ |
| 8 | Container с --pid=host видит все процессы host — объяснить, почему это опасно | диаг. |
Полные формулировки — в exercises.md.
Критерии завершения раздела
Раздел пройден, когда учащийся может без подсказок:
- Объяснить за две минуты, что такое container, не употребляя слов «лёгкая виртуальная машина».
- Показать процесс container в выводе
psна host и объяснить, почему PID различаются. - Перечислить не менее шести типов namespaces и сказать, что изолирует каждый.
- Найти лимит памяти запущенного container в файловой системе
/sys/fs/cgroup. - Объяснить, почему
rootвнутри container не может выполнитьmountбез дополнительных флагов. - Нарисовать по памяти цепочку от
docker runдо запущенного процесса. - Объяснить разницу между tag и digest и сказать, какой из них неизменен.
Проверьте себя: Quiz 02 и Checkpoint 1.
Что дальше
Раздел объяснил, как процесс изолируется. Следующий раздел объясняет, откуда берётся файловая система, которую этот процесс видит как корневую.
Навигация
Диаграмма: namespaces и cgroups
← Предыдущий раздел: Подготовка среды
Вернуться к главному оглавлению
Следующий раздел: Работа с Images →