Ответ
Docker не является полноценной виртуальной машиной, а использует функции ядра операционной системы хоста для изоляции и управления контейнерами. Это позволяет контейнерам быть легковесными и запускаться с минимальными накладными расходами.
Ключевые механизмы ОС, используемые Docker:
-
Namespaces (пространства имен):
- Назначение: Изолируют ресурсы контейнера от хоста и других контейнеров.
- Примеры:
PID namespace: Контейнер видит только свои процессы (PID 1 — его init-процесс).Network namespace: Контейнер имеет свой собственный сетевой стек (IP-адреса, порты, маршруты).Mount namespace: Контейнер имеет свою собственную файловую систему.User namespace,IPC namespace,UTS namespace.
- Почему: Создает иллюзию отдельной операционной системы для каждого контейнера.
-
Cgroups (Control Groups):
- Назначение: Ограничивают и учитывают использование ресурсов (CPU, память, I/O, сеть) для контейнеров.
- Почему: Предотвращает "захват" всех ресурсов хоста одним контейнером и обеспечивает справедливое распределение.
-
Union File Systems (например, OverlayFS, AUFS):
- Назначение: Позволяют Docker эффективно управлять слоями образов.
- Почему: Обеспечивают COW (Copy-on-Write) механизм, при котором изменения записываются в новый слой, а базовые слои остаются неизменными, что экономит место и ускоряет создание контейнеров.
-
Сетевой стек:
- Назначение: Управление сетевой изоляцией и маршрутизацией трафика контейнеров.
- Механизмы: Виртуальные сетевые интерфейсы, мосты (bridges), правила
iptables(Linux) илиWindows Filtering Platform(Windows).
Особенности работы Docker на разных ОС:
- Linux: Docker Engine работает нативно, напрямую используя ядро Linux для всех вышеупомянутых механизмов.
- Windows и macOS: Docker Engine запускается внутри легковесной виртуальной машины (например, на базе Hyper-V для Windows или LinuxKit для macOS). Эта VM, в свою очередь, использует ядро Linux для контейнеризации. Это означает, что все Docker-контейнеры всегда используют ядро Linux, даже если вы работаете на Windows или macOS.