Каким образом Docker изолирует контейнеры друг от друга?

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

Ответ

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

1. Namespaces (Пространства имён) Каждому контейнеру выделяется собственный набор пространств имён, что изолирует его представление о системе:

  • PID namespace: Изолирует дерево процессов. Процессы в контейнере видят только свои PID.
  • Network namespace: Создаёт отдельный сетевой стек (интерфейсы, таблицы маршрутизации, iptables).
  • Mount namespace: Изолирует точки монтирования файловой системы.
  • IPC namespace: Изолирует межпроцессное взаимодействие (очереди сообщений, сегменты разделяемой памяти).
  • UTS namespace: Позволяет контейнеру иметь собственное имя хоста и домена.
  • User namespace: Отображает UID/GID внутри контейнера на непривилегированные UID/GID на хосте.

2. Control Groups (Cgroups) Ограничивают и учитывают использование ресурсов для каждого контейнера:

  • CPU: Ограничивает долю процессорного времени (cpu.shares).
  • Memory: Устанавливает лимит на использование RAM и подкачки (memory.limit_in_bytes).
  • I/O: Ограничивает скорость чтения/записи на блочных устройствах.
  • PIDs: Ограничивает количество процессов.

3. Union File Systems (OverlayFS) Файловая система контейнера строится из слоёв (образ + слой записи), которые изолированы от хоста и других контейнеров. Изменения в одном контейнере не затрагивают другие.

4. Сетевая изоляция По умолчанию контейнеры подключаются к виртуальному мосту docker0 и получают изолированные сетевые пространства. Можно создавать пользовательские сети для дальнейшей сегментации.

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

# На хосте виден процесс Docker-демона и все процессы
ps aux | grep nginx

# Внутри контейнера виден только процесс nginx с PID 1
docker exec -it my-nginx-container ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  12345  6789 ?        Ss   10:00   0:00 nginx: master process

Важное ограничение: Контейнеры разделяют ядро хостовой ОС. Для усиленной изоляции (например, в мультитенантных окружениях) используются дополнительные технологии, такие как gVisor (пользовательский уровень ядра) или Kata Containers (легковесные виртуальные машины).