На основе каких примитивов ядра Linux работает Docker?

«На основе каких примитивов ядра Linux работает Docker?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Docker для изоляции и управления контейнерами опирается на следующие примитивы ядра Linux:

  1. Namespaces (Пространства имён): Изолируют глобальные системные ресурсы для каждого контейнера.

    • PID: Изолирует дерево процессов.
    • NET: Изолирует сетевые интерфейсы, таблицы маршрутизации, порты.
    • MNT: Изолирует точки монтирования (файловую систему).
    • IPC: Изолирует межпроцессное взаимодействие (очереди, семафоры).
    • UTS: Изолирует hostname и domainname.
    • User: Изолирует UID/GID пространства.
  2. cgroups (Control Groups): Ограничивают и отслеживают использование ресурсов.

    • Memory: memory.limit_in_bytes.
    • CPU: cpu.shares, cpu.cfs_quota_us.
    • I/O: blkio.weight.
      # Запуск контейнера с ограничениями
      docker run -it --memory="500m" --cpus="1.5" alpine:latest
  3. Union File Systems (OverlayFS): Объединяют несколько слоёв (read-only образ + read-write слой контейнера) в единое представление файловой системы. Это основа для эффективного хранения образов.

  4. Capabilities: Разделяют привилегии суперпользователя на отдельные блоки. Docker по умолчанию удаляет многие capabilities у контейнеров для повышения безопасности.

  5. seccomp-bpf: Фильтрует системные вызовы, доступные процессам внутри контейнера, ограничивая поверхность атаки.

  6. SELinux/AppArmor: Системы принудительного контроля доступа (MAC), которые накладывают дополнительные политики безопасности поверх стандартных разрешений Linux (DAC).