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

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

Ответ

Docker использует механизмы ядра Linux для изоляции, создавая отдельное окружение для каждого контейнера. Помимо файловой системы (через mount namespace), изолируются:

  1. Процессы (PID namespace): Контейнер видит только свои процессы, начиная с PID 1.
  2. Сеть (Network namespace): Контейнер получает собственные сетевые интерфейсы, правила iptables и таблицы маршрутизации.
  3. Пользователи и группы (User namespace): UID/GID внутри контейнера могут быть отображены на другие UID/GID на хосте для повышения безопасности.
  4. Межпроцессное взаимодействие (IPC namespace): Изолирует ресурсы System V IPC и POSIX очереди сообщений.
  5. Имя хоста и домена (UTS namespace): Контейнер может иметь свой собственный hostname.
  6. Ресурсы (Control groups - cgroups): Ограничивает и изолирует потребление ресурсов (CPU, память, дисковый I/O, сеть).

Пример проверки изоляции процессов:

# На хосте видим все процессы
ps aux

# В контейнере видим только процессы контейнера
docker run --rm alpine ps aux
PID   USER     TIME  COMMAND
    1 root      0:00 ps aux

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