Почему Docker — это не про полную изоляцию?

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

Ответ

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

Механизмы изоляции и их ограничения:

  1. Namespaces: Изолируют представление процессов, сети, пользователей и файловой системы для контейнера. Однако, при наличии уязвимостей в ядре, возможен "breakout" из namespace.
  2. Control Groups (cgroups): Ограничивают и отслеживают использование ресурсов (CPU, память, I/O).
  3. Общее ядро: Это главное отличие от VM. Уязвимость в ядре хоста может скомпрометировать все контейнеры.

Пример риска: Запуск контейнера с флагом --privileged или монтированием чувствительных точек монтирования (/dev, /sys) даёт ему почти неограниченный доступ к хосту.

docker run --rm -it --privileged ubuntu bash
# Внутри контейнера можно попытаться получить доступ к хосту

Меры усиления безопасности: Для production-сред требуются дополнительные инструменты:

  • AppArmor / SELinux: Профили для ограничения возможностей контейнера.
  • Seccomp: Ограничение системных вызовов, доступных контейнеру.
  • User Namespaces: Маппинг root-пользователя контейнера на непривилегированного пользователя на хосте.
  • Альтернативные runtime: gVisor (прослойка-псевдоядро) или Kata Containers (легковесные VM) для более строгой изоляции.