Können Windows-Container unter Linux gehostet werden?


238

Ist es möglich, Windows Container unter Linux auszuführen ? Das Szenario basiert auf einer in .NET (altes Netz) geschriebenen App und dem Linux-Benutzer , der dies mit Docker ausführen möchte, um eine net462geschriebene API auf dem .NET bereitzustellen localhost.

Ich verwende die Beta-Version von Docker Desktop für Windows

Wenn nein, warum kann Windows dann Linux-Container ausführen und nicht umgekehrt?

BEARBEITEN:

Da ist einige Zeit vergangen und diese Frage ist eine beliebte. Ich möchte hier einen Hinweis hinzufügen, dass die Problemumgehung darin besteht, den neuen Netzstandard zu verwenden. Dadurch konnte ich das 4.6.2Framework in eine neue Bibliothek packen .


4
Nicht möglich - Zum Erstellen und Ausführen von Windows-Containern ist ein Windows-System mit Containerunterstützung erforderlich.
Ajtrichards

5
Ok, aber warum kann Windows dann Linux-Container ausführen? Es gibt vorerst kein Umgekehrtes?
Sebastian 506563

10
@ Sebastian506563, weil Docker die VirtualBox-Virtualisierung hinter den Kulissen ausführt, damit Linux-Container unter Windows ausgeführt werden können. Ich würde theoretisch vermuten, dass es auch andersherum möglich sein wird, nur Docker hat es nicht implementiert.
Gregory Suvalian

5
Bei VMs hat jede VM ein eigenes Betriebssystem. Bei Containern gibt es ein Basis-Betriebssystem-Image und jeder Container fügt eine neue dünne Schicht über der Basis hinzu. In Docker basiert dieses Basisbetriebssystem auf Linux. Das heißt, Ihr Windows-Container kann die Basis nicht verwenden, da sie anders ist. blog.risingstack.com/…
xen-dara

3
@PanagiotisKanavos bitte verfassen Antwort
Sebastian 506563

Antworten:


162

Update3: 06.2019 Einige Kommentare besagen, dass die Antwort nicht klar ist, ich werde versuchen zu klären.

TL; DR:

F: Können Windows-Container unter Linux ausgeführt werden?

A: Nein. Sie können nicht. Container verwenden die zugrunde liegenden Betriebssystemressourcen und -treiber, sodass Windows-Container nur unter Windows und Linux-Container nur unter Linux ausgeführt werden können.

F: Aber was ist mit Docker für Windows? Oder andere VM-basierte Lösungen?

A: Mit Docker für Windows können Sie das Ausführen von Linux- Containern unter Windows simulieren. Unter der Haube wird jedoch eine Linux-VM erstellt, sodass weiterhin Linux-Container unter Linux und Windows-Container unter Windows ausgeführt werden .

Bonus: Lesen Sie diesen sehr schönen Artikel über das Ausführen von Linux-Docker-Containern unter Windows.

F: Was soll ich mit einer .Net Framework 462-App tun, wenn ich in einem Container ausgeführt werden möchte?

A: Es kommt darauf an. Folgende mehrere Empfehlungen:

  • Wenn es möglich ist, wechseln Sie zu .Net Core. Da .Net Core die meisten wichtigen Funktionen von .Net Framework unterstützt und .Net Framework 4.8 die letzte Version von .Net Framework sein wird
  • Wenn Sie nicht auf .Net Core migrieren können - wie bei @Sebastian erwähnt - können Sie Ihre Bibliotheken in .Net Standard konvertieren und haben zwei Versionen der App - eine auf .Net Framework 4.6.2 und eine auf .Net Core - dies ist nicht der Fall Visual Studio unterstützt es immer ziemlich gut (mit Multi-Targeting), aber einige Abhängigkeiten können besondere Sorgfalt erfordern.

  • (Weniger empfohlen) In einigen Fällen können Sie Windows-Container ausführen. Windows-Container werden immer ausgereifter und unterstützen Plattformen wie Kubernetes besser. Um jedoch .NET Framework-Code ausführen zu können, müssen Sie weiterhin das Basis-Image von "Server Core" ausführen, das etwa 1,4 GB belegt. In den gleichen seltenen Fällen können Sie Ihren Code auf .Net Core migrieren, aber dennoch auf Windows Nano-Servern mit einer Image-Größe von 95 MB ausführen.

