Docker
👩💻 Какие механизмы используются для реализации контейнеров
> В ядре Linux не существует сущности «контейнер».
Контейнер — это обычный процесс Linux, но запущенный в специальных условиях изоляции и ограничений.
1️⃣ Namespaces — механизм изоляции
Namespaces позволяют процессу «видеть» только свою часть системы.
Например:
📌 PID namespace Изолирует пространство идентификаторов процессов. - Процесс внутри контейнера может думать, что он имеет PID 1 - Но на хосте он будет, например, PID 1864
Это один и тот же процесс — просто он «смотрит» на систему через другой namespace.
🌐 Network namespace Процесс получает: - собственные сетевые интерфейсы - IP-адреса - таблицы маршрутизации - правила firewall (iptables / nftables)
📂 Mount namespace Процесс работает в своей таблице монтирования: - собственный набор файловых систем - изолированные точки монтирования - невидимость файловой системы хоста
В Linux есть ещё: UTS namespace — изолирует hostname и domain name IPC namespace — изолирует механизмы межпроцессного взаимодействия User namespace — изолирует пользователей и группы
2️⃣ Cgroups — механизм ограничения ресурсов
Control Groups (cgroups) позволяют ограничивать:
- 🧠 оперативную память - ⚙️ процессор - 💾 дисковый ввод/вывод - 🌐 сетевые ресурсы
То есть контейнер — это не «лёгкая виртуальная машина», а процесс, помещённый в ограничивающие рамки.
🧩 3️⃣ Union-файловая система Контейнер может существовать без неё, но Docker использует OverlayFS.
Как это работает: 📦 Нижние слои — только для чтения ✍️ Верхний слой — доступен для записи
Внутри контейнера процесс видит объединённую файловую систему.
- Базовые слои переиспользуются между контейнерами - Экономится место - Новый контейнер создаётся мгновенно — просто добавляется новый writable-слой
🧠 Итог Контейнер = обычный процесс Linux - изоляция через namespaces - ограничения через cgroups - overlayfs (в Docker)
Только механизмы ядра Linux.