Можно ли на windows запустить docker контейнер предназначенный для linux

Обновлено: 06.07.2024

Для ежедневной работы в терминале я устан о вил Windows Subsystem for Linux вместе с дистрибутивом Ubuntu. Кроме того у меня установлен Linuxbrew, который помогает мне с установкой приложений сторонних производителей. Такое сочетание функционирует просто отлично! У меня есть следующая ссылка ко «внешним» (хранящимся на Windows) данным: ln -s

/external /mnt/c/Users/DoomHammer . Почти все необходимое можно осуществить подобным образом. Но до тех пор, пока не нужно использовать Docker.

Что такого особенного в Docker?

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

Значит ли это, что мы не можем использовать Docker изнутри WSL? Можем, но нужно постараться, чтобы добраться до него. Во-первых, нужно установить Docker под Windows. Для этого есть Docker Enterprise Editions для Windows Server 2016 (и новее), Community Edition для Windows 10 Professional и Enterprise. У меня установлена Windows 10 Home.

Docker на Windows 10 Home

Настройка Docker в Windows 10 Home кажется более сложной. Для Docker Community Edition необходима поддержка системы Hyper-V, которая недоступна для версии Home. То есть мне надо было найти Docker Toolbox- более раннюю версию на основе Docker Machine и Virtualbox. Но после установки Virtualbox выдал окно с ошибкой о том, что запустить виртуальную машину невозможно.

Как оказалось, в BIOS у меня была выключена функция виртуализации. Видимо для безопасности. После включения функции, я снова запускаю Virtualbox. Проблема осталась. В интернете посоветовали проверить systeminfo . Хорошо. Там показано, что работает какой-то гипервизор. Но ведь не Virtualbox или, тем более, Hyper-V, верно?

К моему удивлению, все это время работал именно Hyper-V. Похоже в версии Home нет инструментов для использования Hyper-V, но это не означает, что гипервизор не работает. К счастью, чтобы выключить его, нужно просто ввести в команду bcdedit /set hypervisorlaunchtype off . После перезагрузки Virtualbox заработал. Ура!

Docker и WSL — лучшие друзья навеки?

С работающим Virtualbox я открыл Docker Quickstart Terminal. Во время первого запуска он создает Docker Machine (вот зачем нужен Virtualbox) для функционирования в качестве хоста для всех контейнеров. Далее ввожу команду docker run --rm hello-world и наблюдаю за индикатором выполнения загрузки подходящего образа. Снова ура!

Теперь вместо cmd.exe я использую Docker в WSL. Как так получилось? К счастью, у WSL есть доступ к бинарным файлам Windows. То есть я могу ввести команду docker-machine.exe ls для того, чтобы увидеть машину, созданную Docker Toolbox. Она будет называться просто default . Если не указан статус «Running», то можно запустить машину с помощью команды docker-machine.exe start . Каждый раз при запуске Docker Machine помните, что в отличие от cmd.exe ,выполнение ( .exe ) является обязательным.

Чтобы указать переменные окружения, вызывается docker-machine.exe env .

К сожалению, они выводятся в формате для cmd.exe , а не Bourne shell (bash или zsh). Но мы можем изменить это с помощью docker-machine.exe env — shell sh .

Почти готово. Нужно сделать кое-что еще. Путь к сертификату написан как путь Windows. Как перевести это во что-то понятное для WSL? В WSL есть хорошая утилита wslpath , благодаря которой можно ввести команду export DOCKER_CERT_PATH=$(wslpath $DOCKER_CERT_PATH) . Готово!

Но нам все еще нужны инструменты пользовательского пространства. Итак, с помощью диспетчера пакетов установите Docker Engine и Docker Compose. В моем случае нужно ввести команду brew install docker docker-compose . После нее вводим команду docker run --rm hello-world . На этом все, мои поздравления!

На этом все?

Конечно же нет. Как видим, bind-mount работает некорректно, потому что Docker-демон ожидает подходящего пути Windows, а пути WSL не переводятся автоматически. Но есть несколько приемов, которые помогут нам в данной ситуации.

Microsoft Windows
Version 18.03 (OS Build 17133.73)

Если версия будет 18.03 или новее, то можно отредактировать /etc/wsl.conf следующим образом:

То есть WSL смонтирует диск С: под /c/ вместо обычного /mnt/c . Почему это важно? Потому что этого ожидает Docker-демон от путей Windows. Кстати, после сохранения файла необходимо перезайти (re-login), чтобы изменения вступили в силу.

Осторожно! Если вы используете WSL-терминал, то это изменение сломает его. Тогда можно сделать следующее.

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