Lassen Sie auch die alten Updates für die Geschichte

Update2: 08.2018 Wenn Sie Docker-for-Windows verwenden, können Sie jetzt sowohl Windows- als auch Linux-Container gleichzeitig ausführen: https://blogs.msdn.microsoft.com/premier_developer/2018/04/20/running-docker-windows- und-Linux-Container-gleichzeitig /

Bonus: Nicht direkt mit der Frage verbunden, aber Sie können jetzt nicht nur den Linux-Container selbst ausführen, sondern auch Orchestrator wie kubernetes: https://blog.docker.com/2018/07/kubernetes-is-now-available-in -docker-desktop-stabile-kanal /

Aktualisiert um 2018:

Die ursprüngliche Antwort im Allgemeinen ist richtig, ABER vor einigen Monaten hat Docker das experimentelle Feature LCOW ( offizielles Github-Repository ) hinzugefügt .

Aus diesem Beitrag :

Läuft Docker für Windows nicht bereits Linux-Container? Das stimmt. Docker für Windows kann Linux- oder Windows-Container ausführen und Linux-Container über eine Hyper-V Moby Linux-VM unterstützen (ab Docker für Windows 17.10 basiert diese VM auf LinuxKit).

Das Setup zum Ausführen von Linux-Containern mit LCOW ist viel einfacher als die vorherige Architektur, in der auf einer Hyper-V-Linux-VM ein Linux Docker-Daemon zusammen mit all Ihren Containern ausgeführt wird. Mit LCOW wird der Docker-Dämon als Windows-Prozess ausgeführt (wie beim Ausführen von Docker-Windows-Containern). Jedes Mal, wenn Sie einen Linux-Container starten, startet Docker einen minimalen Hyper-V-Hypervisor, auf dem eine VM mit einem Linux-Kernel, runc und den Containerprozessen ausgeführt wird oben laufen.

Da es nur einen Docker-Daemon gibt und dieser Daemon jetzt unter Windows ausgeführt wird, können Windows- und Linux-Docker-Container bald nebeneinander im selben Netzwerk-Namespace ausgeführt werden . Dadurch werden viele aufregende Entwicklungs- und Produktionsszenarien für Docker-Benutzer unter Windows freigeschaltet.

Original:

Wie in den Kommentaren von @PanagiotisKanavos erwähnt, sind Container nicht für die Virtualisierung vorgesehen und verwenden die Ressourcen des Hostcomputers . Daher kann der Windows-Container derzeit nicht "wie besehen" auf einem Linux-Computer ausgeführt werden.

Aber - Sie können es mit VM tun - wie es unter Windows funktioniert. Sie können Windows VM auf Ihrem Linux-Host installieren, um Windows-Container ausführen zu können.

Damit wird es meiner Meinung nach nicht die beste Idee sein, es auf diese Weise in einer PROD-Umgebung auszuführen.

Auch diese Antwort liefert weitere Details.


12
Die verknüpfte Antwort enthält keine Details dazu - sie erklärt lediglich, wie Linux-Container unter Windows ausgeführt werden (umgekehrt). Es ist möglich, Docker in einer Windows-VM auszuführen, dafür benötigen Sie jedoch Unterstützung für verschachtelte Virtualisierung. Dies bedeutet, dass es mit VMware funktioniert, nicht jedoch mit Virtualbox.
Ralf

3
Viele Wörter in der Antwort, aber es scheint die Frage nicht zu beantworten.
Kyberias

2
Es ist keine Antwort auf die Frage. Es sollte nicht so hoch eingestuft werden
Amorphous

2
Dies ist KEINE Antwort auf diese Frage. Das Ausführen von Docker unter Linux unterscheidet sich MARKEDLY vom Ausführen von Docker unter Windows. Warum ist dies als Antwort markiert? \
Ani

Container = Effizientes Ausführen diff isolierter Apps (die für ein bestimmtes Betriebssystem erstellt wurden), weniger Speicher, Speicherplatz, Overhead, effizientere Hardwareauslastung VMs = Anwendungsfall. Führen Sie ganze Betriebssysteme für verschiedene Anwendungsfälle aus. Die Hardwareauslastung ist gut (Ich muss nicht für jedes Betriebssystem eine Diff-Maschine kaufen, wenn ich tatsächlich mehrere Betriebssysteme für meinen Anwendungsfall benötige), aber die harte Auslastung ist im Vergleich zu Containern nicht so groß. Tolles Video von CTO von Joyent: youtube.com/watch?v=coFIEH3vXPw
Cacoder

