Можно ли размещать контейнеры Windows на Linux?

Можно ли запустить Контейнеры Windows в Linux? Сценарий основан на приложении, написанном в .NET (старая сеть), и пользователь Linux, который хочет запустить его с Docker, чтобы предоставить net462 написанный API для localhost .

Я использую бета-версию Docker Desktop для Windows

Если нет, то почему Windows может запускать контейнеры Linux, а не наоборот?

РЕДАКТИРОВАТЬ:

Прошло время, и этот вопрос стал популярным. Я хотел бы добавить здесь одно замечание, что обходным путем является использование нового netstandard. Это позволило мне упаковать 4.6.2 фреймворк в новую библиотеку.


person Sebastian 506563    schedule 10.02.2017    source источник
comment
Невозможно - для создания и запуска контейнеров Windows требуется система Windows с поддержкой контейнеров.   -  person ajtrichards    schedule 10.02.2017
comment
Хорошо, но почему тогда Windows может запускать контейнеры Linux? Нет пока наоборот?   -  person Sebastian 506563    schedule 10.02.2017
comment
И наоборот, ни для какой ОС не навсегда. Контейнеры НЕ являются полноценными механизмами виртуализации. Если вы не хотите переписывать свое приложение, вам придется запустить его на виртуальной машине с гостевой ОС Windows. Или перепишите приложение в .NET Core   -  person Panagiotis Kanavos    schedule 10.02.2017
comment
@ Sebastian506563, потому что докер запускает виртуализацию VirtualBox за кулисами, чтобы контейнеры Linux работали в Windows. Я предполагаю, что теоретически возможно и обратное, просто докер этого не реализовал.   -  person Gregory Suvalian    schedule 10.02.2017
comment
@GSA больше нет. Сейчас он использует HyperV, но это все еще виртуальная машина. Docker никоим образом не смешивает ОС. Это по-прежнему одна и та же ОС, работающая внутри и вне контейнера.   -  person Panagiotis Kanavos    schedule 10.02.2017
comment
С виртуальными машинами каждая виртуальная машина имеет свою собственную операционную систему. С контейнерами есть базовый образ ОС, и каждый контейнер добавляет новый тонкий слой поверх основы. В докере это базовая ОС на базе Linux. то есть ваш контейнер Windows не может использовать базу, поскольку она отличается. blog.risingstack.com/   -  person xen-dara    schedule 10.02.2017
comment
@PanagiotisKanavos, пожалуйста, напишите ответ   -  person Sebastian 506563    schedule 10.02.2017
comment
@PanagiotisKanavos Теоретически ничто не мешает докеру запустить Windows, виртуализировать ОС в Linux и создать экземпляр контейнера Windows в режиме изоляции процесса. Независимо от того, какой гипервизор они используют в Windows (Hyper-v или Virtual Box), они делают то же самое для Linux, работающего в Windows.   -  person Gregory Suvalian    schedule 10.02.2017
comment
@GSA, кроме отсутствующего ядра ОС, библиотек и сервисов   -  person Panagiotis Kanavos    schedule 10.02.2017
comment
@PanagiotisKanavos Docker в настоящее время запускает виртуальный Linux внутри Windows и запускает контейнер Linux поверх него. То же самое можно сделать и в Linux. Это стоит установить виртуальную ОС Windows, установить на нее докер и удаленно управлять, как в настоящее время в Windows. Ничего не будет упущено. В настоящее время Docker делает то же самое в Windows и, следовательно, этот вопрос. Проблема, очевидно, будет связана с лицензированием, поскольку для этой работы докеру потребуется полноценная виртуальная ОС, у него нет этой проблемы с Linux и, следовательно, может быть несоответствие.   -  person Gregory Suvalian    schedule 10.02.2017
comment
@GSA запускает виртуальную машину Linux, которая используется в качестве хоста. Контейнеры работают внутри этой виртуальной машины. Вы не можете использовать контейнеры Linux вне виртуальной машины Linux. Просто попробуйте. Откройте Hyper-V Manager и проверьте имя ВМ. Это та виртуальная машина, которая предлагает поддержку Linux, а не какую-то функцию контейнера.   -  person Panagiotis Kanavos    schedule 10.02.2017
comment
@PanagiotisKanavos. Правильный докер запускает контейнер Linux на хостах Windows, создавая виртуальную ОС Linux на хосте Windows. Теоретически можно поступить наоборот. Это запускает виртуальную ОС Windows на хосте Linux и создает контейнер Windows внутри виртуальной ОС Windows, работающей на хосте Linux. Ничто не мешает докеру делать это, кроме накладных расходов на лицензирование и управление. Фактически, я запускаю контейнеры Windows в настоящее время в виртуальной ОС Windows, которая размещена на гипервизоре Vmware, основанном на Linux.   -  person Gregory Suvalian    schedule 10.02.2017
comment
Возможно, вы захотите увидеть этот вопрос, в ответах есть некоторые объяснения, связанные с вашим вопросом: stackoverflow.com/questions/16047306/   -  person xen-dara    schedule 10.02.2017
comment
Ты net462 пробовал запустить под моно? Сделайте это, если это невозможно, перейдите на netstandard / core.   -  person Marcos Junior    schedule 28.02.2018


