company_banner

Запуск контейнеров с Ubuntu на Windows

https://insights.ubuntu.com/2017/09/13/running-ubuntu-containers-with-hyper-v-isolation/
  • Перевод
  • Tutorial
Привет, Хабр! Неделю назад я рассказывал вам о новой возможности, которая доступна в предварительных выпусках 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 или у вас возникли проблемы, поддержка всегда рядом:

Microsoft 404,08
Microsoft — мировой лидер в области ПО и ИТ-услуг
Поделиться публикацией
Похожие публикации
Комментарии 31
  • +2
    Кто-то пробовал уже это делать? Есть какое-нибудь мнение об этом?
    • 0
      я пробывал нормально работало, но мне не подошло, потому что мне нужет для работы virtualbox, а они (hyper-v и virtualbox) паралелльно не работают (ну кроме 32битных виртуалок) пришлось его удалить и hyper-v заодно и использовать docker-toolbox
    • 0
      А можно ли как-то к ui подцепиться?
      • 0

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

        • 0
          Где там?

          В репозиториях для докера есть образы с включенным VNC.
          • 0

            В официальном репощитории Ubuntu образ из которого используется в этом руководстве

      • 0

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

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

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


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


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

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

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

            • 0

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


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

            • 0

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


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


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

              • 0

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


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

                • 0

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


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


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

                  • 0

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

                    • 0

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

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

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

                  Можно ли рассказать в чем упрощение?
                  • +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 и т.д.

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

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

                        Не нужно будет никакого переключения, Docker network между Windows и Linux на одной машине, созданный и управляемый средствами Docker

                  • 0

                    С выходом Creator Fall решил попробовать сделать все по туториалу.
                    И столкнулся с проблемой из этого тикета. Флаг experimental тоже не помог. Не знаете, есть ли какое-то решение? Возможно надо откатиться на предыдущую версию dockerd?

                    • 0

                      Частично отвечу на свой же вопрос.


                      Прочитал тикет 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 выходит тоже самое.

                      • 0

                        Ну, это же preview, где-то ещё не синхронизировалась кодова база. Я тоже обновился, сейчас попробую сам ещё раз и если что-то получится, отпишусь.

                        • 0

                          Взял инструкцию отсюда для LinuxKit, добавил в окружение $env:LCOW_API_PLATFORM_IF_OMITTED="linux" для запуска сервиса.


                          Без переменной окружения $env:LCOW_API_PLATFORM_IF_OMITTED="linux" не работало, с ней запустилось. Windows 10 Version 1709 — это как раз Update.


                          Запускал всё из PowerShell (Admin)

                          • 0

                            Я так понимаю вы про эту статью — Linux-контейнеры для Windows.


                            Только что попробовал, видимо там zip архив с LinuxKit обновили. Теперь удалось запустить… правда через раз почему то, и на второй раз начало зависать при распаковке образа, но хоть что-то. Пришлось пару раз очищать папку lcow и качать образы заново.


                            Один из моментов который интересовал работает — можно добавить volume с диска который не расшарен. Так что есть повод ждать релиза.

                      • 0
                        с последнего апдейта докера (17.10.0-ce 13788) такие танцы уже не нужны, там уже есть поддержка запуска Linux контейнеров на Windows 10 1709 (build 16299) или Windows Server 1709 — t.me/MicrosoftRus/266
                        • 0

                          Небольшое уточнение, 1) текущая stable версия Version 17.09.0-ce-win33 (13620), 17.10.0-ce (13788) — это edge версия 2) сейчас при включение этой возможности невозможно однвременно работать с Windows контейнерами.

                        • 0
                          спасибо за статью.
                          Есть вопрос — я успешно проделал всё это и запустил 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

                          не подскажете что я делаю не так?
                          • 0
                            или сейчас в принципе нельзя никак на этом экспериментальном демоне запустить и виндовый и линуксовый контейнер одновременно? я видел вот этот комментарий «сейчас при включение этой возможности невозможно однвременно работать с Windows контейнерами», но думал, что он относится к edge версии докера, а не к той, которую предлагается скачать в статье из мастер ветки…
                            • +1

                              Пока что одновременно Windows и lcow контейнеры не работают.

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

                          Самое читаемое