1.2. Механизм работы: изоляция на уровне ОС
Контейнер в рамках операционной системы Linux представляет собой изолированное древо процессов, запущенное в выделенном пространстве имен. Находясь в отдельном пространстве имен, процессы в древе не могут видеть и коммуницировать с процессами в соседних деревьях. Также предполагается отдельная файловая иерархия, созданная для контейнера, в рамках которой работают процессы.
Основу контейнера представляет файловая иерархия, которая является образом корневой файловой системы Linux. Все процессы в Linux взаимодействуют с учетом набора «стандартных» по большей части путей поиска. Так, например, процессы будут подключать динамические библиотеки из директорий /lib, /lib64, /usr/lib, /usr/lib64, /usr/libexec и иных директорий, указанных для механизма LD.
Механизм, обеспечивающий переход в иную файловую иерархию — chroot. Аналогично, консольные утилиты и другие программы, с которыми взаимодействуют сценарии оболочки и скрипты на высокоуровневых языках преимущественно будут находится в /bin, /usr/bin/, /usr/local/bin и иных указанных в переменной окружения PATH директориях. Механизм chroot позволяет процессу Linux перенести представление корневой папки относительно другой директории. Так, например, процесс может перенести корневое представление в папку /my_root, после чего обращения к /bin, /lib, /usr/lib, и др. будут перенаправляться в /my_root/bin, /my_root/lib, /my_root/usr/lib соответственно.
Для этого был введен протокол 9P, взаимодействие с которым обеспечивает прозрачное взаимодействие с гетерогенными файловыми иерархиями. Так, в рамках системы Plan 9 процесс не сможет отличить удаленный ресурс от локального, ровно как и не сможет различить границы разных иерархий.
Механизм пространств имен вводился в Linux с 2002 по 2006 год и дополнялся новыми видами изоляции. Сначала он был перенят ядром Linux для пространства имен монтирования. Этот механизм позволял ядру предоставлять процессам разные файловые иерархии, однако этого было недостаточно для разграничения остальных ресурсов. Так, например, все процессы по прежнему могли индексировать все остальные процессы в силу общей виртуальной файловой системы proc.
Однако, chroot не изолирует иерархию монтирования — процесс внутри chroot способен внести изменения в список монтирования для внешних процессов, что может нарушить их работу. Для изоляции точек монтирования применяется механизм пространства имён монтирования.
Следующим слоем изоляции контейнера является пространство имён процессов. При возможности монтировать файловую систему proc внутрь нового корневого представления, процесс может узнать состояние и взаимодействовать с другими процессами, находящимися в реальном корневом представлении, что также нарушает изоляцию.
Для разграничения групп процессов существует пространство имен процессов, в рамках которого процессы могут видеть только выделенную им часть древа.
Для изоляции контейнера как отдельного виртуального сетевого субъекта применяется сетевое пространство имен. Сетевое пространство имен создает отдельную группу доступных контейнеру сетевых интерфейсов, ограничивая подключения к хостовым сетевым интерфейсам.
Чаще всего оно используется в совокупности с эмулятором сетевого интерфейса (таким как например slirp4netns), который позволяет создать виртуальный сетевой интерфейс, назначить ему виртуальный мост, IP- и MAC-адрес. Таким образом контейнер становится отдельной сетевой сущностью.
cgroups обеспечивают контроль и ограничение ресурсов. Каждое пространство имен создает собственный слой изоляции, что в совокупности приближает работу процесса в контейнере к работе в изолированном экземпляре ядра. Однако без контроля ресурсов один «прожорливый» контейнер мог бы истощить ресурсы всей системы.
Для этого используются cgroups, которые позволяют ограничить максимальное использование памяти, распределить процессорное время между контейнерами, контролировать дисковый ввод-вывод и ограничить сетевую полосу пропускания.
В совокупности каждое пространство имен увеличивает степень изоляции контейнера, а cgroups гарантируют стабильность системы. Эта комбинация технологий делает контейнеры одновременно изолированными и эффективными с точки зрения использования ресурсов.