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

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


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

Действительно, контейнеры в 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.

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

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

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

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

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

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

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 реализуют не полный свой функционал.

Так же на текущий момент если вы хотите поднять кластер 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 базовые образы.

Комментарии (24)


  1. build_your_web
    27.08.2019 23:20

    Надеялся хоть что-то про k8s&windows прочитать в статье, а тут про алиасы Powershell.


    1. justhabrauser
      28.08.2019 00:56

      Видимо автор настолько впечатлился своим же описанием мороки с контейнерами, что переходить к k8s забоялся.
      Довольно честная позиция.


      1. b0sun
        28.08.2019 05:22

        Нет там ничего страшного. Да, сеть отличается. Да, чуть сложнее попасть внутрь контейнера (даже не так — сложнее дебажить, когда провалишься). В работе есть несколько swarm кластеров, пара AWS EKS на Win2016. K8s, конечно, чуть сложнее, но родной Swarm работает чуть ли не из коробки и без особых проблем. Пробовали даже запускать Linux и Windows в одном EKS-кластере — всё реально, всё работает, но пока отложили в сторонку.


        1. varlam
          28.08.2019 09:32

          Docker API одинаков вроде как, в чем сложность docker exec -it containername powershell. И далее дебажим как любую другую Win ОС средствами powershell.


    1. HunterXXI Автор
      28.08.2019 09:36

      Спасибо за комментарий. Как говорится — Не в бровь, а в глаз.
      Мысль разделить материал на несколько статей ко мне пришла не сразу. Но в какой-то момент я решил подать материал частями и идти от общего к частному. И вот почему.
      Kubernetes на Windiws развивается довольно быстро. Быстро на столько, что в статью трудно заложить значимую информацию, которая не устареет через пол года.

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

      Да и камнем преткновения стали учетные записи gMSA на Kubernetes. От версии к версии работает это по разному. А без этого статью про Kubernetes на Windows выпускать не хотелось бы.


      1. varlam
        28.08.2019 09:56
        +1

        Kubernetes на Windows — очень интересна эта тема, продолжайте в том же духе. На текущий момент это работает в мульти платформенной связке, интересно, возможен ли переход на чистый Win, а то для обслуживания одного кластера надо 2 вида специалистов.


      1. xsevenbeta
        28.08.2019 12:56
        +1

        Повершел не особо страшен командами, там в общем-то всё как в шелле, но иногда сложности возникали совершенно на ровном месте и которых в bash не возникло бы.
        Например, мне нужно было запустить mysql клиент с параметрами, которое раньше прекрасно работало в батнике и так же прекрасно работало на баше:
        Простейшая конструкция вида:
        mysql -u$user -ppass -Dukmserver -e«select id from table;» >> log.log
        работать отказывалась, были какие-то неочевидные грабли с кавычками/списком аргументов.


        1. HunterXXI Автор
          28.08.2019 13:08

          кавычки в докерфайлах отдельная боль. но есть хороший материал по этому поводу
          про кавычки


          1. xsevenbeta
            28.08.2019 16:19

            Вот-вот, что-то такое монстроузное и нечитаемое, насколько я помню у меня и вышло.


  1. iwram
    28.08.2019 03:50

    По лицензированию. Тоже в одно время хотел перенести часть приложений винды в контейнеры и заморочился с лицензированием (как бы бесплатно все получить). Есть бесплатный продукт Microsoft Hyper-V Server — докер работает, gui конечно обрезанный, но он особо и не нужен. Единственно- не будет изоляции hyper-v.
    Пытался найти подводные камни по лицензированию, устал искать.
    Также были интересные кейсы, по рдп внутри контейнера, но в более новых версиях- эти трюки больше не проходят.


    1. DaemonGloom
      28.08.2019 09:30

      Hyper-V Server — докер работает, gui конечно обрезанный, но он особо и не нужен. Единственно- не будет изоляции hyper-v.
      Пытался найти подводные камни по лицензированию, устал искать.

      То, что оно работало — баг. Его поправили и больше оно не работает. Подводных камней в лицензировании теперь тоже нет, хотите контейнеры — покупайте standard или datacenter.
      Добро пожаловать в дивный новый мир энтерпрайза.
      github.com/MicrosoftDocs/Virtualization-Documentation/issues/945


  1. Hivemaster
    28.08.2019 08:44
    +1

    если вы разрабатывает на собственном ноутбуке и установили docker на windows 7

    Это как? Он же только на десятку встаёт.


    1. Akuma
      28.08.2019 09:08

      Почему? Докер на семерке нормально работает. Просто он не может локальные контейнеры запускать.


      1. varlam
        28.08.2019 09:35
        +1

        А смысл тогда ставить, если не может запускать?


        1. Akuma
          28.08.2019 09:39

          Для управления. docker-machine например.
          Я локально все делал через VirtualBox, например.

          На десятке, кстати, так же через виртуалки запускаю. По мне так удобнее, чем захламлять все локально


    1. HunterXXI Автор
      28.08.2019 09:40

      Всё верно. В статье исправлено. на Windows 7-8 только docker toolbox


  1. varlam
    28.08.2019 09:10
    +1

    По поводу

    Так же на текущий момент если вы хотите поднять кластер Docker, то он скорее всего будет мульти платформенный
    — можно воспользоваться оркестратором ServiceFabric, кластер полностью на Win.


  1. buldo
    28.08.2019 10:33
    +1

    А что, режим process isolation уже доступен на Windows 10? Это же чисто северная фишка.
    И для совместимости не важно на каком хосте собирается образ — важно, какой используется базовый образ


    1. varlam
      28.08.2019 10:56

      А что, режим process isolation уже доступен на Windows 10?

      Нет, с чего взяли?


      1. buldo
        28.08.2019 11:00
        +1

        В статье всё так намешано, что можно и не понять. Лучше бы автор указал, что docker на Windows Server и docker на Windows 10 совершенно различаются по возможностям.


        1. HunterXXI Автор
          28.08.2019 11:41
          +2

          Всё верно. Необходимые правки внесены.


  1. Stantin
    28.08.2019 14:38

    Про "невозможность запустить Linux под Windows", на днях читал статью, где они так и делают:
    https://blogs.msdn.microsoft.com/appconsult/2018/09/20/running-containers-based-on-different-platforms-side-by-side-with-docker-preview/


    1. varlam
      28.08.2019 15:59
      +1

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

      Про невозможность не написано!


  1. Snow_Bars
    28.08.2019 16:39
    +1

    «PowerShell — язык программирования системных администраторов» ©
    Жду продолжения.