Windows server containers что это



Windows и контейнеры

Область применения: Windows Server 2022, Windows Server 2019, Windows Server 2016

Контейнеры — это технология упаковки и запуска приложений Windows и Linux в различных локальных средах и в облаке. Контейнеры предоставляют нетребовательную к ресурсам изолированную среду, которая упрощает разработку, развертывание и управление приложениями. Контейнеры быстро запускаются и останавливаются, что делает их идеальными для приложений, которые нужно быстро адаптировать в условиях изменяющегося спроса. Упрощенная природа контейнеров также делает их полезным инструментом для повышения плотности и использования инфраструктуры.

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

Экосистема контейнеров Майкрософт

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

Запускайте контейнеры под управлением Windows или Linux в среде Windows 10 для разработки и тестирования с помощью Docker Desktop, который использует встроенные функции контейнеров Windows. Можно также выполнять контейнеры с помощью встроенных подсистем Windows Server.

Разрабатывайте, тестируйте, публикуйте и развертывайте контейнеры на основе Windows используя комплексную поддержку контейнеров в Visual Studio и Visual Studio Code, которые включают поддержку Docker, Docker Compose, Kubernetes, Helm и других полезных технологий.

Публикуйте свои приложения как образы контейнеров, сделав их общедоступными на DockerHub для использования другими пользователями или в частном реестре контейнеров Azure для собственной разработки и развертывания вашей организации, отправляя и получая их непосредственно в Visual Studio и Visual Studio Code.

Развертывание контейнеров в Azure или других облаках:

  • Извлекайте свое приложение (образ контейнера) из реестра контейнеров, например Реестра контейнеров Azure, а затем развертывайте его и управляйте им с помощью оркестратора, например Azure Kubernetes Service (AKS) или Azure Service Fabric.
  • Служба Azure Kubernetes развертывает контейнеры на виртуальных машинах Azure и управляет ими при любом масштабе, будь то десятки контейнеров, сотни или даже тысячи. Виртуальные машины Azure запускают настроенный образ Windows Server (при развертывании приложения на основе Windows) или настраиваемый образ Ubuntu Linux (при развертывании приложения на основе Linux).

Развертывайте контейнеры локально с помощью AKS в Azure Stack HCI, Azure Stack с обработчиком AKS или Azure Stack с OpenShift. Вы также можете самостоятельно настроить Kubernetes в Windows Server (см. Kubernetes в Windows); мы работаем над поддержкой запуска контейнеров Windows на платформе контейнеров RedHat OpenShift.

Как работают контейнеры

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

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

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

Контейнеры и виртуальные машины

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

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

Дополнительные сведения о сходствах и различиях этих взаимно дополняющих технологий см. в статье Контейнеры и виртуальные машины.

Образы контейнеров

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

Корпорация Майкрософт предлагает несколько образов (называемых основными образами), которые можно использовать в качестве отправной точки при создании собственного образа контейнера.

  • Windows — содержит полный набор API-интерфейсов Windows и системных служб (за исключением ролей сервера).
  • Windows Server — содержит полный набор API Windows и системных служб.
  • Windows Server Core — образ меньшего размера, который содержит подмножество API-интерфейсов Windows Server (.NET Framework полностью). Он также включает большинство, но не все роли сервера (например, факс-сервер не включен).
  • Nano Server — самый маленький образ Windows Server с поддержкой API .NET Core и некоторых ролей сервера.

Как упоминалось ранее, образы контейнеров образованы рядом слоев. Каждый слой содержит набор файлов, которые при наложении вместе составляют образ контейнера. Из-за многоуровневой природы контейнеров для создания контейнера Windows не нужно всегда ориентироваться на базовый образ. Вместо этого можно выбрать другой образ, который уже содержит нужную платформу. Например, команда .NET публикует образ .NET Core, который содержит среду выполнения .NET Core. Таким образом пользователи избавляются от необходимости дублировать процесс установки .NET Core, а также получают возможность повторно использовать слои этого образа контейнера. Образ .NET Core собран на основе образа Nano Server.

Дополнительные сведения см. в разделе Базовые образы контейнеров.

Пользователи контейнеров

Контейнеры для разработчиков

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

Контейнеры являются переносимыми и универсальными, позволяют запускать приложения, написанные на любом языке, и совместимы с любыми компьютерами под управлением Windows 10 версии 1607 или более поздней, или Windows Server 2016 или более поздней версии. Разработчики могут создать и протестировать контейнер локально на своем ноутбуке или настольном компьютере, а затем развернуть этот образ контейнера в частном или общедоступном облаке или у поставщика услуг. Адаптивность контейнеров позволяет использовать современные модели разработки приложений в крупномасштабных, виртуализированных и облачных средах. Наиболее важное преимущество для разработчиков — возможность изолировать среду таким образом, чтобы приложение всегда получало указанную вами версию библиотек, избегая конфликтов с зависимостями.

