В октябре 2014 года компания Microsoft объявила о
партнерстве с Docker, в рамках которого будет представлена реализация контейнерной виртуализации для будущей версии ОС Windows Server, ожидаемая в 3 квартале 2015 года. Для поддержки контейнеров Microsoft воспользуется собственной технологией, разработанной в исследовательском проекте Drawbridge. Технология виртуализации Drawbridge похожа на ту, что применяется в проекте Wine, позволяющем запускать приложения Windows на компьютерах с UNIX-подобными операционными системами. Ключевая особенность обеих технологий заключается в том, что виртуализация аппаратуры (процессора, памяти, устройств ввода-вывода) не требуется, а эмулируется исключительно исполняемое окружение ОС Windows.
Parallels начала разрабатывать контейнеры под Windows задолго до того, как об этом задумались в Microsoft. И поскольку эта тема в связи с анонсом Microsoft, очевидно, становится очень актуальной, то в этом посте я постараюсь рассказать, за счет каких именно технологий работают наши Windows-контейнеры, какими функциональными возможностями обладают, а также каковы основные сценарии их применения. В комментариях готов ответить на все вопросы, включая самый популярный — сколько максимально контейнеров можно запустить на хосте.
Увеличение мощностей вычислительных систем продолжает подчиняться закону Мура, но как эффективно использовать эти системы с минимальными накладными расходами? Одно из возможных решений — применение контейнеров для контроля ресурсов и изоляции приложений, запущенных разными пользователями. Без ложной скромности, пионером и лидером в продвижении контейнерных технологий является компания Parallels, которая, помимо продуктов для ОС на базе ядра Linux, вот уже без малого 10 лет предлагает свою собственную реализацию контейнеров для Windows. Подход, реализованный в Parallels, основан на виртуализации ядра ОС, которое после модификаций способно запускать произвольное количество пользовательских окружений Windows.
Пользовательское окружение размещено на виртуальном диске, содержащем ссылки на файлы ОС Windows и свой собственный системный реестр; с этого же диска запускаются системные файлы ОС Windows, которые формируют окружение для пользователей (в том числе администратора), с возможностью членства в домене, работы приложений и сетевого взаимодействия через виртуальный адаптер. Это то, что мы называем Parallels-контейнером для Windows.
Контейнеры Parallels — как для ОС на базе ядра Linux, так и для Windows, — полагаются на модификации в ядре. И если Linux-сообщество приняло от Parallels большинство этих изменений в главную ветку исходных кодов ядра, то компания Microsoft не была настолько открытой. За время работы над контейнерами мы направили в Microsoft большое количество сообщений об обнаруженных ограничениях и просто ошибках в компонентах ядра Windows. Часть из них были учтены в следующих версиях Windows, а для решения более десятка проблем Microsoft выпустила отдельные пакеты исправлений. Так что можно сказать, что мы тоже участвуем, хотя и косвенно, в разработке компонентов ядра Windows. Но, к сожалению, на наши инициативы о расширении сотрудничества в компании Microsoft пойти не решились.
Так как же это все-таки работает, если Microsoft не принимает изменения и не предоставляет доступ к исходным кодам ядра Windows? При разработке контейнеров Parallels центральное место занимают 2 технологии: реверс-инжиниринг и обновление программного кода во время исполнения.

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

Обратим внимание на скриншоты. Во-первых, можно сделать вывод, что опыт взаимодействия пользователя с ОС в контейнере ничем не отличается от взаимодействия с самой операционной системой Windows, во-вторых, становится понятно, как работает изоляция. Контейнеры ничего не знают ни друг о друге, ни о хосте, на котором они размещены, а вот с самого хоста контейнеры легко доступны, поэтому администратор хоста является СуперАдминистратором для контейнеров. Контейнеры интегрированы в ОС Windows таким образом, чтобы штатные инструменты ОС, такие как Диспетчер задач, Редактор Реестра и набор утилит Sysinternals Марка Руссиновича могли использоваться для управления контейнерами и их мониторинга.
Самый популярный вопрос наших пользователей – сколько контейнеров Parallels можно запустить на хосте? В лаборатории Parallels во время эксперимента нам удалось запустить порядка 600 контейнеров, в которые можно было авторизоваться через RDP, хотя задержки в отклике пользовательского интерфейса были уже неприемлемо велики. Дальнейшие эксперименты подтвердили, что накладные расходы на виртуализацию ядра ОС относительно невелики и заметно меньше, чем в решениях на базе гипервизоров, поэтому решающими факторами будут приложения, которые вы планируете запускать в контейнере, и физические возможности самого хоста.
Для применения в реальной жизни количество приложений внутри контейнеров необходимо ограничивать, поэтому контроль ресурсов – это ключевая функциональная возможность контейнеров Parallels. Можно контролировать потребление контейнером вычислительной мощности процессоров, памяти, занимаемого места на СХД и сетевого трафика.
Как разворачивать приложения внутри контейнеров Parallels? Можно делать это как обычно, запуская установщик приложения, но если контейнеров очень много — жать кнопку «Установить» придется неисчислимое количество раз. Чтобы автоматизировать процесс и не тратить дисковое пространство контейнера для размещения файлов приложения, мы применяем Шаблоны приложений. Физически шаблон — это файл, в котором хранится информация, воспроизводящая оригинальное размещение файлов, папок и ключей реестра. Для создания шаблона приложения используется специальный инструмент, Мастер Создания Шаблонов, который отслеживает все изменения на файловой системе и в реестре, которые вносит установщик приложения, и сохраняет эти изменения в шаблон приложения. Получившийся шаблон приложения можно подключить к любому контейнеру, что будет эквивалентно установке этого приложения, и сразу же начать им пользоваться в контейнере. Пользователь контейнеров Parallels может самостоятельно создать шаблон из любого приложения, которое можно установить внутрь контейнера.

