Ответ
Изоляция Docker-контейнеров достигается за счет комбинации двух фундаментальных механизмов ядра Linux, которые позволяют запускать процессы в изолированных окружениях, используя общее ядро хост-системы.
-
Пространства имен (Namespaces) Namespaces обеспечивают изоляцию системных ресурсов. Каждый контейнер получает свой собственный набор ресурсов, невидимый для других контейнеров и хост-системы.
- PID (Process ID): Изоляция процессов. Процессы внутри контейнера имеют свою собственную нумерацию, начиная с PID 1.
- NET (Network): Изоляция сетевого стека. У контейнера свой IP-адрес, таблица маршрутизации и сетевые интерфейсы.
- MNT (Mount): Изоляция файловой системы. Контейнер видит только свою файловую систему, смонтированную из образа.
- UTS (UNIX Time-sharing System): Изоляция имени хоста и домена.
- IPC (Inter-Process Communication): Изоляция межпроцессного взаимодействия.
- User: Изоляция идентификаторов пользователей (UID/GID).
-
Контрольные группы (Control Groups, cgroups) Cgroups отвечают за ограничение и учет потребления системных ресурсов процессами.
- Ограничение ресурсов: Можно задать лимиты на использование CPU, оперативной памяти (RAM), дискового I/O.
- Приоритизация: Можно управлять приоритетом процессов контейнера.
- Учет: Cgroups собирают статистику по потреблению ресурсов.
Пример ограничения ресурсов с помощью cgroups:
Запуск контейнера, которому будет доступно не более 50% одного ядра CPU и 512 МБ оперативной памяти:
# --cpus="0.5" ограничивает использование CPU
# --memory="512m" ограничивает использование RAM
docker run --cpus="0.5" --memory="512m" -it ubuntu:latest bash
Таким образом, Docker не использует виртуализацию, а напрямую работает с ядром хоста, что обеспечивает высокую производительность и легковесность контейнеров.