Контейнеризация

Из Википедии, бесплатной энциклопедии

Контейнеризация (виртуализация на уровне операционной системы, контейнерная виртуализация, зонная виртуализация[1]) — метод виртуализации, при котором ядро операционной системы поддерживает несколько изолированных экземпляров пространства пользователя вместо одного. Эти экземпляры (обычно называемые контейнерами или зонами) с точки зрения выполняемых в них процессов идентичны отдельному экземпляру операционной системы.

В Unix-подобных системах эта технология является развитием механизма chroot, который изменяет корневую директорию для текущего процесса и его дочерних процессов. Помимо изоляции, ядро ОС обычно предоставляет механизмы управления ресурсами (например, ограничение CPU, памяти), чтобы минимизировать влияние одного контейнера на другие.

Контейнеры в Linux основаны на механизмах виртуализации, изоляции и управления ресурсами, предоставляемых ядром, — пространства имён (namespaces) и cgroups[2]

В отличие от аппаратной виртуализации, при которой эмулируется аппаратное окружение и может быть запущен широкий спектр гостевых операционных систем, в контейнере может быть запущен экземпляр операционной системы только с тем же ядром, что и у хостовой операционной системы (все контейнеры узла используют общее ядро). При этом при контейнеризации отсутствуют дополнительные ресурсные накладные расходы на эмуляцию виртуального оборудования и запуск полноценного экземпляра операционной системы, характерные при аппаратной виртуализации.

Существуют реализации, ориентированные на создание практически полноценных экземпляров операционных систем (Solaris Containers, контейнеры Virtuozzo, OpenVZ), так и варианты, фокусирующиеся на изоляции отдельных сервисов с минимальным операционным окружением (jail, Docker).

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

  • Программа, ожидающая видеть весь компьютер, внутри контейнера воспринимает выделенные ресурсы как единственные доступные.
  • На одной ОС можно создать несколько контейнеров, каждому из которых назначается своё подмножество ресурсов.
  • Внутри контейнера может работать любое количество программ — они выполняются параллельно или последовательно, могут взаимодействовать друг с другом.

Виртуализация на уровне ОС обычно создаёт меньшие накладные расходы по сравнению с полной виртуализацией, поскольку программы в виртуальных разделах используют стандартный системный интерфейс ОС и не требуют:

  • Эмуляции (как в полной виртуализации — VMware ESXi, QEMU, Hyper-V).
  • Промежуточного слоя виртуальной машины (как в паравиртуализации — Xen, User-mode Linux).

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

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

Другие типичные сценарии включают разделение нескольких программ на отдельные контейнеры для повышения безопасности, аппаратной независимости и дополнительных функций управления ресурсами.[3] Однако улучшенная безопасность, обеспечиваемая использованием механизма chroot, не идеальна.[4] Реализации виртуализации на уровне операционной системы, способные к живой миграции, также могут использоваться для динамической балансировки нагрузки контейнеров между узлами в кластере.

Однако контейнеризация не так гибка, как другие подходы к виртуализации, поскольку она не может размещать гостевую операционную систему, отличную от хостовой, или другое гостевое ядро. Например, с Linux разные дистрибутивы хороши, но другие операционные системы, такие как Windows, не могут быть размещены. Операционные системы, использующие переменные входные систематики, подвержены ограничениям в рамках виртуализированной архитектуры. Методы адаптации, включая аналитику ретрансляции облачного сервера, поддерживают виртуальную среду на уровне ОС в этих приложениях.[5]

Реализации

[править | править код]
Механизм Операционная система Лицензия Год выпуска Особенности
Изоляция файловой системы Квоты на пространство хранения Лимиты на ввод-вывод Лимиты на память Квоты ЦПУ Изоляция сети Живая миграция
chroot встроено в большинство Unix-подобных операционных систем в зависимости от лицензии на операционную систему 1982 Частично Нет Нет Нет Нет Нет Нет
FreeBSD Jail FreeBSD BSD 2000 Да Да Нет Да Частично Да Нет
Solaris Containers Solaris, OpenSolaris CDDL 2005 Да Да Нет Да Да Да[6] Нет[7]
FreeVPS Linux GNU GPL - Да Да Нет Да Да Да Нет
iCore Virtual Accounts Windows XP Проприетарное 2008 Да Да Нет Нет Нет Да Нет
Linux-VServer[англ.] Linux GNU GPL v.2 - Да Да Да Да Да Да[8] Нет
LXC Linux GNU GPL v.2 2008 Да Нет Да Да Да Да Нет
OpenVZ Linux GNU GPL v.2 2005 Да Да Да[9] Да Да Да[10] Да
Virtuozzo Containers Linux, Microsoft Windows Проприетарное - Да Да Да[11] Да Да Да[10] Да
sysjail[англ.] OpenBSD, NetBSD BSD - Да Нет Нет Нет Нет Да Нет
WPAR[англ.] AIX Проприетарное 2007 Да Да Да Да Да Да[12] Да[13]
Docker Linux, FreeBSD, Windows, macOS Apache 2.0 2013 Да Да Да Да Да Да Нет
Podman[англ.] Linux, Windows, macOS Apache 2.0 2019 Да

Примечания

[править | править код]
  1. В Solaris
  2. Rami, Rosen. Namespaces and Cgroups, the basis of Linux Containers (англ.) // Техническая конференция по сетевым технологиям Linux : Труды NetDev 1.1. — 2016. — 12 February.
  3. Secure Bottlerocket deployments on Amazon EKS with KubeArmor | Containers (амер. англ.). aws.amazon.com (20 октября 2022). Дата обращения: 2 июня 2025.
  4. Yanek Korff, Paco Hope, Bruce Potter. Mastering FreeBSD and OpenBSD Security. — "O'Reilly Media, Inc.", 2005. — 468 с. — ISBN 978-0-596-00626-6.
  5. Dan Huang, Jun Wang, Qing Liu, Jiangling Yin, Xuhong Zhang, Xunchao Chen. Experiences in using os-level virtualization for block I/O // Proceedings of the 10th Parallel Data Storage Workshop. — New York, NY, USA: Association for Computing Machinery, 2015-11-15. — С. 13–18. — ISBN 978-1-4503-4008-3. — doi:10.1145/2834976.2834982.
  6. Контейнеры Solaris 10 имеют изолированную сеть, когда конкретный NIC приписывается контейнеру («exclusive IP»). Сеть не изолирована, но виртуализирована, то есть каждая виртуальная среда имеет свой IP-адрес, брандмауэр и так далее. Изоляция сети должна достигаться на аппаратном уровне. В OpenSolaris изоляция сети реализована, см. OpenSolaris Network Virtualization and Resource Control и Архивированная копия. Дата обращения: 1 июня 2010. Архивировано из оригинала 1 июня 2008 года..
  7. Реализована холодная миграция.
  8. Сеть изолирована.
  9. Доступна в ядре 2.6.18-028stable021.
  10. 1 2 Сеть не изолирована, а виртуализована, то есть каждая виртуальная среда имеет свой IP-адрес, файрвол и так далее. Изоляция сети не поддерживается и должна быть реализована на аппаратном уровне.
  11. С версии 4.0, январь 2008.
  12. С версии TL 02. См. [1] Архивная копия от 1 марта 2012 на Wayback Machine.
  13. См. [2] Архивная копия от 8 июля 2017 на Wayback Machine