Контейнеризация. Виртуализация на уровне ОС
Контейнеризация - метод, с помощью которого программный код упаковывается в единый исполняемый файл вместе с библиотеками и зависимостями, чтобы обеспечить его корректный запуск. Такие файлы называют контейнерами. Контейнеры можно разворачивать в разных средах и там управлять их работой.
Архитектура контейнеров:
В системе контейнеризации нет гипервизора, есть Container Engine.
Container Engines: Docker, containerd, Solaris Containers, FreeBSD Jails, OpenVZ, LXC (Linux Container)
У контейнеризации stateless подход (без сохранения состояния) и подразумевается, что данные внутри контейнера не будут хранится, а будут ему предоставляться извне, чтобы можно было в любой момент удалить и поднять контейнер заново, допустим.
VM vs Containers:
Virtual Machines | Containers |
---|---|
У каждой ВМ своя ОС | Все контейнеры на едином ОС |
Изоляция на уровне “железа” (аппаратных ресурсов) | Изоляция на уровне ОС |
Загружается минуты | Загружается секунды |
ВМ весят гигабайты | Контейнеры весят мегабайты |
ВМ долго создаются | Контейнеры создаются за секунды |
Кушает много ресурсов | Кушает мало ресурсов |
ВМ легко переносятся на другие хосты/ноды виртуализации | Контейнеры проще пересоздать |
Пространство имен и cgroup
Контейнер - это, по сути, процесс хост-машины. Один процесс - один контейнер, и он содержит все нужные процессу зависимости.
Минимальный состав контейнера и их функции:
- Пространство имен (namespace)
изоляция доступа - cgroup
управление ресурсами - rootfs
изоляция fs (файловой системы) - Container Engine
управления life-cycle-ом контейнера
Container Engine реализует:
- изоляцию ресурсов с помощью пространства имен
- ограничение ресурсов с помощью контрольных групп (cgroup)
- эффективные файловые операции с помощью копирования при записи
Namespace (Пространство имен)
Пространство имен предоставляет изолированную среду для процессов. Оно позволяет каждому процессу видеть только определенные ресурсы и ограничивает доступ одного процесса к другим процессам и ресурсам системы. Используется для изоляции fs, сетевых интерфейсов, процессов и других ресурсов.
Пространство имен позволяет каждому контейнеру иметь свою собственную видимость файловой системы, сети и процессов, что обеспечивает изоляцию между контейнерами.
Сgroup (control group)
Cgroup используется для управления и ограничения ресурсов, которые могут быть использованы процессами. Он позволяет назначать ограничения на использование процессора, памяти, дискового пространства и других ресурсов. Cgroup также позволяет контролировать приоритеты процессов и устанавливать ограничения на их потребление ресурсов.
Cgroup позволяет устанавливать ограничения на использование ресурсов каждым контейнером, чтобы предотвратить их неограниченное потребление и обеспечить справедливое распределение ресурсов между контейнерами.