Хабрахабр

Контейнеры и Windows. От Hello World до Kubernetes. Часть первая, вводная

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

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

Согласно данной статье:

NET или под SQL Server, кусали локти и завидовали своим коллегам по цеху из мира Linux Многие разработчики, пишущие на .

Действительно, контейнеры в Windows до недавнего времени были экзотикой. А хуже всего то, что документацию приходилось собирать по крохам, на каждом ресурсе будь то официальный сайт Docker или Microsoft, всё представлялось в обзорном виде без описания «как и почему», а через месяц-два и существующая информация устаревала. И в этом нет ничего сверхъестественного – контейнеры и технологии с ними связанные развиваются с какой-то нереальной скоростью.

Что интересно, документация написана хорошо и на русском языке, хотя при глубоком изучении вам не избежать переходов по ссылкам на различные ресурсы по типу https://www.docker.com/ или https://kubernetes.io/ где всё написано на старом добром английском языке. В настоящий момент с документацией все стало лучше и что бы погрузится в мир контейнеров для Windows достаточно почитать официальную документацию от Microsoft и следить за её изменениями.

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

Вы не можете запускать контейнеры Windows на Linux и на Windows*

Контейнерные технологии позволяют легко обращаться с окружением благодаря наличию переконфигурированных образов приложений. Это как Apple Appstore или Google Play, но только для инженеров и разработчиков. Как и в магазинах для мобильных приложений вы не можете поставить приложение из Google Play на iOS. Так и на Docker хосте с операционной системой Linux вы не можете запустить контейнер с операционной Windows. Верно и обратное утверждение, правда с некоторыми «но», так как Docker хост с Windows всё же может предоставить Linux окружение для запуска контейнеров.

Работая с контейнерами от Microsoft вам придется оглядываться на Windows Container Version Compatibility и периодически открывать данный документ. Так же вы не можете запустить контейнер Windows в среде Windows не убедившись в совместимости версий операционной системы.

Это такие версии как windows server 1703, 1709, 1803, 1809, 1903. Говоря о версионности — Microsoft с приходом контейнеров приняла решение о выпуске новых полугодовых версий Windows semi-annual. Первые две уже покоятся с миром и находятся в end of service. Цифры означают год и месяц выхода, а поддерживаются они по 18 месяцев. Список версий. Кроме того, существуют версии LTS такие как Windows Server 2016 и Windows Server 2019.

Соответственно, чтобы не пересобирать каждый раз сам контейнер вам придется использовать LTS версию Windows, что при современных скоростях развития технологий не всегда оправдано. Так вот, если вы собрали контейнер на хосте с версией Windows 1803, то и запустить данный контейнер вы можете только на хостах с Windows 1803. Либо всё же думать о версионности и таки постоянно пересобирать контейнеры следуя шаг в шаг за программой semi-annual.

Бывает так, что вы обновили свою ОС до Windows 10, и всё равно не можете запустить у себя контейнер, собранный на Windows 10, так как разные версии «десятки» несовместимы в режиме process isolation. Данное ограничение по версионности может привести вас в ярость если вы разрабатывает на собственном ноутбуке и установили docker на windows 7 или windows 8, а вам надо запустить контейнер, собранный под Windows 10. По-хорошему вам всегда надо знать, что у вас за версия Windows и вносить соответствующие правки в Dockerfile.
Да и просто пересобрать контейнер не получится – тэг latest в Dokerfile для Windows контейнеров присутствует не всегда и вообще он deprecated.

Пересобирать контейнеры нужно постоянно, это не только просто и весело, но в этом и заключается основная магия, которая позволяет приложениям всегда работать на свежем улучшенном софте. Контейнеры — это часть подхода «Инфраструктура как код». Это необходимо учитывать. Но в нашем случае мы сталкиваемся с ограничением: не получится держать универсальный Dockerfile под все системы Windows.

Всё вышесказанное справедливо для контейнеров, запущенных в режиме process isolation. В режиме Hyper-V isolation действует обратная совместимость – вы можете запускать все контейнеры, которые собраны на текущей и предыдущей версиях. В общем-то с помощью Hyper-V isolation можно на хосте Windows запускать и Linux контейнеры. Но такой режим пока что поддерживает меньше плюшек, чего только стоит отсутствие Kubernetes.