Контейнеры Parallels делят друг с другом не только ядро, но и все файлы, установленные на хост из дистрибутива OC Windows, что значительно экономит место на СХД. Дедупликация данных осуществляется на файловом уровне с помощью шаблонов и специализированной файловой системы с поддержкой копирования-при-записи. Для каждой поддерживаемой версии ОС Windows, включая языковые локализации, Parallels выпускает шаблон ОС. Шаблон ОС отличается от шаблона приложения только тем, что содержимое файлов в нем не хранится. Изнутри контейнера обращение к файлам из шаблона ОС выглядит абсолютно прозрачно, создавая целостное представление файловой структуры ОС Windows, состоящее из общих и приватных для контейнера файлов. Поддержка в файловой системе копирования-при-записи позволяет избежать модификации файлов из шаблона ОС, сохраняя изменения только внутри контейнера.

С самого начала проекта мы в Parallels предлагали свои контейнеры для хостинга веб-приложений, главное из которых — система автоматизации Parallels Plesk. Продукты хостинга на базе контейнеров Parallels предлагают ведущие мировые провайдеры, такие как AT&T, 1&1, GoDaddy, HostEurope и др.

Но больше всего контейнеры Parallels под Windows подходят для развертывания множества одинаковых окружений, управляемых и настраиваемых единообразно. Пример такого сценария — виртуализация рабочих столов. Так, Parallels в партнёрстве с интегратором IBS разработала и с 2013 предлагает сертифицированное ФСТЭК решение Parallels VDI, которое состоит из брокера соединений и виртуализации на базе контейнеров. В настоящий момент на базе этого решения реализуется масштабный проект по автоматизации Федеральной налоговой службы РФ, предусматривающий переезд в облачный дата-центр более 10.000 рабочих мест.
Проект контейнеров под Windows стартовал в мае 2002 года, после удачных экспериментов с контейнерами Parallels на базе ядра ОС Linux. В январе 2003 года был продемонстрирован прототип на Windows 2000 Server, который умел запускать 50 изолированных копий Microsoft IIS и Microsoft SQL Server, а уже в июне 2005 состоялся первый публичный релиз продукта Parallels Virtuozzo Containers for Windows 2003 Server версии 3.0.
На сегодняшний день проект пережил 7 публичных релизов, было выпущено без малого 300 обновлений, а кодовая база проекта превысила 1.300.000 SLOCs. А совсем недавно общее количество контейнеров, созданных с использованием технологий Parallels (включая описываемую), превысило 1.000.000!
Высокой оценки контейнеры Parallels заслужили и в Microsoft – в частных беседах инженеры этой компании отзывались о проекте как о самом технически сложном для ядра Windows.

Приход Microsoft на рынок контейнеров, без сомнения, сделает такой подход к виртуализации гораздо популярнее, а решения Docker позволят «заворачивать» приложения в контейнеры простым и удобным способом. С технической точки зрения достоинством контейнеров Microsoft можно считать небольшие затраты на виртуализацию и возможность реализовать контейнеры исключительно в пользовательском режиме исполнения ОС. К недостаткам можно отнести трудности в обеспечении совместимости приложений, ведь для этого необходимо эмулировать весь Windows API, который на данный момент насчитывает тысячи вызовов.
Несмотря на то, что подходы к реализации контейнеров в Parallels и Microsoft различны, обе технологии могут прекрасно дополнять друг друга — контейнеры Microsoft, вероятно, смогут работать внутри контейнеров Parallels. Поэтому мы рассматриваем Microsoft не как конкурента, а как создателя экосистемы Windows, в которой контейнерная виртуализация занимает важное место.
Нам позволяет надеяться на это тот факт, что существующие сейчас на рынке проекты по контейнерной виртуализации для ОС на базе ядра Linux не находятся в состоянии конкуренции – над большинством из них команды из Parallels, Google, IBM, Canonical, Docker и т.д. работают совместно. И хотя экосистема разработки ОС Windows по понятным причинам более закрыта, мы рассчитываем на дальнейшее сотрудничество.
Узнать больше и попробовать продукт Parallels Containers for Windows можно здесь.
Я постараюсь также ответить на все ваши вопросы в комментариях.