Ответы (10)


Update3: 06.2019 В некоторых комментариях написано, что ответ непонятен, постараюсь уточнить.

TL;DR:

В: Могут ли контейнеры Windows работать в Linux?

A: Нет. Они не могут. Контейнеры используют ресурсы и драйверы базовой операционной системы, поэтому контейнеры Windows могут работать только в Windows, а контейнеры Linux могут работать только в Linux.

В: А как насчет Docker для Windows? Или другие решения на базе ВМ?

A: Docker для Windows позволяет имитировать запуск контейнеров Linux в Windows, но внутри создается виртуальная машина Linux, поэтому контейнеры Linux работают в Linux, а контейнеры Windows - в Windows.

Бонус: прочтите эту прекрасную статью о запуске контейнеров докеров Linux. в Windows.

В: Итак, что мне делать с приложением .Net Framework 462, если я хочу работать в контейнере?

A: Это зависит от обстоятельств. Следуя нескольким рекомендациям:

  • Если есть возможность - переходите на .Net Core. Поскольку .Net Core обеспечивает поддержку большинства основных функций .Net Framework и .Net Framework 4.8 будет последней версией .Net framework
  • Если вы не можете перейти на .Net Core - как упоминал @Sebastian - вы можете преобразовать свои библиотеки в .Net Standard и иметь 2 версии приложения - одну на .Net Framework 4.6.2 и одну на .Net Core - это не так. всегда очевидно, Visual Studio поддерживает это довольно хорошо (с множественным таргетингом), но некоторые зависимости могут потребовать дополнительной осторожности.

  • (Рекомендуется реже) В некоторых случаях вы можете запускать контейнеры Windows. Контейнеры Windows становятся все более зрелыми и лучше поддерживаются такими платформами, как Kubernetes. Но чтобы иметь возможность запускать код .Net Framework, вам все равно нужно запускать базовый образ «Server Core», который занимает около 1,4 ГБ. В тех же редких случаях вы можете перенести свой код в .Net Core, но по-прежнему работать на серверах Windows Nano с размером образа 95 МБ.

Сохранение старых обновлений в истории

Обновление2: 08.2018. Если вы используете Docker-for-Windows, теперь вы можете запускать контейнеры Windows и linux одновременно: https://blogs.msdn.microsoft.com/premier_developer/2018/04/20/running-docker-windows-and-linux-containers-simhibitedly/

Бонус: не имеет прямого отношения к вопросу, но теперь вы можете запускать не только сам контейнер linux, но и оркестратор, например kubernetes: https://blog.docker.com/2018/07/kubernetes-is-now-available-in-docker-desktop-stable-channel/

