LCOW — первый взгляд на “Linux Containers on Windows”

В неразберихе вокруг Docker на Windows появилось новое слово: LCOW, что расшифровывается как Linux Containers on Windows.

На момент написания статьи LCOW в стадии Technical Preview уже доступен в Edge версии Docker for Windows при условии, что установлен Fall Creators Update.

Работает пока плохо и медленно, поэтому включать не советую, но это (хочется надеяться) вопрос времени.

За LCOW скрывается, как нетрудно догадаться из названия, новый способ запуска Linux-контейнеров под Windows. Я попробую с помощью картинок объяснить, в чем состоит новизна, какие у неё корни и перспективы.

Без LCOW Docker for Windows выглядит примерно так:

Docker for Windows без LCOW

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

У этого подхода есть как плюсы:

  • Хорошая совместимость с “настоящим” Докером.

  • Понятный и проверенный годами гипервизор Hyper-V.

так и минусы:

  • Необходимо заранее выделять ресурсы под лежащую в основе виртуалку. Из-за этого, с одной стороны, сразу отъедается часть оперативки, с другой Docker не может использовать систему по полной.

  • Невозможно в рамках одного Docker daemon запускать контейнеры и с Linux, и с Windows внутри (я об этом рассказывал), а для Microsoft очень важны такие гибридные сценарии, иначе привлекательность Докера на Windows сильно тускнеет (до уровня “нах вообще надо”).

Поэтому инженеры из Microsoft допилили подсистему Windows Containers до состояния, в котором стало можно пускать контейнеры с Линуксом, и теперь активно интегрируют эту возможность в Docker.

С включенным LCOW картина приобретает следующий вид:

Docker for Windows с LCOW

  • Docker daemon теперь живёт в основной системе и взаимодействует с Host Compute Service (HCS), низкоуровневым API, лежащим в основе Windows Containers.

  • Для каждого контейнера HCS создает отдельную виртуальную машину (Utility VM), внутри которой работает Guest Compute Service (GCS), общающийся с HCS, и собственно сам контейнер.

  • Утверждается, что эти Utility VM достаточно “худые” и быстрые — у них внутри минимальный Linux с массой хардкорных оптимизаций. В диспетчере задач их видно под именами vmwp и vmmem.

  • Образы и слои хранятся в C:\ProgramData\Docker\lcow в “старых добрых” VHD-файлах. Они хитро подключаются в Utility VM через “direct mapping to VM physical memory”. Но к сожалению, пока замеры показывают, что производительность получается хуже, чем раньше. Тормоза при взаимодействии с файловой системой видно невооружённым глазом.

  • Работа с внешними томами по-прежнему медленная, т.к. ввод-вывод происходит по сети между хостом и виртуальной машиной без кэширования, однако разработчики горды, что смогли повторно использовать код, написанный ранее для Windows Subsystem for Linux. В будущем собираются добавить кэш как в Docker for Mac.

  • В текущем состоянии (technical preview) многое не работает или глючит.

Больше технических подробностей — в презентации Джона Старкса.