System Design Space

    Глава 72

    Обновлено: 15 февраля 2026 г. в 18:35

    Контейнеризация

    Прогресс части0/20

    Как устроены контейнеры, слоенная файловая система, cgroups/limits и сравнение с VM.

    Источник

    Containerization

    Определение контейнеризации и ключевые принципы.

    Перейти на сайт

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

    Как устроена контейнеризация

    • Namespaces изолируют процессы, сеть, файловую систему и пользователей.
    • Cgroups ограничивают и распределяют CPU, память, I/O и количество процессов.
    • Union/overlay FS обеспечивает слои образов и быстрый запуск контейнеров.
    • Container runtime управляет жизненным циклом контейнеров (create/start/stop).
    • Registry и образы позволяют переносить приложения между окружениями.
    Host machine (Linux)
    Physical resources
    CPURAMDiskNIC
    Container runtime

    runtime управляет namespaces и cgroups, запускает контейнеры и ограничивает ресурсы.

    Containers inside host

    Isolation via namespaces + cgroups

    Container A

    • Nginx
    • App
    CPU: 2 coresRAM: 512MBIO: limited

    Container B

    • Worker
    • Queue
    CPU: 1 coreRAM: 256MBIO: limited

    Container C

    • DB
    • Backup
    CPU: 2 coresRAM: 1GBIO: priority
    Layered filesystem (overlay)
    Base imageRuntime layerApp layerWritable layer
    Cgroups & limits

    Контролируют CPU, память и I/O для каждого контейнера, не позволяя одному процессу съесть все ресурсы.

    Shared kernel

    Все контейнеры разделяют ядро хоста, поэтому контейнеризация легче и быстрее VM, но требует совместимого ядра.

    Слоенная файловая система

    Образы контейнеров строятся из нескольких слоев, а контейнер добавляет свой writable слой.

    • Базовый слой: минимальный образ ОС или runtime.
    • Промежуточные слои: зависимости, библиотеки, конфигурации.
    • Верхний слой: приложение и его файлы.
    • Writable layer: изменения на уровне конкретного контейнера.

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

    Cgroups и limits

    • CPU limits: квоты/шары для процессов контейнера.
    • Memory limits: жесткие пределы и OOM-killer.
    • IO limits: контроль дисковых операций.
    • PIDs limits: ограничение количества процессов.

    Контейнеры vs виртуальные машины

    Контейнеры

    • Разделяют ядро хоста, поэтому стартуют быстро.
    • Меньше накладных расходов и выше плотность размещения.
    • Требуют совместимого ядра и делят его с другими контейнерами.

    Виртуальные машины

    • Каждая VM имеет собственную гостевую ОС.
    • Выше изоляция, но больше накладные расходы.
    • Подходит для разных ОС и строгих границ безопасности.

    Путь запроса к nginx внутри контейнера

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

    Путь запроса до nginx в контейнере

    Путь запроса: интернет → хост → runtime → контейнер

    External

    Layer 1
    ClientInternet

    Host Linux

    Layer 2
    NICKernel network

    Container runtime

    Layer 3
    Bridge/NATNamespaces

    Container

    Layer 4
    NginxApp

    Service

    Layer 5
    HTTP handlerBusiness logic
    Путь запроса

    Активный шаг

    Нажмите «Старт», чтобы пройти путь запроса.

    Почему это важно для системного дизайна

    • Контейнеры ускоряют доставку и упрощают окружения (dev/test/prod).
    • Понимание cgroups помогает выставлять лимиты и избегать noisy neighbor.
    • Сетевая модель контейнеров влияет на latency и правила безопасности.
    • Контейнеры стали базовой единицей деплоя в Kubernetes и облаках.