Данная статья применима к:
- Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7)
Аннотация
В статье рассматриваются базовые понятия системы изоляции приложений docker, отличия систем изоляции приложений от систем виртуализации и вытекающие из этих отличий ограничения применения, разъяснятся базовая терминология, применяемая к объектам docker.
Термины
Виртуализация - технология, позволяющая запускать экземпляры операционных систем (гостевые машины) параллельно и изолированно на единственной хост-машине. При этом каждой гостевой операционной системе предоставляется полноценная виртуальная машина, имеющая собственные виртуальные аппаратные ресурсы, и гостевая операционная система использует собственное ядро. При этом гостевая виртуальная машина может отличаться по архитектуре от хост-машины, а гостевая операционная система может быть полностью отличной от операционной системы хост-машины. Виртуализация обеспечивает полное моделирование используемого оборудования полностью индивидуальное для каждой гостевой ОС. Гостевые ОС полностью изолированы друг от друга, и каждая гостевая ОС работает в собственной виртуальной программно-аппаратной среде, полностью копирующей реальное оборудование и содержащей полную копию всех необходимых ресурсов;
Изоляция приложений (контейнерная изоляция) - технология, позволяющая выполнять экземпляры приложений (групп приложений) в изолированной среде внутри операционной системы хост-машины. В маркетинговых целях часто обозначается термином "контейнерная виртуализация", хотя в самом деле полноценной виртуализацией не является. Соответственно, в качестве аналога термина "виртуальная машина" используется термин "контейнер", хотя контейнер не является полноценной виртуальной машиной. Контейнерная виртуализация - технология виртуализации обеспечивающая совместное использование ресурсов операциооной системы хост-машины гостевыми приложениями. Экземпляры приложений, выполняющихся в контейнерах, изолированы друг от друга и (насколько это возможно) от хостовой операционной системы, но при этом ресурсы хостовой ОС используются ими совместно. Частным случаем приложения, изолированно выполняемого в контейнере, может быть экземпляр хостовой операционной системы (система lxc);
Гипервизор - программное обеспечение, позволяющее запускать множественные гостевые (виртуальные) машины или контейнеры на единственной физической машине (хост-машине), обеспечивающее предоставление ресурсов виртуальным машинам и обеспечивающее ограничение и разграничение прав доступа;
Гостевая машина - виртуальная машина, запускаемая в изолированной среде системы виртуализации внутри хостовой операционной системы;
Гостевая операционная система - операционная система, работающая на гостевой машине. Термин "гостевая операционная система" неприменим к контейнерам, так как контейнеры не предоставляют полноценную операционную систему, а в разной мере используют хостовую операционную систему;
Контейнер - изолированная среда выполнения приложений (групп приложений), работающая в хостовой операционной системе;
Хостовая операционная система, хостовая ОС - операционная система хост-машины;
Хост-машина - машина, в операционной системе которой запущен гипервизор виртуализации или контейнерной изоляции, под управлением которого работают гостевые машины или контейнеры.
Графическое сравнение технологий виртуализаци и контейнерной изоляции на примере QEMU/KVM (виртуализация) и docker (изоляция) приведено на рисунке:
Системы виртуализации и контейнерной изоляции в Astra Linux
В составе Astra Linux поддерживаются следующие системы виртуализации и контейнерной изоляции:
- QEMU/KVM - полноценная система виртуализации. См. Виртуализация QEMU/KVM в Astra Linux;
- lxc - система контейнерной изоляции, ориентированная на работу с приложениями - операциоными системами (см. FireJail и LXC);
- docker - система контейнерной изоляции, ориентированная на работу с приложениями - системными службами (рассматривается далее в настоящей статье);
- firejail - система контейнерной изоляции пользовательского уровня, ориентированая рабоу с пользовательскими приложениями (см. FireJail и LXC).
Система контейнерной виртуализации Docker
Назначение
Система контейнерной изоляции Docker является в первую очередь системой быстрого распространения и развёртывания системных приложений (системных служб, таких, как, например почтовый сервер exim или web-сервер apache2).
Традиционный способ развертывания подобных приложений без использования Docker предполагает следующие шаги:
- передача администратору целевой ОС инструкций по установке и комплекта неких файлов приложения, как правило, в форме debian-пакета, содержащего:
- исполнимые файлы;
- конфигурационные файлы;
- сценарии установки и удаления.
- выполнение администратором целевой ОС предоставленных инструкций на целевой машине с целью развёртывания устанавливаемого приложения.
При этом, несмотря на то, что разработчиками приложений тратятся значительные усилия на создание и проверку сценариев развёртывания, учитывающих возможные особенности целевых машин и возможные конфликты с другими приложениями, выполнение действий по установке часто завершается неудачей - в силу специфических особенностей целевых машин, все варианты которых предусмотреть невозможно.
Docker предлагает альтернативный вариант развертывания приложений, при котором поставщик приложений передаёт пользователям приложений предварительно настроенные контейнеры с приложениями. Эти контейнеры просто запускаются пользователем на целевой машине, предоставляя каждому приложению изолированное предварительно настроенное окружение для работы. Таким образом, исключается существенная часть ошибок развертывания, связанных с предварительной настройкой нестандартных пользовательских систем. Хорошим примером использования возможностей Docker по быстрому развёртыванию приложений является пример развертывания собственного реестра образов, выполняемого путем простого скачивания подготовленного образа (см. раздел "Администрирование" - "Создание собственного реестра образов").
Docker не предназначен для изоляции пользовательских приложений, для этого предназначен firejail (см. FireJail и LXC).
Рекомендованный сценарий применения Docker
Рекомендованный сценарий применения Docker учитывает основное назначение Docker: быстрое развертывание приложений. Порядок действий
- Создать (загрузить) исходный образ;
- Создать из этого образа контейнер, работая в котором выполнить и сохранить дополнительные настройки, то есть настройки запуска нужного приложения в ограниченной среде Docker;
- Конвертировать контейнер с выполненными настройками в новый образ;
- Скопировать новый образ на целевые машины для использования;
- На целевых машинах дальнейшее использование зависит от поставленных задач:
- Можно использовать контейнеры, сохраняющие возникающие при эксплуатации изменения в этих контейнерах;
- Можно использовать образ, монтируя к нему внешние каталоги, в которых сохраняются изменения, не сохраняя изменения в контейнерах;
- Можно комбинировать указанные варианты.
Ограничения
- Docker, в отличие от виртуальных машин, использует ядро хостовой ОС. Из этого следует:
- Так как в Astra Linux Special Edition функции КСЗ интегрированы в ядро, выполнение приложений в контейнерах в режимах защиты (Базовый "Орел", Усиленный "Воронеж", Максимальный "Смоленск"), отличающихся от режима защиты хостовой операционной системы не поддерживается. Таже не подерживается варианты отличий режимов, связанные с возможностями принудительного отключения МРД или МКЦ в Усиленном и Максимальном режимах защиты. Приложение, работающее в контейнере, всегда будет ограничено действующими в хостовой операционной системе правилами МРД и МКЦ, а попытки нарушить или изменить эти правила приложением из контейнера приведут к ошибкам;
- Не обеспечивает полной кросс-платформенности. Контейнеры на операционных системах с разными ядрами могут быть запущены с помощью специальных приемов (запуска виртуальных машин), требующих дополнительного расхода ресурсов в Astra Linux не поддерживается. То есть:
- В Astra Linux Common Edition допускается использовать только контейнер для Astra Linux Common Edition;
- В Astra Linux Special Edition допускается использовать только контейнер для Astra Linux Special Edition в том же режиме защиты, а переключение режима защиты может привести к неработоспособности ранее созданных контейнеров;
- Контейнер Docker не содержит собственной полноценной ОС, и не поддерживает systemd. В контейнерах отсутствуют команды systemctl, hostnamectl и пр. Из того, что не поддерживается systemd следует, что не поддерживается dbus. Из того, что не поддерживается dbus следует, что многие пользовательские приложения могут оказаться неработоспособными в контейнере.
- Docker не предназначен для:
- Повышения производительности приложений. Контейнеризация Docker потребляет меньше ресурсов, чем полноценная система виртуализации, но, в любом случае, контейнеризация потребляет часть доступных ресурсов;
- Повышения безопасности. Изоляция приложений в разных контейнерах затрудняет распространение угроз при компрометации приложений, однако все контейнеры разделяют одну хостовую ОС, и всегда существует риск появления приложений с неполной изоляцией;
- Работы с графическими приложениями. Благодаря тому, что современные графические менеджеры поддерживают удаленную работу с подключением через сети, графические приложения могут использоваться в контейнерах, однако это требует дополнительных настроек.
- Docker вносит значительные изменения в сетевые настройки, что может привести к полной или частичной неработоспособности хост-машины.
Преимущества
Главное преимущество контейнеров в том, что по сравнению с системами виртуализации запуск контейнеров требует значительно меньших вычислительных ресурсов, чем запуск полноценной виртуальной машины.
Кроме этого, Docker для экономии ресурсов поддерживает систему повторного использования "слоев". "Слой" в терминологии Docker - это некий моментальный снимок состояния системы, а "образ" - это итоговое состояние системы с учетом состояний всех подлежащих слоев. При этом "слои" могут использоваться повторно разными "образами":
Дополнительным эффектом от повторного использования "слоев" является снижение объемов передаваемых данных при передаче подготовленных в виде образов прикладных программ: при использовании реестра образов Docker передаваться будет только новые слои, в примере выше - слой "Базовая система Astra Linux SE" будет загружен из реестра образов только один раз, далее загружаться будут только новые слои.
Термины
Докерфайл - текстовый документ, содержащий все команды, выполнение которых требуется для создания образа Docker. Образы могут создаваться автоматически путём интерпретации докерфайлов и применения содержащихся в докерфайле инструкция к образу;
Слой - внутри образов слой это изменение файловой системы, представленное инструкцией в докерфайле. Слои последовательно "накладываются" на базовую файловую систему образа, создавая итоговый образ. Любой слой может использоваться несколькими образами одновременно. При изменении образа в нём заменяются только изменившиеся слои, что позволяет обновлять образы быстро и с небольшими затратами ресурсов. Размер образа равен сумме размеров входящих в него слоёв;
Образ - основа контейнеров. Контейнер не имеет состояний и не изменяется. Контейнер состоит из:
- Базовой файловой системы;
- Упорядоченного набора изменений ("слоев") в этой файловой системе;
- Базовых параметров исполнения, применяемых при запуске контейнеров.
Контейнер - образ, находящийся в работе, то есть образ с новым изменяющимся слоем. При работе контейнера все изменения сохраняются в новом слое, а образ (т.е. все предыдущие слои) остаётся неизменным;
Реестр образов - сетевое хранилище подготовленных образов, доступных для загрузки на целевые машины и последующего выполнения в качестве контейнеров.
Дополнительным эффектом от повторного использования "слоев" является снижение объемов передаваемых данных при передаче подготовленных в виде образов прикладных программ: при использовании реестра образов Docker передаваться будет только новые слои, в примере выше - слой "Базовая система Astra Linux SE" будет загружен из реестра образов только один раз, далее загружаться будут только новые слои.