Parallels начала разрабатывать контейнеры под Windows задолго до того, как об этом задумались в Microsoft. И поскольку эта тема в связи с анонсом Microsoft, очевидно, становится очень актуальной, то в этом посте я постараюсь рассказать, за счет каких именно технологий работают наши Windows-контейнеры, какими функциональными возможностями обладают, а также каковы основные сценарии их применения. В комментариях готов ответить на все вопросы, включая самый популярный — сколько максимально контейнеров можно запустить на хосте.
Контейнеры Parallels
Увеличение мощностей вычислительных систем продолжает подчиняться закону Мура, но как эффективно использовать эти системы с минимальными накладными расходами? Одно из возможных решений — применение контейнеров для контроля ресурсов и изоляции приложений, запущенных разными пользователями. Без ложной скромности, пионером и лидером в продвижении контейнерных технологий является компания Parallels, которая, помимо продуктов для ОС на базе ядра Linux, вот уже без малого 10 лет предлагает свою собственную реализацию контейнеров для Windows. Подход, реализованный в Parallels, основан на виртуализации ядра ОС, которое после модификаций способно запускать произвольное количество пользовательских окружений Windows.

А что под капотом?
Контейнеры Parallels — как для ОС на базе ядра Linux, так и для Windows, — полагаются на модификации в ядре. И если Linux-сообщество приняло от Parallels большинство этих изменений в главную ветку исходных кодов ядра, то компания Microsoft не была настолько открытой. За время работы над контейнерами мы направили в Microsoft большое количество сообщений об обнаруженных ограничениях и просто ошибках в компонентах ядра Windows. Часть из них были учтены в следующих версиях Windows, а для решения более десятка проблем Microsoft выпустила отдельные пакеты исправлений. Так что можно сказать, что мы тоже участвуем, хотя и косвенно, в разработке компонентов ядра Windows. Но, к сожалению, на наши инициативы о расширении сотрудничества в компании Microsoft пойти не решились.
Так как же это все-таки работает, если Microsoft не принимает изменения и не предоставляет доступ к исходным кодам ядра Windows? При разработке контейнеров Parallels центральное место занимают 2 технологии: реверс-инжиниринг и обновление программного кода во время исполнения.

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

Обратим внимание на скриншоты. Во-первых, можно сделать вывод, что опыт взаимодействия пользователя с ОС в контейнере ничем не отличается от взаимодействия с самой операционной системой Windows, во-вторых, становится понятно, как работает изоляция. Контейнеры ничего не знают ни друг о друге, ни о хосте, на котором они размещены, а вот с самого хоста контейнеры легко доступны, поэтому администратор хоста является СуперАдминистратором для контейнеров. Контейнеры интегрированы в ОС Windows таким образом, чтобы штатные инструменты ОС, такие как Диспетчер задач, Редактор Реестра и набор утилит Sysinternals Марка Руссиновича могли использоваться для управления контейнерами и их мониторинга.
Сколько вешать в граммах?
Самый популярный вопрос наших пользователей – сколько контейнеров Parallels можно запустить на хосте? В лаборатории Parallels во время эксперимента нам удалось запустить порядка 600 контейнеров, в которые можно было авторизоваться через RDP, хотя задержки в отклике пользовательского интерфейса были уже неприемлемо велики. Дальнейшие эксперименты подтвердили, что накладные расходы на виртуализацию ядра ОС относительно невелики и заметно меньше, чем в решениях на базе гипервизоров, поэтому решающими факторами будут приложения, которые вы планируете запускать в контейнере, и физические возможности самого хоста.

Шаблоны приложений
Как разворачивать приложения внутри контейнеров Parallels? Можно делать это как обычно, запуская установщик приложения, но если контейнеров очень много — жать кнопку «Установить» придется неисчислимое количество раз. Чтобы автоматизировать процесс и не тратить дисковое пространство контейнера для размещения файлов приложения, мы применяем Шаблоны приложений. Физически шаблон — это файл, в котором хранится информация, воспроизводящая оригинальное размещение файлов, папок и ключей реестра. Для создания шаблона приложения используется специальный инструмент, Мастер Создания Шаблонов, который отслеживает все изменения на файловой системе и в реестре, которые вносит установщик приложения, и сохраняет эти изменения в шаблон приложения. Получившийся шаблон приложения можно подключить к любому контейнеру, что будет эквивалентно установке этого приложения, и сразу же начать им пользоваться в контейнере. Пользователь контейнеров Parallels может самостоятельно создать шаблон из любого приложения, которое можно установить внутрь контейнера.