Обновлено в 2018 г .:

Исходный ответ в целом правильный, НО несколько месяцев назад докер добавил экспериментальная функция LCOW (официальный репозиторий github).

Из этого сообщения:

Разве Docker для Windows еще не запускает контейнеры Linux? Верно. Docker для Windows может запускать контейнеры Linux или Windows с поддержкой контейнеров Linux через виртуальную машину Hyper-V Moby Linux (начиная с Docker для Windows 17.10 эта виртуальная машина основана на LinuxKit).

Настройка запуска контейнеров Linux с помощью LCOW намного проще, чем в предыдущей архитектуре, где виртуальная машина Linux Hyper-V запускает демон Linux Docker вместе со всеми вашими контейнерами. С LCOW демон Docker работает как процесс Windows (так же, как при запуске контейнеров Docker Windows), и каждый раз, когда вы запускаете контейнер Linux, Docker запускает минимальный гипервизор Hyper-V, на котором запущена виртуальная машина с ядром Linux, runc и процессами контейнера. работает сверху.

Поскольку существует только один демон Docker, и поскольку этот демон теперь работает в Windows, скоро появится возможность запускать контейнеры Docker Windows и Linux бок о бок в одном и том же сетевом пространстве имен. Это откроет множество захватывающих сценариев разработки и производства для пользователей Docker в Windows.

Оригинал:

Как упоминалось в комментариях @PanagiotisKanavos, контейнеры не предназначены для виртуализации и используют ресурсы хост-машины. В результате на данный момент контейнер Windows не может работать «как есть» на Linux-машине.

Но - вы можете сделать это с помощью виртуальной машины - так как она работает в Windows. Вы можете установить виртуальную машину Windows на свой хост Linux, что позволит запускать контейнеры Windows.

С ним, ИМХО, запускать его таким образом в среде PROD - не лучшая идея.

Кроме того, этот ответ содержит более подробную информацию.

person evgenyl    schedule 12.02.2017
comment
Связанный ответ на самом деле не содержит никаких подробностей по этому поводу - он просто объясняет, как запускать контейнеры Linux в Windows (обратное). Можно запустить Docker внутри виртуальной машины Windows, но для этого вам потребуется поддержка вложенной виртуализации. Это означает, что он работает с VMware, но не с Virtualbox. - person Ralf; 08.01.2018
comment
В ответе много слов, но, похоже, он не отвечает на вопрос. - person Kyberias; 24.03.2019
comment
Это не ответ на вопрос. Не стоит так высоко оценивать - person Amorphous; 09.04.2019
comment
Это НЕ ответ на этот вопрос. Запуск докера в Linux ЗНАЧИТЕЛЬНО отличается от запуска докера в Windows. Почему это отмечено как ответ? \ - person Ani; 08.06.2019
comment
Контейнеры = эффективный запуск приложений, изолированных от различий (которые были созданы для конкретной ОС), меньше памяти, дискового пространства, накладных расходов, более эффективное использование оборудования. Виртуальные машины = вариант использования ... запуск всей ОС для различных вариантов использования ..., использование оборудования хорошее (Мне не нужно покупать машину сравнения для каждой ОС ... если мне действительно нужно несколько ОС для моего варианта использования), но жесткое использование не так велико по сравнению с контейнерами. Отличное видео от технического директора Joyent: youtube.com/watch?v=coFIEH3vXPw - person cacoder; 25.07.2019
comment
А в окнах вы не можете общаться между окнами и контейнерами Linux. Вот полный список ограничений. docs .docker.com / docker-for-windows / сеть / - person SLCH000; 14.10.2019
comment
Похоже, теперь вы можете запускать Microsoft Windows в качестве контейнера на основе Docker - см. Windows базовые образы ОС. Согласно странице, эти контейнеры должны работать на хосте Windows, но они выглядят как образы Docker. - person Will; 28.06.2020

