← Назад к вопросам

Какое ядро системы используется внутри Docker-контейнеров?

2.3 Middle🔥 121 комментариев
#JavaScript Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI4 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Ядро системы в Docker-контейнерах

Внутри Docker-контейнеров используется ядро хостовой операционной системы (ОС), а не изолированное или виртуальное ядро. Это ключевое отличие контейнеризации от виртуализации. Контейнеры разделяют ядро Linux хоста через механизмы namespaces и cgroups, что обеспечивает изоляцию процессов, сетей, файловых систем и ресурсов, но без эмуляции оборудования или отдельного ядра.

Механизмы использования ядра хоста

  1. Namespaces (пространства имён):

    • PID namespace: Изолирует дерево процессов — каждый контейнер видит свои процессы с PID 1.
    • Network namespace: Предоставляет изолированные сетевые интерфейсы, таблицы маршрутизации и порты.
    • Mount namespace: Управляет точками монтирования, создавая уникальную файловую систему.
    • UTS namespace: Изолирует hostname и domain name.
    • IPC namespace: Изолирует межпроцессное взаимодействие (очереди, семафоры).
    • User namespace: Отображает UID/GID внутри контейнера на хосте.
  2. Control Groups (cgroups):

    • Ограничивают и контролируют ресурсы (CPU, память, I/O) для каждого контейнера, предотвращая "шумных соседей".

Пример работы с ядром в Docker

На хосте можно проверить, что контейнер использует то же ядро:

# Проверяем версию ядра на хосте
uname -r
# 5.15.0-91-generic

# Запускаем контейнер и проверяем ядро внутри
docker run --rm alpine uname -r
# 5.15.0-91-generic (та же версия)

Последствия использования общего ядра

Преимущества:

  • Эффективность ресурсов: Контейнеры запускаются мгновенно, потребляют минимум памяти (нет гипервизора).
  • Совместимость: Все контейнеры на хосте гарантированно работают с одним ядром.
  • Производительность: Прямой доступ к системным вызовам ядра без накладных расходов.

Ограничения:

  • Гомогенность ОС: Контейнеры Linux не могут работать на Windows/macOS без виртуализации (Docker Desktop использует Linux VM).
  • Уязвимости ядра: Компрометация ядра хоста затрагивает все контейнеры.
  • Зависимость от версии ядра: Функции контейнеров (например, cgroups v2) требуют современных ядер.

Docker на не-Linux системах

На Windows/macOS Docker использует легковесную Linux-виртуализацию:

  • Windows: Hyper-V с виртуальной машиной Linux (например, MobyLinuxVM).
  • macOS: HyperKit (на базе xhyve) с аналогичной VM. В этих случаях контейнеры используют ядро Linux внутри VM, а не ядро macOS/Windows.

Безопасность и изоляция

Поскольку ядро общее, критически важны:

  • AppArmor/SELinux: Профили безопасности для ограничения системных вызовов.
  • Seccomp: Фильтрация системных вызовов на уровне ядра.
  • Capabilities: Гранулярные права вместо запуска от root.
# Пример ограничения capabilities в docker-compose
services:
  app:
    image: nginx
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE

Эволюция: Unikernel и gVisor

Для усиления изоляции появляются альтернативы:

  • gVisor: Песочница, которая перехватывает системные вызовы через пользовательское ядро.
  • Kata Containers: Запускают каждый контейнер в легковесной VM с отдельным ядром.

Итог: Docker-контейнеры не содержат собственного ядра — они используют ядро хоста через механизмы Linux, что обеспечивает баланс между изоляцией, производительностью и портативностью. Это фундаментальный принцип контейнеризации, отличающий её от классической виртуализации.