Какое ядро использует контейнер при запуске?

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

Ответ

Контейнер использует ядро хостовой операционной системы. Контейнеризация (Docker, containerd) обеспечивает изоляцию на уровне процессов, файловой системы и сети (через namespaces и cgroups), но не эмулирует отдельное ядро.

Практическая проверка:

# Ядро на хосте
uname -r
# Вывод: 5.15.0-91-generic

# Ядро внутри контейнера
docker run --rm alpine uname -r
# Вывод будет идентичным: 5.15.0-91-generic

Ключевые следствия:

  1. Совместимость: Все контейнеры на хосте должны быть совместимы с его версией ядра. Запуск контейнера, собранного для значительно более старого ядра, может привести к ошибкам.
  2. Модули ядра: Контейнер может использовать модули ядра, загруженные на хосте (например, для работы с файловыми системами или сетевыми драйверами).
  3. Безопасность: Уязвимость в ядре хоста затрагивает все контейнеры. Это отличие от виртуальных машин, где у каждой своя изолированная копия ядра.

Пример из практики: При обновлении ядра хоста для устранения уязвимости (например, Dirty Pipe) необходимо перезапустить все контейнеры, чтобы они начали использовать обновленное ядро.