Нет, вы не можете запускать контейнеры Windows непосредственно в Linux.

Но вы можете запустить Linux в Windows.

Windows Server / 10 поставляется в комплекте с базовым образом ОС ubuntu (после бета-пакета обновлений в сентябре 2016 г.). По этой причине вы можете запускать Linux в Windows, а не иначе. Посмотрите здесь. https://thenewstack.io/finally-linux-containers-really-will-run-windows-linuxkit/

Вы можете переключаться между контейнерами ОС Linux и Windows, щелкнув правой кнопкой мыши на докере в меню на панели задач.

введите описание изображения здесь

введите описание изображения здесь

person Karthikeyan VK    schedule 20.08.2017
comment
OP хочет вместо этого запускать контейнеры Windows на серверах Linux, поэтому этот вопрос не отвечает на вопрос. Но мне не нравятся люди, которые голосуют против без комментариев, поэтому я даю голос - person daisy; 19.04.2018
comment
@Karthikeyan V: Потому что это не ответ на вопрос. - person Stefan Steiger; 03.07.2018
comment
Я не уверен, что было сказано раньше, но первое утверждение говорит, что вы не можете, а второе говорит, что можете. Вероятно, он отсутствует или что-то сбивает с толку. - person StingyJack; 24.09.2019

Контейнеры используют ядро ​​ОС. Контейнер Windows использует процессы для запуска. Таким образом, теоретически контейнеры Windows не могут работать в Linux.

Однако есть обходные пути с использованием решений VMstyle.

Я нашел это решение, которое использует Vagrant и Packer на Mac, поэтому оно должно работать и для Linux: https://github.com/StefanScherer/windows-docker-machine

Эта среда Vagrant создает Docker Machine для работы на вашем MacBook с контейнерами Windows. Вы можете легко переключаться между контейнерами Docker для Mac Linux и контейнерами Windows.

«Выполнение  введите описание изображения здесь

создание бродяги без головы

$ git clone https://github.com/StefanScherer/packer-windows
$ cd packer-windows

$ packer build --only=vmware-iso windows_2019_docker.json
$ vagrant box add windows_2019_docker windows_2019_docker_vmware.box

Создайте Docker Machine

$ git clone https://github.com/StefanScherer/windows-docker-machine
$ cd windows-docker-machine
$ vagrant up --provider vmware_fusion 2019

Перейти на контейнеры Windows

$ eval $(docker-machine env 2019)
person workaround    schedule 01.04.2019

Решение 1. Использование VirtualBox

Как предложил Мухаммад Сахпутра в этом сообщении , можно запустить ОС Windows внутри VirtualBox (с использованием VBoxHeadless - без графического интерфейса) внутри контейнера Docker.

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

Возможно, это не типичный вариант использования контейнера Docker, но это определенно интересный подход к проблеме.


Решение 2 - Использование Wine

Для простых и, возможно, более сложных приложений, вы можете попробовать использовать wine внутри контейнера докеров.

Эта страница концентратора докеров может помочь вам в достижении вашей цели.


Я надеюсь, что Docker скоро выпустит собственное решение, как это было с docker-machine в Windows несколько лет назад.

person Slavik Meltser    schedule 10.01.2019
comment
Я считаю, что это более точно отвечает на сам вопрос. - person Melih Yıldız'; 23.10.2020

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

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

Кроме того, Linux полностью настраивается, поэтому виртуальная машина Linux, используемая Docker для Windows, была сокращена до нескольких МБ, содержащая только минимум, необходимый для запуска контейнеров, в то время как наименьший доступный дистрибутив Windows составляет около 1,5 ГБ. Это может быть непрактичный размер, но он намного более громоздкий, чем аналог Linux на Windows.

Хотя кто-то, безусловно, может продать вариант Docker для Linux в комплекте с лицензией Windows и готовый к запуску контейнеров Windows под Linux (и я не знаю, существует ли такой продукт), суть в том, что вы не можете избежать оплата фиксированной цены поставщика Windows: как деньгами, так и объемом памяти.