16

Nein, Sie können Windows-Container nicht direkt unter Linux ausführen.

Sie können Linux jedoch unter Windows ausführen.

Windows Server / 10 wird mit einem Basis-Image des Ubuntu-Betriebssystems geliefert ( nach dem Beta-Service-Pack vom September 2016 ). Das ist der Grund, warum Sie Linux unter Windows ausführen können und nicht anders. Hier geht es zur Sache. https://thenewstack.io/finally-linux-containers-really-will-run-windows-linuxkit/

Sie können zwischen Betriebssystemcontainern Linux und Windows wechseln, indem Sie mit der rechten Maustaste auf das Docker-Menü in der Taskleiste klicken.

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein


13
Das OP versucht stattdessen, Windows-Container auf Linux-Servern auszuführen, daher beantwortet dieser die Frage nicht. Aber ich mag keine Leute, die ohne Kommentar eine Gegenstimme abgeben, also gebe ich eine Gegenstimme
Gänseblümchen

1
@Karthikeyan V: Weil es keine Antwort auf die Frage ist.
Stefan Steiger

Ich bin nicht sicher, was es vorher gesagt hat, aber die erste Aussage sagt, dass Sie nicht können und die zweite sagt, dass Sie können. Es ist wahrscheinlich ein Mangel oder etwas, das verwirrend ist.
StingyJack

9

Im Gegensatz zur Virtualisierung verwendet die Containerisierung dasselbe Host-Betriebssystem. Der unter Linux erstellte Container kann also nicht unter Windows ausgeführt werden und umgekehrt.

In Windows müssen Sie die Virtuallisierung (mit Hyper-v) in Anspruch nehmen, um dasselbe Betriebssystem wie das Betriebssystem Ihrer Container zu haben, und dann sollten Sie in der Lage sein, dasselbe auszuführen.

Docker für Windows ist eine ähnliche App, die auf Hyper-v basiert und beim Ausführen des Linux Docker-Containers unter Windows hilft. Aber soweit ich weiß, gibt es nichts, was dazu beiträgt, Windows-Container unter Linux auszuführen.


9

Container verwenden den Betriebssystemkern. Windows Container verwendet Prozesse, um ausgeführt zu werden. Theoretisch können Windows-Container also nicht unter Linux ausgeführt werden.

Es gibt jedoch Problemumgehungen, bei denen VMstyle-Lösungen verwendet werden.

Ich habe diese Lösung gefunden, die Vagrant und Packer auf dem Mac verwendet, daher sollte sie auch unter Linux funktionieren: https://github.com/StefanScherer/windows-docker-machine

Diese Vagrant-Umgebung erstellt eine Docker-Maschine, die mit Windows-Containern auf Ihrem MacBook funktioniert. Sie können problemlos zwischen Docker für Mac Linux-Containern und Windows-Containern wechseln.

Bash-Befehle ausführen Geben Sie hier die Bildbeschreibung ein

Bau der kopflosen Vagrant-Box

$ 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

Erstellen Sie die Docker-Maschine

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

Wechseln Sie zu Windows-Containern

$ eval $(docker-machine env 2019)

7

Lösung 1 - Verwenden von VirtualBox

Wie Muhammad Sahputra in diesem Beitrag vorgeschlagen hat , ist es möglich, das Windows-Betriebssystem in VirtualBox (mit VBoxHeadless - ohne grafische Oberfläche) im Docker-Container auszuführen .

Ein NAT-Setup in den VM-Netzwerkkonfigurationen kann auch eine Portweiterleitung durchführen, mit der Sie den gesamten Datenverkehr zum und vom Docker-Container weiterleiten können. Auf diese Weise können Sie in einer weiten Perspektive jeden Windows-basierten Dienst auf einem Linux-Computer ausführen.

Vielleicht ist dies kein typischer Anwendungsfall eines Docker-Containers, aber es ist definitiv eine interessante Herangehensweise an das Problem.


Lösung 2 - Verwenden von Wein

Für einfache und möglicherweise kompliziertere Anwendungen können Sie versuchen, Wein in einem Docker-Container zu verwenden .

