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

239

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

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

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

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

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

Себастьян 506563
источник
4
Невозможно - для создания и запуска контейнеров Windows требуется система Windows с поддержкой контейнеров.
ajtrichards
5
Хорошо, но почему тогда Windows может запускать контейнеры Linux? Пока нет наоборот?
Себастьян 506563,
10
@ Sebastian506563, потому что докер запускает виртуализацию VirtualBox за кулисами, чтобы заставить контейнеры Linux работать в Windows. Я бы предположил, что теоретически это будет возможно и другим способом, просто докер не реализовал это.
Григорий Сувалиан,
5
С виртуальными машинами каждый виртуальный компьютер имеет свою собственную операционную систему. Для контейнеров существует образ базовой ОС, и каждый контейнер добавляет новый тонкий слой поверх базы. В докере это базовая ОС на основе Linux. т. е. ваш контейнер Windows не может использовать базу, поскольку он отличается. blog.risingstack.com/...
Xen-Дар
3
@PanagiotisKanavos, пожалуйста, сочините ответ
Себастьян 506563

Ответы:

162

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

TL; DR:

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

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

Q: Но как насчет Docker для Windows? Или другие решения на базе VM?

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

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

Q: Итак, что мне делать с приложением .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- и-Linux-контейнеры-одновременно /

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

Обновлено в 2018 году:

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

Из этого поста :

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

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

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

Оригинал:

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

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

С этим, IMHO, запустить его таким образом в среде PROD не будет лучшей идеей.

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

evgenyl
источник
12
Связанный ответ на самом деле не дает никаких подробностей по этому поводу - он просто объясняет, как запускать контейнеры Linux в Windows (обратное). Можно запустить Docker внутри виртуальной машины Windows, но для этого вам нужна поддержка вложенной виртуализации. Это означает, что он работает с VMware, но не с Virtualbox.
Ральф
3
Много слов в ответе, но, похоже, он не отвечает на вопрос.
Киберия
2
Это не ответ на вопрос. Это не должно быть так высоко
Аморфное
2
Это НЕ ответ на этот вопрос. Запуск docker в Linux МАРКИННО отличается от запуска docker в Windows. Почему это помечено как ответ? \
Ани
Контейнеры = эффективно запускать разрозненно изолированные приложения (которые были созданы для конкретной ОС), меньше памяти, дискового пространства, служебных данных, более эффективное использование оборудования. (Мне не нужно покупать машину сравнения для каждой ОС ... если мне действительно нужно несколько ОС для моего случая использования), но интенсивное использование не так велико по сравнению с контейнерами. Отличное видео от технического директора Joyent: youtube.com/watch?v=coFIEH3vXPw
cacoder
16

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

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

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

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

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

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

Картикеян В.К.
источник
13
ОП ищет запускать контейнеры Windows на серверах Linux, поэтому этот не отвечает на вопрос. Но мне не нравятся люди, которые дают отрицательное голосование без комментариев, поэтому я даю положительный ответ
маргаритка
1
@ Karthikeyan V: Потому что это не ответ на вопрос.
Стефан Штайгер
Я не уверен, что было сказано раньше, но в первом утверждении говорится, что вы не можете, а во втором - вы можете. Это вероятно отсутствует или что-то, что сбивает с толку.
StingyJack
9

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

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

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

Сунил Бхардвадж
источник
9

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

Однако есть обходные пути, использующие решения VMstyle.

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

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

Запуск команд bash введите описание изображения здесь

строит безголовый бродячий ящик

$ 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)
обходной путь
источник
7

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

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

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

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


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

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

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


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

Славик Мельцер
источник
6

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

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

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

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

BalintPogatsa
источник
3

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

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

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

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

lvella
источник
0

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

Видеть: https://hub.docker.com/r/microsoft/mssql-server-linux/

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

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

dagelf
источник
3
Это правда - но это не имеет ничего общего с вопросом. Кроме того, MS-SQL - это больше, чем просто движок (который, кстати, в Linux поставляется без файлового потока или R - так что это даже не весь движок).
Стефан Штайгер
Вы должны думать на шаг впереди ... почему он спрашивает? Если он спрашивает, потому что он хочет запустить один из них: вуаля.
Dagelf
2
Возможно. Но ИМХО, он, вероятно, задает вопрос, потому что он уже сделал это, и теперь он должен запустить такие вещи, как SSRS / SSAS или какой-либо элемент управления веб-формы, такой как ReportViewer, в Linux.
Стефан Штайгер
Образ докера microsoft / dotnet для .Net Core, который полностью отличается от старого .Net 4.x, поэтому вы не можете запустить приложение, разработанное для старого .Net в .Net Core
j123b567
3
Они поддерживают, .NET Coreа НЕ .NET - это две совершенно разные среды.
Славик Мельцер
-1

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

Ehsan
источник
6
Можете ли вы уточнить немного?
Матье
18
Вы можете запускать контейнеры Linux на win 10
Kugel
2
Я проголосовал за этого парня, так как я думаю, что это было правдой в то время. Однако теперь вы можете запускать контейнеры Linux в Docker под Windows (Docker работает на виртуальной машине с именем MobyLinux).
JakeJ
В действительности Windows запускает крошечную виртуальную машину Linux для запуска контейнеров Linux. проверьте свои ресурсы Hyper-V, чтобы увидеть его
Tuğrul Karakaya