Контейнеризация. Виртуализация на уровне ОС

Контейнеризация - метод, с помощью которого программный код упаковывается в единый исполняемый файл вместе с библиотеками и зависимостями, чтобы обеспечить его корректный запуск. Такие файлы называют контейнерами. Контейнеры можно разворачивать в разных средах и там управлять их работой.

Архитектура контейнеров:
550
В системе контейнеризации нет гипервизора, есть Container Engine.
Container Engines: Docker, containerd, Solaris Containers, FreeBSD Jails, OpenVZ, LXC (Linux Container)
У контейнеризации stateless подход (без сохранения состояния) и подразумевается, что данные внутри контейнера не будут хранится, а будут ему предоставляться извне, чтобы можно было в любой момент удалить и поднять контейнер заново, допустим.

VM vs Containers:

Virtual MachinesContainers
У каждой ВМ своя ОСВсе контейнеры на едином ОС
Изоляция на уровне “железа” (аппаратных ресурсов)Изоляция на уровне ОС
Загружается минутыЗагружается секунды
ВМ весят гигабайтыКонтейнеры весят мегабайты
ВМ долго создаютсяКонтейнеры создаются за секунды
Кушает много ресурсовКушает мало ресурсов
ВМ легко переносятся на другие хосты/ноды виртуализацииКонтейнеры проще пересоздать

Пространство имен и cgroup

Контейнер - это, по сути, процесс хост-машины. Один процесс - один контейнер, и он содержит все нужные процессу зависимости.

Минимальный состав контейнера и их функции:

  • Пространство имен (namespace)
    изоляция доступа
  • cgroup
    управление ресурсами
  • rootfs
    изоляция fs (файловой системы)
  • Container Engine
    управления life-cycle-ом контейнера

Container Engine реализует:

  • изоляцию ресурсов с помощью пространства имен
  • ограничение ресурсов с помощью контрольных групп (cgroup)
  • эффективные файловые операции с помощью копирования при записи

Namespace (Пространство имен)

Пространство имен предоставляет изолированную среду для процессов. Оно позволяет каждому процессу видеть только определенные ресурсы и ограничивает доступ одного процесса к другим процессам и ресурсам системы. Используется для изоляции fs, сетевых интерфейсов, процессов и других ресурсов.

Пространство имен позволяет каждому контейнеру иметь свою собственную видимость файловой системы, сети и процессов, что обеспечивает изоляцию между контейнерами.

Сgroup (control group)

Cgroup используется для управления и ограничения ресурсов, которые могут быть использованы процессами. Он позволяет назначать ограничения на использование процессора, памяти, дискового пространства и других ресурсов. Cgroup также позволяет контролировать приоритеты процессов и устанавливать ограничения на их потребление ресурсов.

Cgroup позволяет устанавливать ограничения на использование ресурсов каждым контейнером, чтобы предотвратить их неограниченное потребление и обеспечить справедливое распределение ресурсов между контейнерами.


Docker

dockercontainer