Diese Docker-Hub-Seite kann Ihnen helfen, Ihr Ziel zu erreichen.


Ich hoffe, dass Docker bald eine native Lösung veröffentlicht, wie sie es vor einigen Jahren mit Docker-Machine unter Windows getan haben.


6

Sie können Windows-Container in einer virtuellen Maschine verwenden (das Gastbetriebssystem sollte den Anforderungen entsprechen - Windows 10 Pro oder Windows 2016).

Sie können beispielsweise VirtualBox verwenden . Aktivieren Sie einfach Hyper-V in der System- / Beschleunigungs- / Paravirtualisierungsschnittstelle.

Wenn Docker danach aufgrund eines Fehlers nicht gestartet wird, verwenden Sie in den Einstellungen "Zu Windows-Containern wechseln ...".

(Dies könnte als Kommentar zur akzeptierten Antwort verschoben werden, aber ich habe nicht genug Ruf, um dies zu tun.)


3

Während Docker für Windows Linux-Container perfekt ausführen kann, ist das Gegenteil, obwohl theoretisch möglich, aus praktischen Gründen nicht implementiert.

Das offensichtlichste ist, dass Docker für Windows zwar eine Linux-VM frei ausführen kann, Docker für Linux jedoch eine Windows-Lizenz benötigt, um sie in einer VM auszuführen.

Außerdem ist Linux vollständig anpassbar, sodass die von Docker für Windows verwendete Linux-VM auf wenige MB reduziert wurde und nur das für die Ausführung der Container erforderliche Minimum enthält, während die kleinste verfügbare Windows-Distribution etwa 1,5 GB beträgt. Es ist vielleicht keine undurchführbare Größe, aber es ist viel umständlicher als das Gegenstück zu Linux unter Windows.

Zwar ist es sicherlich möglich, dass jemand eine Docker für Linux-Variante verkauft, die mit einer Windows-Lizenz gebündelt und bereit ist, Windows-Container unter Linux auszuführen (und ich weiß nicht, ob ein solches Produkt vorhanden ist), aber unter dem Strich können Sie dies nicht vermeiden Bezahlen des Windows-Anbietersperrpreises: sowohl in Geld als auch in Speicherplatz.


0

Sie können MSSQL und .NET Core heutzutage unter Linux und damit in Linux-Containern ausführen.

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

Außerdem: https://hub.docker.com/r/microsoft/dotnet/

Die direkte Frage zu Ihrer Antwort lautet natürlich, es sei denn, es gibt eine speziell für Linux kompilierte Version, nein.


3
Das ist wahr - aber es hat nichts mit der Frage zu tun. Außerdem ist MS-SQL mehr als nur die Engine (die unter Linux übrigens ohne Filestream oder R auskommt - es ist also nicht einmal die gesamte Engine).
Stefan Steiger

Sie müssen einen Schritt voraus denken ... warum fragt er? Wenn er fragt, weil er eines davon leiten will: voila.
Dagelf

2
Möglich. Aber meiner Meinung nach stellt er die Frage wahrscheinlich, weil er das bereits getan hat, und jetzt muss er Dinge wie SSRS / SSAS oder ein Webformular-Steuerelement wie ReportViewer unter Linux ausführen.
Stefan Steiger

Docker Image Microsoft / Dotnet ist für .Net Core, was etwas völlig anderes als altes .Net 4.x ist, so dass Sie keine App ausführen können, die für altes .Net auf .Net Core entwickelt wurde
j123b567

3
Sie unterstützen .NET Coreund NICHT .NET - dies sind zwei völlig unterschiedliche Umgebungen.
Slavik Meltser

-1

Windows-Container laufen nicht unter Linux und Sie können Linux-Container auch nicht direkt unter Windows ausführen.


6
Können Sie etwas näher darauf eingehen?
Matthieu

18
Sie können Linux-Container auf Win 10
Kugel

2
Ich habe diesen Typen gewählt, da ich denke, dass es damals wahr war. Sie können jetzt jedoch Linux-Container in Docker unter Windows ausführen (Docker wird in einer VM namens MobyLinux ausgeführt).
JakeJ

Tatsächlich führt Windows eine winzige Linux-VM aus, um Linux-Container auszuführen. Überprüfen Sie Ihre Hyper-V-Ressourcen, um sie zu sehen
Tuğrul Karakaya
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.