На чем основана изоляция в Docker?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Изоляция в Docker основана на использовании возможностей ядра Linux: namespaces и cgroups.
-
Namespaces (Пространства имен) предоставляют изоляцию ресурсов на уровне имен. Каждый контейнер получает свой набор пространств имен, что позволяет ему "видеть" только свои ресурсы и процессы. Основные namespaces:
- PID (Process ID): Изоляция списка процессов. Внутри контейнера PID 1 является init-процессом.
- NET (Network): Изоляция сетевого стека. У контейнера есть свой сетевой интерфейс(ы), IP-адрес(а), таблица маршрутизации, правила iptables.
- UTS (Unix Time-sharing System): Изоляция имени хоста и доменного имени.
- MNT (Mount): Изоляция файловой системы. Контейнер имеет свое корневое пространство монтирования.
- USER: Изоляция идентификаторов пользователей и групп (UID/GID). Позволяет root в контейнере быть обычным пользователем на хосте.
- IPC (Inter-Process Communication): Изоляция средств межпроцессного взаимодействия (семафоры, разделяемая память).
-
Cgroups (Control Groups) предоставляют изоляцию и контроль над ресурсами хоста, такими как CPU, память, дисковый ввод/вывод, сетевая пропускная способность. С помощью cgroups можно ограничивать потребление ресурсов контейнерами, предотвращая их влияние друг на друга и на сам хост. Например, можно выделить контейнеру определенное количество ядер CPU или максимальный объем оперативной памяти.
Сочетание namespaces для изоляции видимости ресурсов и cgroups для ограничения потребления ресурсов обеспечивает сильную, но легковесную изоляцию процессов контейнеров по сравнению с традиционными виртуальными машинами.
# Пример использования namespaces в Linux
# Запуск команды в новом PID, UTS, MNT, NET namespace
# unshare --pid --uts --mount --net --fork /bin/bash
# Пример использования cgroups для ограничения памяти процесса
# mkdir /sys/fs/cgroup/memory/my_container
# echo 100M > /sys/fs/cgroup/memory/my_container/memory.limit_in_bytes
# echo $$ > /sys/fs/cgroup/memory/my_container/tasks
# # Процесс, запущенный в текущей оболочке, теперь ограничен 100М памяти