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.