Контейнеры Linux в Windows 10
Контейнеры Linux составляют огромную долю общей экосистемы контейнеров и имеют важное значение для разработки и рабочих сред. Так как контейнеры и узел контейнеров используют одно ядро, запуск контейнеров Linux непосредственно в Windows — не лучший вариант. Как раз в таких случаях и применяется виртуализация.
Контейнеры Linux на виртуальной машине Moby
Чтобы запустить контейнеры Linux на виртуальной машине Linux, выполните инструкции из статьи о начале работы с Docker.
Docker поддерживает запуск контейнеров Linux на компьютерах с Windows с момента своего первого запуска в 2016 г. (до того, как стали доступны изоляция Hyper-V или контейнеры Linux в Windows). Для этого используется виртуальная машина на базе LinuxKit, работающая в Hyper-V.
В такой модели клиент Docker запускается на компьютере с Windows, но отправляет вызовы в управляющую программу Docker на виртуальной машине Linux.
В этой модели все контейнеры Linux совместно используют один узел контейнера, а также:
Это также означает, что в узле контейнера Linux (виртуальной машине Moby) должна быть запущена управляющая программа Docker и все ее зависимости.
Чтобы узнать, используется ли виртуальная машина Moby, проверьте в диспетчере Hyper-V ее наличие с помощью пользовательского интерфейса или выполните команду Get-VM в окне PowerShell с повышенными привилегиями.
Запуск контейнеров с Ubuntu на Windows
Привет, Хабр! Неделю назад я рассказывал вам о новой возможности, которая доступна в предварительных выпусках 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
Если вы уже являетесь участником этой программы, переходите к следующему шагу.
1. Откройте следующую ссылку в вашем веб-браузере:
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 требует внимания).
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:
Подготовьте окружение для контейнера
1. Сначала создайте два каталога.
2. Создайте каталог C:\lcow, который будет использоваться как область временных файлов для Docker при подготовке контейнеров.
3. Также создайте каталог C:\Program Files\Linux Containers. В нем будет храниться образ контейнера Ubuntu.
4. Нужно будет назначить для этого каталога дополнительные разрешения, чтобы Docker мог использовать хранящиеся в нем образы. Выполните следующий скрипт Powershell в окне администратора Powershell:
Сохраните этот файл под именем set_perms.ps1 и запустите его.
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 в нужной среде.
2. Затем откройте окно Powershell от имени администратора и запустите docker.exe, чтобы скачать образ для вашего контейнера.
3. Наконец, настало время запустить контейнер. Снова запустите docker.exe и попросите систему развернуть новый образ.
Поздравляю! Вы успешно настроили свою систему для работы с контейнерами c Hyper-V изоляцией в Windows и запустили собственный контейнер Ubuntu.
Помощь
Если вам нужна помощь, чтобы начать работу с образами контейнера Ubuntu для Hyper-V или у вас возникли проблемы, поддержка всегда рядом:
Начало работы с удаленными контейнерами Docker в WSL 2
это пошаговое руководство поможет приступить к разработке с помощью удаленных контейнеров, настроив для Windows WSL 2 (подсистема Windows для Linux версии 2).
docker Desktop для Windows предоставляет среду разработки для создания, доставки и запуска приложений пакетных. включив модуль на основе WSL 2, вы можете запускать контейнеры Linux и Windows в docker Desktop на одном компьютере. (для личного использования и малых предприятий вы можете использовать docker Desktop. дополнительные сведения о Pro, команде или ценах на веб-узел dockerсм. на странице «вопросы и ответы» для филиалов).
Общие сведения о контейнерах Docker
Docker — это средство для создания, развертывания и запуска приложений с использованием контейнеров. Контейнеры позволяют разработчикам упаковывать приложения с использованием всех необходимых компонентов (библиотек, платформ, зависимостей и т. п.) и поставлять все это как один пакет. Использование контейнера дает возможность приложению работать одинаково, независимо от настроенных параметров или ранее установленных библиотек на компьютере, где оно запускается, так как он может отличаться от компьютера, который использовался для написания и тестирования кода приложения. Это позволяет разработчикам сосредоточиться на написании кода, не беспокоясь о том, в какой системе он будет выполняться.
Контейнеры Docker похожи на виртуальные машины, но не создают всю виртуальную операционную систему. Вместо этого контейнер Docker позволяет приложению использовать то же ядро Linux, что и система, в которой оно работает. Таким образом пакету приложения требуются только те части, которых еще нет на главном компьютере. В результате размер пакета уменьшается, а производительность увеличивается.
Постоянная доступность, которую обеспечивает использование контейнеров Docker с такими инструментами, как Kubernetes, — еще одна причина популярности контейнеров. Это позволяет создавать несколько версий контейнера приложения в разное время. Вместо того чтобы останавливать всю систему для обновления или обслуживания, каждый контейнер (и определенные микрослужбы) можно заменить на лету. Вы можете подготовить новый контейнер со всеми обновлениями, настроить его для рабочей среды и просто указать новый контейнер после его готовности. Можно также архивировать различные версии вашего приложения, используя контейнеры, и при необходимости поддерживать их работу в качестве резервного ресурса.
Дополнительные сведения см. в разделе Введение в контейнеры DOCKER на Microsoft Learn.
Предварительные требования
в WSL версии 1 из-за фундаментальных различий между Windows и Linux подсистема docker не смогла запуститься непосредственно внутри WSL, поэтому группа docker разработала альтернативное решение с использованием виртуальных машин Hyper-V и линукскит. Однако поскольку WSL 2 теперь работает в ядре Linux с полной емкостью системных вызовов, Docker можно полностью запустить в WSL 2. это означает, что контейнеры Linux могут работать изначально без эмуляции, что обеспечивает лучшую производительность и совместимость между средствами Windows и Linux.
Установка Docker Desktop
если серверная часть WSL 2 поддерживается в docker Desktop для Windows, вы можете работать в среде разработки на основе linux и создавать контейнеры на основе linux, используя Visual Studio Code для редактирования кода и отладки и запуска контейнера в Microsoft Edge браузере на Windows.
Чтобы установить DOCKER (после установки WSL), выполните следующие действия.
Скачайте DOCKER Desktop и следуйте инструкциям по установке.
после установки запустите приложение docker Desktop из Windows меню, а затем выберите значок docker в меню «скрытые значки» панели задач. щелкните правой кнопкой мыши значок, чтобы открыть меню команд docker, и выберите «Параметры».
выберите из установленных дистрибутивов WSL 2, для которых вы хотите включить интеграцию с docker, перейдя по: Параметры > ресурсы > WSL integration.
Проверьте, правильно ли работает установка, выполнив простой встроенный образ DOCKER с помощью: docker run hello-world
Вот несколько полезных команд DOCKER для получения сведений:
Разработка в удаленных контейнерах с помощью VS Code
чтобы приступить к разработке приложений с помощью docker с WSL 2, мы рекомендуем использовать VS Code, а также расширение Remote-WSL и расширение docker.
установите VS Code расширение Remote-WSL. это расширение позволяет открыть проект Linux, работающий на WSL, в VS Code (не нужно беспокоиться о проблемах с путями, двоичной совместимости или других задачах, связанных с разными операционными системами).
Установите расширение VS code Remote-Containers. это расширение позволяет открыть папку проекта или репозиторий в контейнере, используя преимущества полного набора функций Visual Studio Code для выполнения разработки в контейнере.
установите VS Code расширение docker. Это расширение добавляет функциональные возможности для создания и развертывания контейнерных приложений, а также управления ими в VS Code. (Для фактического использования контейнера в качестве среды разработки требуется расширение Remote-Container.)
Давайте создадим контейнер разработки для существующего проекта приложения с помощью DOCKER.
В этом примере я использую исходный код из руководства по Hello World Django в среде разработки Python Настройка документов. Этот шаг можно пропустить, если вы предпочитаете использовать собственный исходный код проекта. чтобы скачать веб-приложение HelloWorld-Django из GitHub, откройте терминал WSL (например, Ubuntu) и введите: git clone https://github.com/mattwojo/helloworld-django.git
В терминале WSL измените каталоги на папку исходного кода для этого проекта:
откройте проект в VS Code, работающем на локальном сервере расширений Remote-WSL, введя следующее:
убедитесь, что вы подключены к WSL Linux дистрибутив, проверив зеленый индикатор зеленого цвета в левом нижнем углу экземпляра VS Code.
в VS Code команде паллетте (Ctrl + Shift + P) введите: Remote-containers: Open Folder in контейнер. Если эта команда не отображается при вводе, убедитесь, что вы установили расширение удаленного контейнера, связанное выше.
Выберите папку проекта, которую вы хотите контейнеризовать. В моем случае это \\wsl\Ubuntu-20.04\home\mattwojo\repos\helloworld-django\
Появится список определений контейнеров, так как в папке проекта (репозитории) еще нет конфигурации Девконтаинер. Список отображаемых определений конфигурации контейнера фильтруется на основе типа проекта. Для моего проекта Django я выберу Python 3.
чтобы убедиться, что проект по-прежнему подключен к WSL и в контейнере, откройте VS Code интегрированный терминал (Ctrl + Shift +
в VS Code выберите запустить > отладку запуска (или просто нажмите клавишу F5 ). при этом откроется окно терминала в VS Code. результат должен выглядеть следующим образом: «запуск сервера разработки при http://127.0.0.1:8000/ выходе из системы на сервере с помощью CONTROL-C». Удерживайте нажатой клавишу CTRL и выберите отображаемый адрес, чтобы открыть приложение в веб-браузере по умолчанию и просмотреть проект, работающий в контейнере.
Вы успешно настроили удаленный контейнер разработки с помощью DOCKER Desktop, на базе серверной части WSL 2, который можно использовать для кодирования, сборки, запуска, развертывания или отладки с помощью VS Code!
Устранение неполадок
Нерекомендуемый контекст DOCKER WSL
Возможные ошибки, которые могут возникнуть при работе с этим нерекомендуемым контекстом WSL, включают: docker wsl open //./pipe/docker_wsl: The system cannot find the file specified. или error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_wsl/v1.40/images/json?all=1: open //./pipe/docker_wsl: The system cannot find the file specified.
Не удается найти папку хранилища образов DOCKER
DOCKER создает две папки дистрибутив для хранения данных:
Дополнительные сведения о поиске расположений хранилищ DOCKER в WSL см. в этой статье из РЕПОЗИТОРИЯ WSL или этой стакковерлов записи.
Контейнеры и Windows. От Hello World до Kubernetes. Часть первая, вводная
Когда я разговариваю с Linux инженерами и говорю им о проблемах Kubernetes кластера на Windows, на меня смотрят очень подозрительно. Некоторые даже не верят что это законно такое бывает. Контейнеры на Windows не так распространены и востребованы, как на Linux. Но я думаю, что поговорить об этой теме стоит, хотя бы для того, что бы понимать общую концепцию и основные отличия контейнеров Windows и Linux. Первой записью я пройдусь по полотну широкой кистью, а затем, в последующих постах, попробую постепенно углубиться в нюансы.
Контейнеры в Windows
Действительно, контейнеры в 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.
Для управления надо хорошо знать CMD и Powershell.
Скорее всего работать вам придется с core версией Windows Server на Docker хостах. Windows Server имеет огромное количество возможностей по удаленному управлению. Общий подход такой, что имея Windows Server с графическим интерфейсом вы можете подключатся всеми графическими оснастками к любому core серверу.
Данный подход не работает в сценариях с контейнерами, хотя в контейнере и находится полноценная версия Windows Server. Внутрь контейнера Windows теоретически можно подключится по WMI, но это не так просто, хотя бы потому что хостовая ОС будет перехватывать данный трафик на себя. Контейнеров на хосте может быть несколько десятков и сотен, и в таком случае направлять трафик в нужный контейнер это целое дело.
CMD и Powershell понадобятся как для администрирования контейнеров так и самого хоста на котором установлен Docker. Так же знание данных оболочек необходимо для написания Dockerfile, так как все инструкции RUN будут выполнятся в вышеупомянутых командных оболочках.
Запомнить все длинные командлеты Powershell довольно сложно. Это вам не лаконичные команды bash. Хотя сейчас большинство командлетов имеет понятные любому Linux инженеру алиасы. В powershell можно использовать:
Из крайне полезных вещей, это то, что с помощью 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 базовые образы.