Так быстрее, но функция будет доступна только до тех пор, пока вы не выйдете из системы. После перезапуска нужно повторять процедуру или добавить ее в конфигурацию среды выполнения shell (например,

/.zshrc ). Это происходит из-за того, что /etc/fstab не работает на WSL так, как требуется.

Теперь можно запускать Docker с монтированием, но только если приложение находится в файловой системе WIndows. У вас не должно возникнуть проблем с командной строкой docker , которая ожидает абсолютные пути, но с Docker Compose нужно быть максимально внимательным. Он позволяет использовать относительные пути, и все, что начинается с ./ не будет работать.

Если вы все-таки решили монтировать файловую систему WSL с помощью Docker, то можете попробовать заменить все ./ и $PWD на /c/Users/$USERNAME/AppData/Local/lxss . Здесь $USERNAME означает не имя пользователя WSL, а имя пользователя Windows.

Я также хотел написать оболочку для Docker Compose, чтобы изменить рабочий каталог на lxss , но у WSL нет к нему доступа. И думаю, это правильно!

И последнее

Мы можем запускать Docker и связывать каталоги данных. Что еще нам нужно? Может рабочая переадресация портов? В отличие от Native solutions, ипользуя Docker через Docker Machine, необходимо вызывать все службы через $(docker-machine ip):$PORT вместо обычного localhost:$PORT . Существует способ обойти все это, хотя и не очень элегантный:

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

Надеюсь, данные советы облегчат работу с Docker на WSL. Лично мне они очень помогли.


В этом руководстве мы рассмотрим, как настроить сервер Windows 2019 для запуска контейнеров Docker.

Docker изменил правила работы с контейнерами приложений и проектированием и развертыванием микросервисов.

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

Первоначально он был написан для Linux, но была проделана большая работа, чтобы позволить пользователям Windows и macOS запускать контейнеры Docker.

Как запустить Docker контейнеры на Windows Server 2019

Прежде чем вы сможете использовать контейнеры Windows для запуска нескольких изолированных приложений вашей системы, вам нужно включить функцию контейнеров и установить Docker на Windows Server 2019.

Шаг 1. Включите функцию контейнеров в Windows Server 2019

Запустите следующие команды.

Это установит Docker-Microsoft PackageManagement Provider из галереи PowerShell.

Пример вывода, как показано ниже:

Шаг 2. Установите Docker на Windows Server 2019

как только функция «Контейнеры» будет включена в Windows Server 2019, установите последнюю версию Docker Engine и Client, выполнив следующую команду в сеансе PowerShell.

Согласитесь на установку, используя «yes», «Y» или «А», чтобы согласиться со всеми.

После завершения установки перезагрузите компьютер.

Установленную версию Docker можно проверить с помощью:

Тожe самое можно выполнить командой docker --version

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

Шаг 3: Запустите Docker контейнер

Запустить Docker Daemon

Запуск контейнеров Linux на Windows Server 2019

Из коробки Docker в Windows запускает только контейнер Windows.

Чтобы использовать контейнеры Linux на Windows Server, вам нужно использовать Docker Enterprise Edition Preview, который включает в себя полную систему LinuxKit для запуска контейнеров Docker Linux.

Удалите ваш текущий Docker CE.

Включите вложенную виртуализацию, если вы используете Docker Containers с использованием виртуальной машины Linux, работающей в Hyper-V.

Затем установите текущую предварительную сборку Docker EE.

Включить систему LinuxKit для запуска контейнеров Linux

Перезапустите Docker Service после изменения.

Вытащите образ тестового докера.

Чтобы вернуться к работе с контейнерами Windows, выполните:

Наслаждайтесь работой контейнеров Linux и Windows на Windows Server 2019. Оставьте нам комментарий в случае каких-либо проблем.

Начиная с Windows Server 2016 в операционной системе от Microsoft включена нативная поддержка контейнеров. Это не Linux контейнеры, это контейнеры, которые работают на Windows, и запускают Windows внутри себя.

Данный факт является результатом присоединения Microsoft к Open Container Initiative (OCI). Контейнеры в Windows позволяют запускать приложения, которые изолированы от остальной части системы в переносимых контейнерах. Эти контейнеры включают в себя все, чтобы ваше приложение было полностью функциональным. Так же как это произошло с Linux, Microsoft надеется, что контейнеры изменят характер поставки программного обеспечения для пользователей и в Windows.

Контейнеры являлись основой вычислений в Linux в течение целого ряда лет. Google, например, уже очень давно использует решения, основанные на контейнерах по всей своей империи, чтобы предоставлять распределенные приложения не только своим сотрудникам, но и своим пользователям по всему миру.