person lvella    schedule 08.05.2019

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

В Windows вам нужно воспользоваться виртуализацией (с использованием Hyper-v), чтобы иметь такую ​​же операционную систему, что и операционная система ваших контейнеров, и тогда вы сможете запускать то же самое.

Docker для Windows - это похожее приложение, которое построено на Hyper-v и помогает запускать контейнер докеров Linux в Windows. Но, насколько мне известно, нет ничего, что помогло бы запускать контейнеры Windows на Linux.

person sunil bhardwaj    schedule 30.05.2018

Вы можете использовать контейнеры Windows внутри виртуальной машины (гостевая ОС должна соответствовать требованиям - Windows 10 Pro или Windows 2016).

Например, вы можете использовать VirtualBox, просто включите Hyper-V внутри интерфейса системы / ускорения / паравиртуализации.

После этого, если Docker не запускается из-за ошибки, используйте в настройках «Переключиться на контейнеры Windows ...».

(это можно переместить как комментарий к принятому ответу, но у меня недостаточно репутации для этого)

person BalintPogatsa    schedule 10.01.2018

Контейнеры Windows не работают в Linux, а также вы не можете запускать контейнеры Linux напрямую в Windows.

person Ehsan    schedule 18.07.2017
comment
Не могли бы вы немного уточнить? - person Matthieu; 18.09.2017
comment
Вы можете запускать контейнеры linux на win 10 - person Kugel; 01.02.2018
comment
Я проголосовал за этого парня, поскольку думаю, что это было правдой в то время. Однако теперь вы можете запускать контейнеры Linux в Docker в Windows (Docker работает на виртуальной машине под названием MobyLinux). - person JakeJ; 18.01.2019
comment
Фактически Windows запускает крошечную виртуальную машину Linux для запуска контейнеров Linux. проверьте свои ресурсы Hyper-V, чтобы увидеть это - person Tuğrul Karakaya; 26.03.2020

В настоящее время вы можете запускать MSSQL и .NET Core в Linux и, следовательно, внутри контейнеров Linux.

См .: https://hub.docker.com/r/microsoft/mssql-server-linux/

Также: https://hub.docker.com/r/microsoft/dotnet/

Прямой вопрос к вашему ответу, конечно, если нет версии, скомпилированной специально для Linux, нет.

person dagelf    schedule 26.06.2018
comment
Это правда, но это не имеет отношения к вопросу. К тому же MS-SQL - это больше, чем просто движок (который в Linux, кстати, идет без файлового потока или R - так что это даже не весь движок). - person Stefan Steiger; 03.07.2018
comment
Вы должны думать на шаг впереди ... почему он спрашивает? Если он спрашивает, потому что хочет запустить одно из этих: вуаля. - person dagelf; 04.07.2018
comment
Возможный. Но ИМХО, он, вероятно, задает вопрос, потому что он уже сделал это, и теперь ему нужно запускать такие вещи, как SSRS / SSAS или некоторые элементы управления веб-формами, такие как ReportViewer, в Linux. - person Stefan Steiger; 04.07.2018
comment
Образ Docker microsoft / dotnet предназначен для .Net Core, который полностью отличается от старого .Net 4.x, поэтому вы не можете запускать приложение, разработанное для старого .Net на .Net Core - person j123b567; 08.01.2019
comment
Они поддерживают .NET Core и НЕ .NET - это две совершенно разные среды. - person Slavik Meltser; 10.01.2019

Мы можем запускать контейнеры Linux в Windows. Docker для Windows использует Linux-Kit на основе Hyper-v или WSL2 в качестве серверной части для упрощения работы с контейнерами Linux.

Если какой-либо дистрибутив Linux имеет такую ​​настройку, мы можем запускать контейнеры Windows. Docker для Linux поддерживает только контейнеры Linux.

person Srinivas Charan Mamidi    schedule 25.09.2020