Сейчас скажу только то, что сценарии с Hyper-V isolation мне не совсем очевидны, а по умолчанию в Windows используется process isolation. Отличие process isolation и Hyper-V isolation это тема отдельной статьи.

Некоторые образы вообще отсутствуют для Windows. Отдельной головной болью является поиск правильных по версии образов на Docker Hub. Например, официальной сборки Nginx, MySQL, Nodejs, как и сотни других приложений под Windows вы не найдете и вам придется собирать контейнеры самостоятельно либо использовать контейнеры, собранные и предоставленные участниками сообщества.

Windows стоит денег.

К примеру, Semi-annual версии доступны по подписке Visual Studio или при наличии Software Assurance в действующем лицензионном контракте Microsoft. Не стоит забывать и о том, что Windows это по-прежнему платная штука. Ссылка.

Это и программа BizSpark и всякие trial версии Windows Server 2019 на 180 дней и прочее и прочее. Но у Microsoft есть большое количество способов получит платное за бесплатно.

Контейнеры Windows не легковесны.

Подавляющее большинство контейнеров Windows, на первый взгляд весит непозволительно много. Принято считать, что контейнеры легковесны, но что правда для Linux не всегда правда для Windows. Например, базовый образ aspnet:4. Да и на второй взгляд впечатление не меняется. 5 Гб. 8 весит порядка 7.

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

И тем более вам не по пути с Windows Nano Server если вы разрабатываете под . Да вы можете в некоторых сценариях использовать легковесный Windows Nano Server, но увы он имеет кучу ограничений. Net Framework.

Для управления надо хорошо знать CMD и Powershell.

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

Внутрь контейнера Windows теоретически можно подключится по WMI, но это не так просто, хотя бы потому что хвостовая ОС будет перехватывать данный трафик на себя. Данный подход не работает в сценариях с контейнерами, хотя в контейнере и находится полноценная версия Windows Server. Контейнеров на хосте может быть несколько десятков и сотен, и в таком случае направлять трафик в нужный контейнер это целое дело.

Так же знание данных оболочек необходимо для написания Dockerfile, так как все инструкции RUN будут выполнятся в вышеупомянутых командных оболочках. CMD и Powershell понадобятся как для администрирования контейнеров так и самого хоста на котором установлен Docker.

Это вам не лаконичные команды bash. Запомнить все длинные командлеты Powershell довольно сложно. В powershell можно использовать: Хотя сейчас большинство командлетов имеет понятные любому Linux инженеру алиасы.

rm вместо Remove-Item
pwd вместо Get-Location.
cat вместо Get-Content touch вместо New-Item
etc.
# ключи данных команд из Linux вам тут без пользы. Команда rm –rf не прокатит.
# но в Powershell есть аналог man в котором можно всё посмотреть
Get-Help <командлет>

Из крайне полезных вещей, это то, что с помощью Powershell можно запустить в контейнере простой веб сервер для целей тестирования. В Powershell всё представляется в виде объектов. Если вы сторонник ООП, то вы быстро оцените преимущества этой командной оболочки.

Docker на Windows находится в роли догоняющего и приложения по оркестрации такие как Swarm и Kubernetes на Windows реализуют не полный свой функционал. В качестве заключения вводной статьи хочу сказать что я нарочно не касался вопроса оркестрации и управления кластерам.

То есть вам придется иметь в кластере один или более хостов с операционной системой Linux. Так же на текущий момент если вы хотите поднять кластер Docker, то он скорее всего будет мульти платформенный. А в Swarm, Linux контейнеры понадобятся, например, для реализации балансировщика на Nginx или запуска других популярных приложений для кластера, которые доступны только для Linux. Например, для Kubernetes, мастер ноды обязаны быть на Linux.

S. P. Тем не менее эти сценарии могут оказаться крайне продуктивными. Использование Windows в контейнерах имеет весьма ограниченный набор сценариев для применения. Конечно, первое что приходит на ум это web приложения на IIS, но мой опыт показывает, что в контейнерах хорошо изолируются самописные службы Windows и некоторые сервисы такие как MSMQ.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть