Часто задаваемые вопросы о контейнерах
Если у вас есть вопрос о контейнерах Windows Server, возможно, ответ на него вы найдете ниже.
В чем отличие контейнеров Linux и контейнеров Windows Server?
В ядрах и базовых операционных системах Linux и Windows Server реализованы сходные технологии. Отличие заключается в платформе и рабочих нагрузках, выполняющихся в контейнерах.
Каковы предварительные требования для запуска контейнеров в Windows?
Контейнеры были введены для этой платформы начиная с версии Windows Server 2016. Для использования контейнеров требуется Windows Server 2016 или Windows 10 Anniversary update (версия 1607) или более поздней версии. Чтобы узнать больше, ознакомьтесь с системными требованиями.
Какие ОС Windows поддерживаются?
AKS в Azure Stack HCI использует Windows Server 2019 в качестве версии ОС для узла контейнеров и поддерживает только изоляцию процессом. Сведения о совместимости версий контейнеров Windows см. в этой статье.
Как поставить заплаты для моих узлов Windows?
Для узлов Windows Server на AKS в Azure Stack HCI нужно установить обновления, чтобы вы могли получить последние исправления. Центр обновлений Windows не включен на узлах Windows на AKS в Azure Stack HCI. Но AKS в Azure Stack HCI обеспечивает доступ к Центру обновлений Windows, периодически обновляя образы узлов Windows Server.
Могут ли мои контейнеры Windows Server использовать gMSA?
Да, gMSA поддерживается для подключенных к доменам рабочим узлов Windows. Дополнительные сведения об использовании gMSA с контейнерами Windows см. в статье Подготовка узлов Windows для gMSA.
Что такое WCOW и LCOW?
WCOW означает «контейнеры Windows в Windows», а LCOW — «контейнеры Linux в Windows».
Как осуществляется лицензирование контейнеров? Существует ли ограничение на количество контейнеров, которые я могу запустить?
Лицензионное соглашение для образа контейнера Windows описывает использование, которое зависит от наличия у пользователя действительной лицензии на ОС узла. Количество контейнеров, которые может запустить пользователь, зависит от выпуска ОС узла и режима изоляции, с которым выполняется контейнер, а также от того, запускаются ли эти контейнеры в целях разработки/тестирования или в рабочей среде.
| ОС узла | Количество контейнеров при изоляции на уровне процессов | Количество контейнеров при изоляции с помощью Hyper-V |
|---|---|---|
| Windows Server Standard | Без ограничений | 2 |
| Windows Server Datacenter | Без ограничений | Без ограничений |
| Windows 10 Профессиональная и Windows 10 Корпоративная | Без ограничений (только для целей тестирования или разработки) | Без ограничений (только для целей тестирования или разработки) |
| Windows 10 IoT Базовая и Windows 10 Корпоративная | Без ограничений | Без ограничений |
Использование образа контейнера Windows Server определяется путем считывания количества гостевых виртуальных машин, поддерживаемых в этом выпуске.
*Использование рабочих контейнеров в выпусках Windows IoT зависит от того, согласились ли вы с коммерческими условиями использования образов среды выполнения Windows 10 Базовая или с лицензией для устройств Windows 10 IoT Корпоративная («коммерческое соглашение Windows IoT»). Дополнительные условия и ограничения для коммерческих соглашений по Windows IoT применяются к использованию образа контейнера в рабочей среде. Ознакомьтесь с лицензионным соглашением для образа контейнера, чтобы точно понимать, что разрешено, а что нет.
Нужно ли разработчику переписывать приложение под каждый тип контейнера?
Нет. Контейнеры Windows Server и изоляция Hyper-V используют общие образы. Вы выбираете тип при запуске контейнера. С точки зрения разработчика между контейнерами Windows Server и изоляцией Hyper-V нет принципиальных различий. Открытые и расширяемые, они предусматривают одинаковые возможности для разработки, программирования и управления, а также одинаковый уровень интеграции и поддержки с помощью Docker.
Разработчик может создать образ контейнера с помощью контейнера Windows Server и развернуть его в изоляции Hyper-V, или наоборот, не внося изменений, лишь установив флажок необходимой среды выполнения.
Контейнеры Windows Server обеспечивают более высокую плотность и производительность (меньшее время раскрутки, когда ключевым фактором является скорость, более высокую производительность среды выполнения по сравнению с вложенными конфигурациями). Изоляция Hyper-V, в полном соответствии со своим названием, обеспечивает лучшую изоляцию, чтобы код, выполняющийся в одном контейнере, не мог нарушить безопасность или стабильность операционной системы узла или других запущенных на нем контейнеров. Это удобно при обслуживании одним экземпляром приложения нескольких развертываний (необходимо размещение кода без доверия), в том числе размещении приложений SaaS и среды выполнения приложений.
Можно ли запускать контейнеры Windows в режиме изоляции процессов в Windows 10?
Если вы хотите выполнять контейнеры Windows таким образом, необходимо убедиться, что узел работает под управлением Windows 10 Build 17763+ и у вас установлена версия Docker с ядром версии 18.09 или более поздней.
Эта функция предназначена только для разработки или тестирования, но не на узлах под управлением версий IoT Базовая и IoT Корпоративная (после принятия дополнительных условий и ограничений). Для развертывания в рабочей среде в качестве узла следует продолжать использовать Windows Server. С помощью этой функции необходимо также убедиться, что теги версии узла и контейнера совпадают, в противном случае контейнер может не запуститься или продемонстрировать неожиданное поведение.
Как можно сделать образы контейнеров доступными на территориально разнесенных компьютерах?
Базовые образы контейнера Windows содержат артефакты, разнесение которых ограничено лицензией. Когда вы создадите эти образы и отправите их в закрытый или общедоступный реестр, вы заметите, что базовый уровень никогда не передается. Вместо этого мы используем концепцию внешнего слоя, который ссылается на реальный базовый уровень, находящийся в облачном хранилище Azure.
Использование этого флага не исключает обязательства в соответствии с условиями лицензии на базовый образ контейнера Windows; не следует публиковать содержимое Windows для общедоступного распространения или для передачи третьим сторонам. Использование в собственной среде разрешено.
Хотите оставить дополнительный отзыв?
Хотите добавить что-нибудь в часто задаваемые вопросы? Создайте новый отзыв в разделе комментариев или подайте запрос на включение внесенных изменений для этой страницы с помощью GitHub.
Контейнеры и Windows. От Hello World до Kubernetes. Часть первая, вводная
Когда я разговариваю с Linux инженерами и говорю им о проблемах Kubernetes кластера на Windows, на меня смотрят очень подозрительно. Некоторые даже не верят что это законно такое бывает. Контейнеры на Windows не так распространены и востребованы, как на Linux. Но я думаю, что поговорить об этой теме стоит, хотя бы для того, что бы понимать общую концепцию и основные отличия контейнеров Windows и Linux. Первой записью я пройдусь по полотну широкой кистью, а затем, в последующих постах, попробую постепенно углубиться в нюансы.
Контейнеры в Windows
Действительно, контейнеры в Windows до недавнего времени были экзотикой. А хуже всего то, что документацию приходилось собирать по крохам, на каждом ресурсе будь то официальный сайт Docker или Microsoft, всё представлялось в обзорном виде без описания «как и почему», а через месяц-два и существующая информация устаревала. И в этом нет ничего сверхъестественного – контейнеры и технологии с ними связанные развиваются с какой-то нереальной скоростью.
В настоящий момент с документацией все стало лучше и что бы погрузится в мир контейнеров для Windows достаточно почитать официальную документацию от Microsoft и следить за её изменениями. Что интересно, документация написана хорошо и на русском языке, хотя при глубоком изучении вам не избежать переходов по ссылкам на различные ресурсы по типу https://www.docker.com/ или https://kubernetes.io/ где всё написано на старом добром английском языке.
Сейчас ответы на любые вопросы можно найти в официальной документации, но есть некоторые нюансы, которые лучше знать заранее. Возможно вам это будет полезно и сэкономит время при погружении в контейнерные технологии под флагом Microsoft.
Вы не можете запускать контейнеры Windows на Linux и на Windows*
Контейнерные технологии позволяют легко обращаться с окружением благодаря наличию переконфигурированных образов приложений. Это как Apple Appstore или Google Play, но только для инженеров и разработчиков. Как и в магазинах для мобильных приложений вы не можете поставить приложение из Google Play на iOS. Так и на Docker хосте с операционной системой Linux вы не можете запустить контейнер с операционной Windows. Верно и обратное утверждение, правда с некоторыми «но», так как Docker хост с Windows всё же может предоставить Linux окружение для запуска контейнеров.
Так же вы не можете запустить контейнер Windows в среде Windows не убедившись в совместимости версий операционной системы. Работая с контейнерами от Microsoft вам придется оглядываться на Windows Container Version Compatibility и периодически открывать данный документ.
Говоря о версионности — Microsoft с приходом контейнеров приняла решение о выпуске новых полугодовых версий Windows semi-annual. Это такие версии как windows server 1703, 1709, 1803, 1809, 1903. Цифры означают год и месяц выхода, а поддерживаются они по 18 месяцев. Первые две уже покоятся с миром и находятся в end of service. Кроме того, существуют версии LTS такие как Windows Server 2016 и Windows Server 2019. Список версий.
Так вот, если вы собрали контейнер на хосте с версией Windows 1803, то и запустить данный контейнер вы можете только на хостах с Windows 1803. Соответственно, чтобы не пересобирать каждый раз сам контейнер вам придется использовать LTS версию Windows, что при современных скоростях развития технологий не всегда оправдано. Либо всё же думать о версионности и таки постоянно пересобирать контейнеры следуя шаг в шаг за программой semi-annual.
Тэг latest в Dokerfile для Windows контейнеров присутствует не всегда и вообще он deprecated. По-хорошему вам всегда надо знать, что у вас за версия Windows и вносить соответствующие правки в Dockerfile.
Контейнеры — это часть подхода «Инфраструктура как код». Пересобирать контейнеры нужно постоянно, это не только просто и весело, но в этом и заключается основная магия, которая позволяет приложениям всегда работать на свежем улучшенном софте. Но в нашем случае мы сталкиваемся с ограничением: не получится держать универсальный Dockerfile под все системы Windows. Это необходимо учитывать.
Всё вышесказанное справедливо для контейнеров, запущенных в режиме process isolation. В режиме Hyper-V isolation действует обратная совместимость – вы можете запускать все контейнеры, которые собраны на текущей и предыдущей версиях. В общем-то с помощью Hyper-V isolation можно на хосте Windows запускать и Linux контейнеры. Но такой режим пока что поддерживает меньше плюшек, чего только стоит отсутствие Kubernetes.
Отличие process isolation и Hyper-V isolation это тема отдельной статьи. Сейчас скажу только то, что сценарии с Hyper-V isolation мне не совсем очевидны, а по умолчанию в Windows используется process isolation.
Отдельной головной болью является поиск правильных по версии образов на Docker Hub. Некоторые образы вообще отсутствуют для Windows. Например, официальной сборки Nginx, MySQL, Nodejs, как и сотни других приложений под Windows вы не найдете и вам придется собирать контейнеры самостоятельно либо использовать контейнеры, собранные и предоставленные участниками сообщества.
Windows стоит денег.
Не стоит забывать и о том, что Windows это по-прежнему платная штука. К примеру, Semi-annual версии доступны по подписке Visual Studio или при наличии Software Assurance в действующем лицензионном контракте Microsoft. Ссылка.
Но у Microsoft есть большое количество способов получит платное за бесплатно. Это и программа BizSpark и всякие trial версии Windows Server 2019 на 180 дней и прочее и прочее.
Контейнеры Windows не легковесны.
Принято считать, что контейнеры легковесны, но что правда для Linux не всегда правда для Windows. Подавляющее большинство контейнеров Windows, на первый взгляд весит непозволительно много. Да и на второй взгляд впечатление не меняется. Например, базовый образ aspnet:4.8 весит порядка 7.5 Гб.
Даже если вы будете размещать базовые образы в локальном репозитории, первоначальная загрузка образа на хост будет занимать довольно продолжительное время, что уж говорить про удаленные репозиторий типа Docker Hub.
Для управления надо хорошо знать CMD и Powershell.
Скорее всего работать вам придется с core версией Windows Server на Docker хостах. Windows Server имеет огромное количество возможностей по удаленному управлению. Общий подход такой, что имея Windows Server с графическим интерфейсом вы можете подключатся всеми графическими оснастками к любому core серверу.
Данный подход не работает в сценариях с контейнерами, хотя в контейнере и находится полноценная версия Windows Server. Внутрь контейнера Windows теоретически можно подключится по WMI, но это не так просто, хотя бы потому что хостовая ОС будет перехватывать данный трафик на себя. Контейнеров на хосте может быть несколько десятков и сотен, и в таком случае направлять трафик в нужный контейнер это целое дело.
CMD и Powershell понадобятся как для администрирования контейнеров так и самого хоста на котором установлен Docker. Так же знание данных оболочек необходимо для написания Dockerfile, так как все инструкции RUN будут выполнятся в вышеупомянутых командных оболочках.
Запомнить все длинные командлеты Powershell довольно сложно. Это вам не лаконичные команды bash. Хотя сейчас большинство командлетов имеет понятные любому Linux инженеру алиасы. В powershell можно использовать:
Из крайне полезных вещей, это то, что с помощью Powershell можно запустить в контейнере простой веб сервер для целей тестирования. В Powershell всё представляется в виде объектов. Если вы сторонник ООП, то вы быстро оцените преимущества этой командной оболочки.
В качестве заключения вводной статьи хочу сказать что я нарочно не касался вопроса оркестрации и управления кластерам. Docker на Windows находится в роли догоняющего и приложения по оркестрации такие как Swarm и Kubernetes на Windows реализуют не полный свой функционал.
Так же на текущий момент если вы хотите поднять кластер Docker, то он скорее всего будет мульти платформенный. То есть вам придется иметь в кластере один или более хостов с операционной системой Linux. Например, для Kubernetes, мастер ноды обязаны быть на Linux. А в Swarm, Linux контейнеры понадобятся, например, для реализации балансировщика на Nginx или запуска других популярных приложений для кластера, которые доступны только для Linux.
P.S. Использование Windows в контейнерах имеет весьма ограниченный набор сценариев для применения. Тем не менее эти сценарии могут оказаться крайне продуктивными. Конечно, первое что приходит на ум это web приложения на IIS, но мой опыт показывает, что в контейнерах хорошо изолируются самописные службы Windows и некоторые сервисы такие как MSMQ.
UPD. В статье есть небольшая неточность, кластер Docker на одних только Windows хостах собрать можно. Причем, это не только Swarm, но и развиваемый самим Micrisoft продукт для оркестрации кластера Service Fabric
UPD2. Docker контейнеры для Windows 10 доступны только в режиме Hyper-V isolation и используют отличные от Windows Server базовые образы.
Глубокое погружение в контейнеры 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% ошибочно и может сильно запутать. Контейнеры отличаются от виртуальных машин, и поэтому я всегда представляю контейнеры как “что-то, отличное от виртуальных машин” или даже говорю “контейнеры — это НЕ виртуальные машины”. Но в чём же разница? И почему она так важна?
Что общего между контейнерами и виртуальными машинами
Хотя контейнеры НЕ виртуальные машины, у них обоих есть три важные характеристики:
Что общего между контейнерами и виртуальными машинами:
Разница между контейнерами и виртуальными машинами
Хотя между контейнерами и виртуальными машинами есть общие черты, также между ними есть некоторые важные различия.
Разница между контейнерами и виртуальными машинами:
Контейнеры 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. Я напишу об этом интересном типе контейнеров в следующей статье этой серии. Оставайтесь с нами…