Контейнеры для ИТ-специалистов

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

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

Оркестрация контейнеров

Оркестрация является важнейшим элементом инфраструктуры при настройке среды на основе контейнеров. Хотя несколькими контейнерами можно управлять вручную с помощью Docker и Windows, приложения часто используют пять, десять или даже сотни контейнеров, когда оркестрация уже неизбежна.

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

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

  • развертывание при любом масштабе;
  • планирование рабочей нагрузки;
  • наблюдение за работоспособностью;
  • отработка отказов при сбое сервера;
  • увеличение или уменьшение масштаба;
  • сеть;
  • обнаружение служб;
  • координирование обновления приложений;
  • единообразие узлов кластера.

Существует множество различных оркестраторов, которые можно использовать с контейнерами Windows. Ниже приведены варианты, предоставляемые корпорацией Майкрософт.

  • Azure Kubernetes Service (AKS) — использование управляемой службы Azure Kubernetes
  • Служба Azure Kubernetes (AKS) в Azure Stack HCI — использование Службы Azure Kubernetes в локальной среде

Попробуйте контейнеры в Windows

Чтобы приступить к работе с контейнерами в Windows Server или Windows 10, см. следующие сведения:

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

Ресурсы

Ознакомьтесь со следующими ресурсами по использованию контейнеров Windows Server:

Сведения о текущих проблемах и запланированных обновлениях функций см. на страницеСтратегия развития контейнеров Windows Server.

Чтобы связаться с командой по контейнерам Windows Server отправьте сообщение электронной почты в отдел обслуживания с клиентов, работающих с контейнерами Windows.

Источник

Глубокое погружение в контейнеры Windows Server и Docker — Часть 2 — Реализация контейнеров Windows Server (перевод)

В данной статье рассказывается об особенностях реализации Docker в Windows, а также об отличиях в реализации контейнеров между Windows и Linux.

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

Вступление

Представив 3 августа 2015 года Windows Server 2016 Technical Preview 3, Microsoft внедрила технологию контейнеров в платформу Windows. В то время, как на Linux технология контейнеров появилась в августе 2008 года, подобная функциональность прежде не поддерживалась операционными системами Microsoft. Благодаря успеху Docker на Linux, Microsoft решила почти 3 года назад (оригинальная статья опубликована 6 мая 2017 — прим. перев.) начать работу над реализацией контейнеров для Windows. С сентября 2016 года мы смогли поработать с публично доступной версией этой новой технологии контейнеров в Windows Server 2016 и Windows 10. Но в чём разница между контейнерами и виртуальными машинами? И как внутренне реализованы контейнеры Windows? В этой статье мы погрузимся в реализацию контейнеров на Windows.

Контейнеры и виртуальные машины

Часто с контейнерами начинают знакомить с фразы “Контейнеры — это облегчённые виртуальные машины”. Хотя это может помочь людям дать фундаментальное понимание, что такое контейнеры, важно отметить, что это утверждение на 100% ошибочно и может сильно запутать. Контейнеры отличаются от виртуальных машин, и поэтому я всегда представляю контейнеры как “что-то, отличное от виртуальных машин” или даже говорю “контейнеры — это НЕ виртуальные машины”. Но в чём же разница? И почему она так важна?

Что общего между контейнерами и виртуальными машинами

Хотя контейнеры НЕ виртуальные машины, у них обоих есть три важные характеристики:

Что общего между контейнерами и виртуальными машинами:

  • Изолированное окружение: как и виртуальные машины, контейнеры гарантируют изоляцию файловой системы, переменных окружения, реестра и процессов между приложениями. Это значит, что, как и виртуальная машина, каждый контейнер создаёт изолированное окружение для всех приложений внутри себя. При миграции и контейнеры, и виртуальные машины сохраняют не только приложения внутри, но также и контекст этих приложений.
  • Миграция между хостами: большое преимущество работы с виртуальными машинами в том, что можно перемещать слепки виртуальных машин между гипервизорами, при этом не нужно изменять их содержимое. Это справедливо и для контейнеров. Там, где виртуальные машины можно “перемещать” между разными гипервизорами, контейнеры можно “перемещать” между разными хостами контейнеров. При “перемещении” обоих видов артефактов между разными хостами содержимое виртуальной машины/контейнера остаётся точно таким же, как и на предыдущих хостах.
  • Управление ресурсами: другая общая черта — это то, что доступные ресурсы (ЦП, ОЗУ, пропускная способность сети) как контейнеров, так и виртуальных машин могут быть ограничены до заданных значений. В обоих случаях это управление ресурсами может осуществляться только на стороне хоста контейнера или гипервизора. Управление ресурсами гарантирует, что контейнер получает ограниченные ресурсы, чтобы свести к минимуму риск того, что он повлияет на производительность других контейнеров, запущенных на том же самом хосте. К примеру, контейнеру можно задать ограничение, что он не может использовать больше 10% ЦП.