Тем не менее, Google не был долгое время одинок в своем увлечении контейнерными вычислениями. В какой-то момент из ниоткуда появился Docker, который в отличии от Google стандартизировал процессы доставки контейнеров, а также управления ими. Более того, Docker развивался сообществом энтузиастов в мире открытого исходного кода, что сделало его простым и очень популярным решением. С развитием проекта Docker буквально у каждого желающего появилась возможность получить скорость, гибкость и простоту управления программным обеспечением и инфраструктурой, которую предоставляют контейнеры.

Docker революция стала настолько значительной, что даже Microsoft присоединился к этой инициативе в первую очередь за счет поддержки Docker и Linux в Azure, а теперь и за счет интеграции этой технологии в Windows Server 2016. Самое интересное это то, что контейнеры Windows Server не основаны на Linux, это нечто совершенно новое. Windows контейнеры — это контейнеры, которые работают в Windows и запускают Windows внутри себя.

Причем Microsoft настолько серьезно стала относится к контейнерам, что сейчас активно участвует в Open Container Initiative (OCI), пытаясь перетягивать одеяло на себя так, как будто бы она сама придумала эту технологию.

Контейнер в Windows имеет много общего с его аналогом в Linux. Оба обеспечивают изолированную среду для запуска приложений. И там и там контейнеры используют передовые технологии изоляции для обеспечения портативной, но одновременно ограниченной среды, которая включает в себя практически все, чтобы приложение могло быть полностью функциональным.

Контейнер очень похож на виртуальную машину (ВМ) и часто рассматривается как отдельный тип виртуализации, но это два совершенно разные понятия. Да, каждый работает под управлением операционной системы (ОС), предоставляет внутри себя локальную файловую систему и может быть доступен по сети так же как физический компьютер. Тем не менее, при использовании ВМ вы имеете дело с полной и независимой ОС вместе с виртуальными драйверами устройств, управлением памятью и другими компонентами, которые добавляют к накладные расходы.

Контейнер переиспользует большее количество общих ресурсов хост-системы нежели виртуальная машина, а значит, он более легкий, быстрее разворачивается и проще масштабируется между различными датацентрами. Таким образом, контейнер может предложить более эффективный механизм для инкапсулирования приложения, обеспечивая ему при этом необходимые интерфейсы хост-системы — все из этого приводит к более эффективному использованию ресурсов и улучшению переносимости приложений.

Microsoft планирует предложить два типа контейнеров в Windows Server 2016: контейнер Windows Server и Hyper-V контейнер. Оба типа функционируют одинаковым образом, и могут быть созданы и управляются одинаково. Там, где они различаются — это в уровне изоляции, который каждый из них обеспечивает.

Контейнер Windows Server разделяет ядро с ОС работает на хост-машине, что означает, что все контейнеры, работающие на этой машине, разделяют одно и то же ядро. В то же время, каждый контейнер поддерживает свой собственный вид на операционную систему, реестр, файловую систему, IP-адреса и другие компоненты, сочетая это с изоляцией, предоставляемой каждому контейнеру при помощи процессов, пространства имен и технологий управления ресурсами.

Контейнер Windows Server хорошо подходит для ситуаций, в которых и основная ОС, и приложения в контейнерах лежат в пределах той же зоны доверия, например для приложений, которые охватывают несколько контейнеров или образуют общую службу. Тем не менее, контейнеры Windows Server обсуждаются в связи с их зависимостью от процесса обновления ОС хост-системы, который может осложнить обслуживание и препятствовать процессам. Например, патч примененный к хосту может сломать приложение, работающее в контейнере. Что еще более важно, в таких ситуациях, как многопользовательские среды, модель разделяемого ядра может раскрыть систему для уязвимостей приложений и кросс-контейнерных атак.

docker-windows.jpg

Hyper-V контейнер решает эти проблемы, предоставляя виртуальную машину, в которой нужно запустить контейнер Windows. При таком подходе контейнер больше не разделяет ядро хост-машины и не имеет зависимости от патчей ОС этой машины. Конечно, такой подход означает некоторую потерю скорости и эффективности упаковки, которые вы получаете с обычным контейнером в Windows Server, но взамен вы получаете более изолированную и безопасную среду.

Привет, Хабр! Неделю назад я рассказывал вам о новой возможности, которая доступна в предварительных выпусках 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 будет доступна без необходимости участия в ней.


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) в меню слева.


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 и запустите его.

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



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

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


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

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


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



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



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

Помощь

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

Читайте также: