Привет, Хабр! Неделю назад я рассказывал вам о новой возможности, которая доступна в предварительных выпусках Docker и Windows Server/Windows 10 — запуск Linux контейнеров c Hyper-V изоляцией, аналогично Windows контейнерам с Hyper-V изоляцией. В этом пошаговом руководстве речь пойдёт про аналогичный запуск контейнеров с Ubuntu в этом окружении.



Введение


Как я уже писал до ката, контейнеры Docker теперь можно запускать в Windows 10 и Windows Server, используя Ubuntu в качестве среды хостинга. Иначе говоря, благодаря совместному использованию технологии Docker и виртуализации Hyper-V в Windows, вы сможете запускать собственные Linux-приложения в Windows, используя – Ubuntu!



Требования


1. Вам понадобится ПК x86 с 64-разрядным процессором и 8 ГБ оперативной памяти, работающий под управлением Windows 10 или Windows Server.

2. Запускать контейнеры Linux в Hyper-V могут только участники программы предварительной оценки Windows. Эта программа позволяет тестировать предварительные выпуски программного обеспечения и будущие версии Windows.

3. Если для вашего развертывания важны стабильность и конфиденциальность (программа предварительной оценки Windows позволяет Microsoft собирать информацию об использовании), лучше дождитесь выхода обновления Windows 10 Fall Creator Update в октябре 2017. В этом выпуске технология Docker с Hyper-V будет доступна без необходимости участия в ней.



4. Вам также понадобится последний выпуск Docker, его можно скачать отсюда: http://dockerproject.org.

5. Наконец, вам нужно убедиться, что вы установили программу для разархивирования образа контейнера-хоста Ubuntu, например, 7-Zip или XZ Utils.

Как присоединиться к программе предварительной оценки Windows


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

I этап:

1. Откройте следующую ссылку в вашем веб-браузере:

https://insider.windows.com/en-us/getting-started/.

2. Чтобы зарегистрироваться, войдите в систему, используя ту же учетную запись Microsoft, которую вы используете для входа в Windows 10, и пройдите по ссылке Register your personal account (Зарегистрируйте свою персональную учетную запись) на странице начала работы с Программой предварительной оценки Windows. Подтвердите согласие с условиями для завершения регистрации.

3. Теперь вам нужно открыть Настройки в меню Start (Пуск) Windows 10, выбрать Updates & Security (Обновления и безопасность), а затем Windows Insider Program (Программа предварительной оценки Windows) в меню слева.



4. В случае необходимости нажмите кнопку Fix me (Исправить), если Windows выдает предупреждение Your Windows Insider Program account needs attention (Ваша учетная запись в Программе предварительной оценки Windows требует внимания).

II этап:

1. На панели Windows Insider Program (Программа предварительной оценки Windows) нажмите Get Started (Начать). Если ваша учетная запись Microsoft не связана с вашей копией Windows 10, войдите в систему при появлении запроса и выберите учетную запись, которую вы хотите связать с установленной копией операционной системы.

2. Теперь вы сможете выбрать, какое содержимое вы хотите получать как участник Программы предварительной оценки Windows. Чтобы обеспечить доступность средств изоляции в Hyper-V, необходимых технологии Docker, выберите Fast (Быстрый). Дважды щелкните Confirm (Подтвердить), затем позвольте Windows перезагрузить ваш компьютер. После перезагрузки вам, скорее всего, придется дождаться завершения установки некоторого количества обновлений, прежде чем перейти к следующему шагу.



Установите Docker для Windows


1. Скачайте Docker для Windows из магазина Docker Store.



2. После скачивания выполните установку и перезагрузите систему, когда появится соответствующий запрос.



3. После перезагрузки запустится Docker. Docker использует функцию Hyper-V, поэтому при необходимости он попросит вас включить ее и выполнить перезагрузку. Нажмите OK, чтобы Docker включил Hyper-V и перезагрузите систему.



Скачайте образ контейнера Ubuntu


1. Скачайте последний образ контейнера Ubuntu для Windows с веб-сайта Canonical Partner Images.

2. Разархивируйте скачанный образ с помощью 7-Zip или XZ Utils:
C:\Users\mathi\> .\xz.exe -d xenial-container-hyper-v.vhdx.xz


Подготовьте окружение для контейнера


1. Сначала создайте два каталога.



2. Создайте каталог C:\lcow, который будет использоваться как область временных файлов для Docker при подготовке контейнеров.



3. Также создайте каталог C:\Program Files\Linux Containers. В нем будет храниться образ контейнера Ubuntu.

4. Нужно будет назначить для этого каталога дополнительные разрешения, чтобы Docker мог использовать хранящиеся в нем образы. Выполните следующий скрипт Powershell в окне администратора Powershell:

param(
[string] $Root
)
# Give the virtual machines group full control
$acl = Get-Acl -Path $Root
$vmGroupRule = new-object System.Security.AccessControl.FileSystemAccessRule("NT VIRTUAL MACHINE\Virtual Machines", "FullControl","ContainerInherit,ObjectInherit", "None", "Allow")
$acl.SetAccessRule($vmGroupRule)
Set-Acl -AclObject $acl -Path $Root

Сохраните этот файл под именем set_perms.ps1 и запустите его.

СОВЕТ. Возможно, вам нужно будет выполнить команду Set-ExecutionPolicy -Scope process unrestricted, чтобы запускать неподписанные скрипты Powershell.


C:\Users\mathi\> .\set_perms.ps1 "C:\Program Files\Linux Containers"
C:\Users\mathi\>


5. Теперь скопируйте файл с образом контейнера Ubuntu (.vhdx), разархивированный на предыдущем шаге, присвойте ему имя uvm.vhdx и поместите в каталог C:\Program Files\Linux Containers.

Дополнительные подготовительные шаги для Docker


1. Docker для Windows требует наличия некоторых возможностей из предварительной версии для работы со средствами изоляции Hyper-V. Эти возможности пока недоступны в установленном ранее Docker CE, но вы можете скачать необходимые файлы с веб-сайта http://master.dockerproject.org.



2. Скачайте файлы dockerd.exe и docker.exe с сайта http://master.dockerproject.org и сохраните в надежном месте, например, вашем собственном каталоге. Они понадобятся для запуска контейнера Ubuntu на следующем шаге.

Запустите контейнер Ubuntu в Hyper-V


1. Теперь вы готовы к запуску своего контейнера. Для начала откройте интерфейс командной строки (cmd.exe) от имени администратора и запустите dockerd.exe в нужной среде.

C:\Users\mathi\> set LCOW_SUPPORTED=1
C:\Users\mathi\> .\dockerd.exe -D --data-root C:\lcow

2. Затем откройте окно Powershell от имени администратора и запустите docker.exe, чтобы скачать образ для вашего контейнера.

C:\Users\mathi\> .\docker.exe pull ubuntu



3. Наконец, настало время запустить контейнер. Снова запустите docker.exe и попросите систему развернуть новый образ.

C:\Users\mathi\> .\docker.exe run -it ubuntu



Поздравляю! Вы успешно настроили свою систему для работы с контейнерами c Hyper-V изоляцией в Windows и запустили собственный контейнер Ubuntu.

Помощь


Если вам нужна помощь, чтобы начать работу с образами контейнера Ubuntu для Hyper-V или у вас возникли проблемы, поддержка всегда рядом:

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


  1. Thseru
    11.10.2017 13:25
    +2

    Кто-то пробовал уже это делать? Есть какое-нибудь мнение об этом?


    1. de1m
      11.10.2017 13:40

      я пробывал нормально работало, но мне не подошло, потому что мне нужет для работы virtualbox, а они (hyper-v и virtualbox) паралелльно не работают (ну кроме 32битных виртуалок) пришлось его удалить и hyper-v заодно и использовать docker-toolbox


  1. kevrat14
    11.10.2017 17:52

    А можно ли как-то к ui подцепиться?


    1. stasus Автор
      12.10.2017 09:40

      там же везде оптимизированные Docker образы без UI


  1. yuretsz
    11.10.2017 17:53

    Чем это лучше простой установки docker for windows или использования linux subsystem for windows?


    1. Hixon10
      11.10.2017 21:24

      linux subsystem for windows позволяет использовать себя, как хост-машину для докера? Или вы о том, чтобы использовать linux subsystem for windows, как конечный линукс?


      1. Yngvie
        11.10.2017 22:40

        Я пробовал несколько месяцев назад, запустить Docker под Linux subsystem — не получалось. Даже с попыткой замены Unix сокетов на TCP. Не помню что именно, но это ядро не поддерживало все фичи изоляции, которые нужны докеру.


        Так что думаю что вопрос в использовании самой подсистемы как линукса.


        И насколько я помню, там продублирован не весь функционал Линукса, так что некоторые утилиты не работают.


        1. Hixon10
          11.10.2017 22:42

          Ну да, всё так, аналогичный экспириенс.


        1. Dreyk
          12.10.2017 17:07

          ну они говорили, что это у них не в приоритете, так как сейчас есть docker for windows. но обещали, что в будущем будет


    1. stasus Автор
      12.10.2017 09:42

      В Linux Sub Docker не работает. Клиент — работает, engine — нет. Здесь речь о запуске контейнеров.


      Вот здесь описал разницу между docker for windows и этим. Технологически, почти то же самое, но есть ньюансы: https://habrahabr.ru/company/microsoft/blog/339746/#comment_10467902


  1. Yngvie
    11.10.2017 18:20

    А я так понимаю что .\dockerd.exe запускается вместо стандартного докер-демона, который запускается через "C:\Program Files\Docker\Docker\Docker for Windows.exe"


    То есть запустив таким образом особый Ubuntu-Docker, я не смогу использовать другие контейнеры, например на основе alpine?


    Или все не Ubuntu контейнеры будут также запускаться через старый MobyLinuxVM?


    1. stasus Автор
      12.10.2017 09:26

      Сможете использовать любые контейнеры. Идея данной реализации Hyper-V Linux контейнеры под Windows, когда прозрачно для вас на специально собраном ядре в виртуалке запускаются линукс контейнеры, но внути самой Linuх виртуалки _незапускается Docker Engine, COW файлы пишутся на Windows хост и т.д. Т.е. выглядит это, как Linix контейнер под Windows :)


      Для того, чтобы организовать такую штуку, вам нужны специальные оптимизировванные образы для этих виртуалок, внутри которых запускаются контейенры. Эта статья про такой образ от Ubuntu, на которм запускается Ubuntu :) Прошлая статья про такой образ от Docker.


      1. Yngvie
        12.10.2017 10:19

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


        А что с потреблением памяти? Сейчас под виртуалку с докером можно выделить фиксированное количество ОЗУ, у меня например стоит 2 Гб.
        А при новом подходе — надо будет задавать объем памяти для каждого контейнера?


        И еще вопрос, который волнует — можно ли теперь подключать volumes без необходимости расшаривать весь диск по самбе?


        1. stasus Автор
          12.10.2017 11:41

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


        1. stasus Автор
          12.10.2017 14:13

          Там идея работы — прозрачная работа с контейнерами, соответсвенно, предположу, что ограничения на память должны буду задаваться ограничениями на память контейнера.


  1. RomanPokrovskij
    11.10.2017 23:49

    Хотелось бы чтобы статьи (эта и предудущая) начинались с качественного описания решаемой проблемы.
    И еще хотелось бы чтобы Микрософт понял что Стасу Павлову надо помочь рости в понимании зачем он пишет.

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

    Можно ли рассказать в чем упрощение?


    1. stasus Автор
      12.10.2017 09:38
      +1

      Да, моя вина. Поскольку для меня это "горячая" тема, пропустил "очевидные" вещи.


      Как работает 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 и т.д.


      1. RomanPokrovskij
        13.10.2017 19:08

        Спасибо за ответ. Хочу понять «возможность прозрачного запуска» в чем непрозрачность сейчас (с точки зрения штатных средств управления контейнерами) 2) «без какого-либо переключения, одновременно, всех типов… контейнеров» — фраза не понятна, может имеется ввиду переключение между штатными средствами управления «разными типами контейнеров»?

        На сколько я понимаю штатные средства — скриптовые, то хотелось бы увидеть разницу в скриптах.