Разница между контейнерами и виртуальными машинами

Хотя между контейнерами и виртуальными машинами есть общие черты, также между ними есть некоторые важные различия.

Разница между контейнерами и виртуальными машинами:

  • Уровень виртуализации: контейнеры — это новый уровень виртуализации. Если взглянуть на историю виртуализации, то она началась с таких понятий, как виртуальная память и виртуальные машины. Контейнеры — это новый уровень этой тенденции виртуализации. Там, где виртуальные машины обеспечивают виртуализацию аппаратного обеспечения, контейнеры обеспечивают виртуализацию ОС. Это значит, что если виртуализация аппаратного обеспечения позволяет виртуальной машине верить, что её аппаратные ресурсы принадлежат только ей, виртуализация ОС позволяет контейнеру верить, что вся ОС принадлежит только ему. Важно отметить эту разницу в виртуализации. У контейнеров, к примеру, нет собственного режима ядра. По этой причине контейнеры не видны как виртуальные машины и они также не распознаются, как виртуальные машины внутри операционной системы (можете попробовать самостоятельно выполнить команду PowerShell Get-VM). Хорошая аналогия для того, чтобы объяснить эту разницу — это дома (виртуальные машины) и квартиры (контейнеры). Дома (виртуальные машины) полностью самодостаточны и предоставляют защиту от непрошенных гостей. У каждого дома также есть собственная инфраструктура — водопровод, отопление, электричество и т. д. Квартиры (контейнеры) тоже предоставляют защиту от непрошенных гостей, но они строятся на основе общей инфраструктуры. В многоквартирном доме (Docker Host) водопровод, отопление, электричество и т. д являются общими. Хотя у них обоих могут быть общие характеристики, это разные сущности.
  • Взаимодействие с ОС: другое важное отличие между контейнерами и виртуальными машинами заключается в способе, которым они взаимодействуют с режимом ядра. Тогда как у виртуальных машин есть полноценная ОС (и выделенный режим ядра), контейнеры разделяют “ОС (точнее, режим ядра)” с другими контейнерами и с хостом контейнеров. В результате контейнеры должны ориентироваться на ОС хоста контейнеров, в то время, как виртуальная машина может выбрать любую ОС (версию и тип), какую пожелает. Там, где виртуальные машины могут запускать ОС Linux на гипервизоре Windows, с технологией контейнеров невозможно запустить контейнер Linux на хосте контейнеров Windows, и наоборот. (В Windows 10 можно запускать контейнеры Linux, но они запускаются внутри виртуальной машины Linux — прим. перев.)
  • Модель роста: контейнеры разделяют ресурсы хоста контейнера, и создаются на основе образа, который содержит ровно то, что нужно для запуска вашего приложения. Вы начинаете с основ и добавляете то, что необходимо. Виртуальные машины создаются в обратном порядке. Чаще всего мы начинаем с полной операционной системы и, в зависимости от приложения, убираем вещи, которые не нужны.

Контейнеры Windows Server

Теперь, когда мы знаем о различиях между виртуальными машинами и контейнерами, давайте нырнём глубже в архитектуру контейнеров Windows Server. Чтобы объяснить, как контейнеры внутренне реализованы в операционной системе Windows, нужно знать о двух важных понятиях: режиме пользователя и режиме ядра. Это два разных режима, между которыми постоянно переключается процессор, в зависимости от типа кода, который нужно выполнить.

Режим ядра

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

Режим пользователя

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

Техническая реализация контейнеров Windows

Но что всем этим режимам процессора делать с контейнерами? Каждый контейнер — это всего лишь “режим пользователя” процессора с парой дополнительных возможностей, таких, как изоляция пространства имён, управление ресурсами и понятием каскадно-объединённой файловой системы. Это значит, что Microsoft нужно было адаптировать операционную систему Windows, чтобы она позволяла поддерживать множественные режимы пользователя. Что-то, что было очень трудно сделать, принимая во внимание высокий уровень интеграции между обоими режимами в предыдущих версиях Windows.

До выпуска Windows Server 2016 каждая операционная система Windows, которой мы пользовались, состояла из единственного “режима пользователя” и “режима ядра”. С появлением Windows Server 2016 стало возможным иметь несколько режимов пользователя, выполняющихся в одной операционной системе. Следующая диаграмма даёт общее представление об этой новой архитектуре мульти-режимов пользователя.

