Комментарии 31
Чем это лучше простой установки docker for windows или использования linux subsystem for windows?
Я пробовал несколько месяцев назад, запустить Docker под Linux subsystem — не получалось. Даже с попыткой замены Unix сокетов на TCP. Не помню что именно, но это ядро не поддерживало все фичи изоляции, которые нужны докеру.
Так что думаю что вопрос в использовании самой подсистемы как линукса.
И насколько я помню, там продублирован не весь функционал Линукса, так что некоторые утилиты не работают.
В Linux Sub Docker не работает. Клиент — работает, engine — нет. Здесь речь о запуске контейнеров.
Вот здесь описал разницу между docker for windows и этим. Технологически, почти то же самое, но есть ньюансы: https://habrahabr.ru/company/microsoft/blog/339746/#comment_10467902
А я так понимаю что .\dockerd.exe
запускается вместо стандартного докер-демона, который запускается через "C:\Program Files\Docker\Docker\Docker for Windows.exe"
То есть запустив таким образом особый Ubuntu-Docker, я не смогу использовать другие контейнеры, например на основе alpine?
Или все не Ubuntu контейнеры будут также запускаться через старый MobyLinuxVM?
Сможете использовать любые контейнеры. Идея данной реализации Hyper-V Linux контейнеры под Windows, когда прозрачно для вас на специально собраном ядре в виртуалке запускаются линукс контейнеры, но внути самой Linuх виртуалки _незапускается Docker Engine, COW файлы пишутся на Windows хост и т.д. Т.е. выглядит это, как Linix контейнер под Windows :)
Для того, чтобы организовать такую штуку, вам нужны специальные оптимизировванные образы для этих виртуалок, внутри которых запускаются контейенры. Эта статья про такой образ от Ubuntu, на которм запускается Ubuntu :) Прошлая статья про такой образ от Docker.
Спасибо за ответы, я уже после вопроса прочитал предыдущую статью и примерно так и понял.
А что с потреблением памяти? Сейчас под виртуалку с докером можно выделить фиксированное количество ОЗУ, у меня например стоит 2 Гб.
А при новом подходе — надо будет задавать объем памяти для каждого контейнера?
И еще вопрос, который волнует — можно ли теперь подключать volumes без необходимости расшаривать весь диск по самбе?
Пока что это очень раняя бета и сейчас этого там точно нет. Но, я рассчитваю, что интеграция будет прозрачной и можно будет делать подключение на уровне директорий.
Там идея работы — прозрачная работа с контейнерами, соответсвенно, предположу, что ограничения на память должны буду задаваться ограничениями на память контейнера.
И еще хотелось бы чтобы Микрософт понял что Стасу Павлову надо помочь рости в понимании зачем он пишет.
П.С. В предыдущей статье было сказано «Docker для Windows и Linux в одной системе, что упростит сборку и тестирование гетерогенных приложений, состоящих из контейнеров Docker для обеих платформ.»
Можно ли рассказать в чем упрощение?
Да, моя вина. Поскольку для меня это "горячая" тема, пропустил "очевидные" вещи.
Как работает Docker for Windows с Linux контейнерами? Он поднимает виртуалку с Linux, поднимает на ней Docker Engine, пробрасывет порт на Windows хост. В этом случае, реальным хостом для запуска контейнера является для Docker Linux виртуалка и, например, все COW файлы пишутся именно туда.
Теперь делаем шаг назад. Под Windows есть 2 типа контейнеров: Windows Containers и Hyper-V Windows Containers. Windows Containers устроены аналогично Linux контейнерам, а вот Hyper-V — нет. Hyper-V контейнеры запскаются каждый, как контейнер в специальной Windows виртуалке, оптимизированной под запуск контейнеров, но при этом они прозрачны для Docker Engine и на самой виртуалке не запускется Docker Engine, COW файлы пишутся на основной хост и т.д.
Так вот. То, о чём я рассказывал в этой и предыдущей статье — Hyper-V Linux контейнеры. Т.е. прозрачно для Docker Engine в специализированной виртуалке запускается Linux контенер, в самой виртуалке не запускается Docker Engine, COW файлы пишутся на Windows хост и т.д. А так как Linux дистрибутивов больше одно, то вариантов этой специализированной виртуалки может быть больше одного. В прошлый раз это была виртуалка от Docker, в этой статье — Ubuntu.
Что это означает для администратора и разработчика? Возможность прозрачного запуска, без какого-либо переключения, одновременно, всех типов Windows контейнеров, Hyper-V Linux контейнеров на одном Windows хосте, который будет для Docker Engine хостом на котором запускаются контейнеры со всеми вытекающими плюсами, вроде прозрачной интеграции networks и т.д.
На сколько я понимаю штатные средства — скриптовые, то хотелось бы увидеть разницу в скриптах.
С выходом Creator Fall решил попробовать сделать все по туториалу.
И столкнулся с проблемой из этого тикета. Флаг experimental
тоже не помог. Не знаете, есть ли какое-то решение? Возможно надо откатиться на предыдущую версию dockerd?
Частично отвечу на свой же вопрос.
Прочитал тикет 1219 — после определенной версии нужна еще одна переменная окружения.
$env:LCOW_API_PLATFORM_IF_OMITTED="linux"
Но все равно при попытке pull
выходит ошибка. Образ находится, скачивается, но после распаковки падает.
C:\Work\dockerbeta\docker.exe: failed to register layer: failed to start service utility VM (applydiff c01367536c422450a2126cfc8ff74f689748c09740e399186473ab911faa1d16): container c01367536c422450a2126cfc8ff74f689748c09740e399186473ab911faa1d16_svm encountered an error during CreateContainer: failure in a Windows system call: Access is denied. (0x5) extra info: {"SystemType":"container", "Name": "c01367536c422450a2126cfc8ff74f689748c09740e399186473ab911faa1d16_svm", "Layers":null,"HvPartition":true, "HvRuntime":{"ImagePath":"C:\\Program Files\\Linux Containers\\uvm.vhdx", "BootSource":"Vhd"},"ContainerType":"linux", "TerminateOnLastHandleClosed":true}.
Скрипт для ACL я выполнял. Если открыть в проводнике, то там есть Full Access для Virtual Machines. Но если попробовать давать права через проводник, то он не находит роль NT VIRTUAL MACHINE\Virtual Machines
. И с LinuxKit вместо Xenial выходит тоже самое.
Ну, это же preview, где-то ещё не синхронизировалась кодова база. Я тоже обновился, сейчас попробую сам ещё раз и если что-то получится, отпишусь.
Взял инструкцию отсюда для LinuxKit, добавил в окружение $env:LCOW_API_PLATFORM_IF_OMITTED="linux" для запуска сервиса.
Без переменной окружения $env:LCOW_API_PLATFORM_IF_OMITTED="linux" не работало, с ней запустилось. Windows 10 Version 1709 — это как раз Update.
Запускал всё из PowerShell (Admin)
Я так понимаю вы про эту статью — Linux-контейнеры для Windows.
Только что попробовал, видимо там zip архив с LinuxKit обновили. Теперь удалось запустить… правда через раз почему то, и на второй раз начало зависать при распаковке образа, но хоть что-то. Пришлось пару раз очищать папку lcow и качать образы заново.
Один из моментов который интересовал работает — можно добавить volume с диска который не расшарен. Так что есть повод ждать релиза.
Есть вопрос — я успешно проделал всё это и запустил Linux контейнер (с одним уточнением — сейчас для запуска демона надо использовать также флаг --experimental)
Но вот при попытке запулить windows контейнер я получаю сообщение
PS C:\docker> ./docker pull microsoft/iis
Using default tag: latest
latest: Pulling from microsoft/iis
no matching manifest for linux/amd64 in the manifest list entries
не подскажете что я делаю не так?
Запуск контейнеров с Ubuntu на Windows