Ответ
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 (легковесные виртуальные машины).