Взглянув на режимы пользователя в Windows Server 2016, можно выявить два различных типа: режим пользователя хоста и режимы пользователя контейнера (зелёные блоки на диаграмме). Режим пользователя хоста идентичен обычному режиму пользователя, с которым мы знакомы по предыдущим версиям Windows. Цель этого режима пользователя — размещать основные службы Windows и процессы, такие, как Session Manager, Event Manager и сеть. Более того, этот режим пользователя облегчает, в случае реализации Windows Server Core, взаимодействие пользователя с Windows Server 2016 при помощи пользовательского интерфейса.

Новая возможность Windows Server 2016 заключается в том, что как только вы включили компонент “Контейнеры”, этот режим пользователя хоста будет содержать некоторые дополнительные технологии управления контейнерами, которые гарантируют, что контейнеры будут работать в Windows. Основа этой технологии контейнеров — абстракция Compute Services (оранжевый блок), которая даёт доступ через публичный API к низкоуровневым возможностям контейнера, предоставляемым ядром. На самом деле, эти службы содержат лишь функциональность, чтобы запускать контейнеры Windows, отслеживать, запущены ли они, и управлять функциональностью, необходимой для их перезапуска. Остальные функции управления контейнером, такие, как отслеживание всех контейнеров, хранение образов контейнеров, томов и т. д., реализованы в Docker Engine. Этот движок напрямую общается с API контейнеров Compute Services и использует для этого “биндинг языка Go”, предложенный Microsoft.

Разница между контейнерами Windows и Linux


Одинаковые утилиты и команды Docker в контейнерах Windows и Linux

Хотя те же самые клиентские утилиты Docker (Docker Compose, Docker Swarm) могут управлять как контейнерами Windows, так и Linux, существуют некоторые важные отличия между реализациями контейнеров в Windows и в Linux.

Системные процессы

Там, где Linux предоставляет свою функциональность уровня ядра через системные вызовы, Microsoft решила контролировать доступную функциональность ядра при помощи DLL (это также является причиной того, почему Microsoft на самом деле не документировала свои системные вызовы). Хотя этот способ абстракции системных вызовов имеет свои преимущества, он привёл к сильно интегрированной операционной системе Windows со множеством взаимозависимостей между разными DLL Win32 и ожиданию от многих DLL, что будут запущены некоторые системные службы, на которые они (не)явно ссылаются. В результате запускать только процессы приложений, указанных в Dockerfile, внутри контейнера Windows не очень реалистично. Поэтому внутри контейнера Windows вы увидите кучу запущенных дополнительных системных процессов, в то время, как контейнерам Linux нужно запускать только указанные процессы приложений. Чтобы гарантировать, что необходимые системные процессы и службы выполняются внутри контейнера Windows, внутри каждого контейнера запускается так называемый процесс smss. Цель процесса smss — запустить нужные системные процессы и службы.


Процесс SMSS

Архитектура ОС

Не только в способе предоставления функциональности уровня ядра, но также и на уровне архитектуры существует важная разница в том, как обе операционные системы предоставляют функциональность контейнера клиентским утилитам Docker. В текущей реализации контейнеров в Windows Server 2016 представлен слой абстракции, называемый Compute Services, который абстрагирует низкоуровневые возможности контейнера извне. Причина этого в том, что Microsoft может менять низкоуровневый API контейнера без необходимости менять публичный API, вызываемый Docker Engine и другими клиентскими утилитами контейнеров. Кроме этого API Compute Services, вы можете написать свой собственный инструментарий управления контейнерами, используя биндинг языков C# или Go, которые доступны по адресам https://github.com/Microsoft/dotnet-computevirtualization и https://github.com/Microsoft/hcsshim.


Каскадно-объединённая файловая система?

Третье важное отличие между реализациями контейнеров Linux и Windows заключается в способе, которым обе операционные системы используют технологию Docker “копирование-при-записи”. Так как множество приложений Windows полагается на семантику NTFS, для команды Microsoft было сложно создать полноценную реализацию каскадно-объединённой файловой системы в Windows. Для таких функций, как журналы USN и транзакции, это, к примеру, потребовало бы совершенно новой реализации. Поэтому в текущей версии контейнеров в Windows Server 2016 нет настоящей каскадно-объединённой файловой системы. Вместо этого текущая реализация создаёт новый виртуальный диск NTFS для каждого контейнера. Чтобы эти виртуальные диски оставались небольшими, различные объекты файловой системы на этом виртуальном NTFS диске на самом деле являются символическими ссылками на настоящие файлы файловой системы хоста. Как только вы изменяете файлы внутри контейнера, эти файлы сохраняются на виртуальное блочное устройство, а в момент, когда вы хотите зафиксировать этот слой изменений, изменения забираются из виртуального блочного устройства и сохраняются в нужном месте файловой системы хоста контейнера.

Контейнеры Hyper-V

Последнее различие в реализации контейнеров Linux и Windows состоит в понятии контейнеров Hyper-V. Я напишу об этом интересном типе контейнеров в следующей статье этой серии. Оставайтесь с нами…

Источник

You may also like...