Файловая система с поддержкой копирования при записи
Контейнеры Parallels делят друг с другом не только ядро, но и все файлы, установленные на хост из дистрибутива OC Windows, что значительно экономит место на СХД. Дедупликация данных осуществляется на файловом уровне с помощью шаблонов и специализированной файловой системы с поддержкой копирования-при-записи. Для каждой поддерживаемой версии ОС Windows, включая языковые локализации, Parallels выпускает шаблон ОС. Шаблон ОС отличается от шаблона приложения только тем, что содержимое файлов в нем не хранится. Изнутри контейнера обращение к файлам из шаблона ОС выглядит абсолютно прозрачно, создавая целостное представление файловой структуры ОС Windows, состоящее из общих и приватных для контейнера файлов. Поддержка в файловой системе копирования-при-записи позволяет избежать модификации файлов из шаблона ОС, сохраняя изменения только внутри контейнера.

Кому это нужно?
С самого начала проекта мы в Parallels предлагали свои контейнеры для хостинга веб-приложений, главное из которых — система автоматизации Parallels Plesk. Продукты хостинга на базе контейнеров Parallels предлагают ведущие мировые провайдеры, такие как AT&T, 1&1, GoDaddy, HostEurope и др.

Но больше всего контейнеры Parallels под Windows подходят для развертывания множества одинаковых окружений, управляемых и настраиваемых единообразно. Пример такого сценария — виртуализация рабочих столов. Так, Parallels в партнёрстве с интегратором IBS разработала и с 2013 предлагает сертифицированное ФСТЭК решение Parallels VDI, которое состоит из брокера соединений и виртуализации на базе контейнеров. В настоящий момент на базе этого решения реализуется масштабный проект по автоматизации Федеральной налоговой службы РФ, предусматривающий переезд в облачный дата-центр более 10.000 рабочих мест.
История проекта
Проект контейнеров под Windows стартовал в мае 2002 года, после удачных экспериментов с контейнерами Parallels на базе ядра ОС Linux. В январе 2003 года был продемонстрирован прототип на Windows 2000 Server, который умел запускать 50 изолированных копий Microsoft IIS и Microsoft SQL Server, а уже в июне 2005 состоялся первый публичный релиз продукта Parallels Virtuozzo Containers for Windows 2003 Server версии 3.0.
На сегодняшний день проект пережил 7 публичных релизов, было выпущено без малого 300 обновлений, а кодовая база проекта превысила 1.300.000 SLOCs. А совсем недавно общее количество контейнеров, созданных с использованием технологий Parallels (включая описываемую), превысило 1.000.000!
Высокой оценки контейнеры Parallels заслужили и в Microsoft – в частных беседах инженеры этой компании отзывались о проекте как о самом технически сложном для ядра Windows.

Заключение
Приход Microsoft на рынок контейнеров, без сомнения, сделает такой подход к виртуализации гораздо популярнее, а решения Docker позволят «заворачивать» приложения в контейнеры простым и удобным способом. С технической точки зрения достоинством контейнеров Microsoft можно считать небольшие затраты на виртуализацию и возможность реализовать контейнеры исключительно в пользовательском режиме исполнения ОС. К недостаткам можно отнести трудности в обеспечении совместимости приложений, ведь для этого необходимо эмулировать весь Windows API, который на данный момент насчитывает тысячи вызовов.
Несмотря на то, что подходы к реализации контейнеров в Parallels и Microsoft различны, обе технологии могут прекрасно дополнять друг друга — контейнеры Microsoft, вероятно, смогут работать внутри контейнеров Parallels. Поэтому мы рассматриваем Microsoft не как конкурента, а как создателя экосистемы Windows, в которой контейнерная виртуализация занимает важное место.
Нам позволяет надеяться на это тот факт, что существующие сейчас на рынке проекты по контейнерной виртуализации для ОС на базе ядра Linux не находятся в состоянии конкуренции – над большинством из них команды из Parallels, Google, IBM, Canonical, Docker и т.д. работают совместно. И хотя экосистема разработки ОС Windows по понятным причинам более закрыта, мы рассчитываем на дальнейшее сотрудничество.
Узнать больше и попробовать продукт Parallels Containers for Windows можно здесь.
Я постараюсь также ответить на все ваши вопросы в комментариях.