Какие механизмы операционной системы Linux используются для работы контейнеров?

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

Ответ

Контейнеры в Linux — это не виртуальные машины, а изолированные процессы. Эта изоляция достигается за счет комбинации встроенных механизмов ядра, которые я изучал и настраивал.

Ключевые технологии:

  1. Namespaces (пространства имен) — изолируют глобальные системные ресурсы для группы процессов, создавая у них иллюзию, что они одни в системе.

    • PID namespace: Изолирует дерево процессов. Процесс в контейнере видит свой PID 1 (часто это init), в то время как на хосте у него другой PID.
    • Network namespace: У контейнера свой собственный сетевой стек (интерфейсы, таблицы маршрутизации, порты). Это позволяет запускать, например, два контейнера с Nginx на 80 порту.
    • Mount namespace: Изолированное дерево файловых систем. Это основа для файловой системы контейнера.
    • UTS namespace: Позволяет контейнеру иметь свое собственное имя хоста и домена.
    • IPC namespace: Изолирует межпроцессное взаимодействие (очереди сообщений, сегменты общей памяти).
    • User namespace: Сопоставляет UID/GID внутри контейнера с другими UID/GID на хосте для повышения безопасности.
  2. Control Groups (cgroups) — ограничивают и учитывают использование ресурсов группой процессов. Без них один контейнер мог бы «съесть» всю память или CPU хоста.

    • memory: Ограничивает использование RAM и swap.
    • cpu: Ограничивает долю CPU времени.
    • blkio: Контролирует доступ к блочным устройствам ввода-вывода. Я настраивал лимиты через Docker (--memory, --cpus) или напрямую в системе.
  3. Union File Systems (OverlayFS, AUFS) — хотя и не являются механизмом ядра в том же смысле, они критически важны. Они позволяют наслаивать файловые системы (образы) друг на друга, обеспечивая эффективное использование диска и кэширование слоев. Docker использует их для построения образов и файловой системы контейнера.

Дополнительные механизмы безопасности:

  • Capabilities: Разделение привилегий суперпользователя. Я могу дать контейнеру право монтировать файловые системы (CAP_SYS_ADMIN), но не давать полный root-доступ.
  • Seccomp: Профиль безопасности, который ограничивает системные вызовы, доступные контейнеру. Стандартный профиль Docker блокирует множество опасных вызовов.

Docker, containerd и другие среды исполнения (runtimes) — это просто удобные обертки, которые управляют этими низкоуровневыми механизмами. Понимание их работы необходимо для глубокой отладки проблем с производительностью, сетью или безопасностью контейнеров.