Frage Können Sie Docker nativ auf dem neuen Bash-Userspace von Windows 10 (Ubuntu) ausführen?


Mein Verständnis war, dass die primäre Einschränkung der Ausführung von docker auf anderen Betriebssystemen die Linux-Netzwerkcontainer waren, die dies ermöglichten. (Sicherlich für Macs).

Vor kurzem Microsoft hat angekündigt eine Beta von a Ubuntu Linux Benutzermodus nativ unter Windows 10. Dies kann unter Windows im ELF-Format kompilierte Binärdateien ausführen (anders als bei cygwin, das eine Kompilierung erfordert).

Meine Frage ist: Können Sie Docker nativ auf dem neuen Bash-Userspace von Windows 10 (Ubuntu) ausführen?


121
2018-04-04 10:16


Ursprung


Es ist nicht "nur" ein bash Benutzerbereich. Es ist ein echter, ziemlich vollständiger Linux-Benutzerbereich, aber ohne X-Windows, d. H. Nur Text. Das Sagen von "bash" kommuniziert die Texteinschränkung ziemlich gut. - MSalters
Habe ich etwas verpasst? Wurde das tatsächlich verteilt? Im Moment kenne ich es nur als Vapourware. - Michael Hampton♦
Ich denke, es wird nicht klar sein, bis sie das veröffentlichen (AFAIK ist es noch nicht einmal für Windows-Insider verfügbar), aber es ist erwähnenswert, dass Microsoft und Docker daran arbeiten, Docker nativ auf Windows zu bringen, um neben Windows Server 2016 veröffentlicht zu werden - Rоry McCune
@RoryMcCune: Interessant. Jedoch, gemäß dieser Docker Blogeintrag ab August 2015 wird dies ein Port sein, der Docker laufen lässt Windows Bilder unter Windows, nicht Linux-Bilder unter Windows. - sleske
In der Tat ist das der Zweck des Windows nativen Docker. Die Art der Containerisierung besteht darin, dass Sie keine Systeme mit anderen Kerneln ausführen können, ohne eine Virtualisierung oder (möglicherweise) dieses neue Subsystem hinzuzufügen, das Microsoft entwickelt - Rоry McCune


Antworten:


Ab sofort (April 2016) lautet die Antwort:

Wir wissen noch nicht (aber wahrscheinlich nicht).

Die Fakten

  • Windows 10 kann jetzt eine Vielzahl von Linux-Programmen ausführen (ua ihnen die Bash Shell und verschiedene Text Utilities). Dies sind keine Ports (d. h. neu kompilierte Versionen, wie z. B. in Cygwin), Sie sind das Gleiche ELF-Binärdateien die auf einem typischen Linux-System laufen. Im In diesem Fall wurden sie von Ubuntu übernommen.
  • Um dies zu ermöglichen, wurde Windows 10 so geändert, dass Linux-Systemaufrufe (syscalls) akzeptiert werden und ELF-Binärdateien geladen und ausgeführt werden können (Kommentar von Scott Hanselman). Dies bedeutet, dass unmodifizierte ausführbare Linux-Dateien ausgeführt werden können. Sie laden ihre unmodifizierten, gemeinsam genutzten Bibliotheken nach Bedarf und Windows führt sie als Windows-Prozesse aus.
  • Wann immer ein solches Linux-Programm mit dem Kernel interagieren will, gibt es einen Systemaufruf aus (oder lässt eine Bibliothek dies tun). Dies ist (vermutlich) der einzige Unterschied zur Ausführung unter Linux: Unter Linux verarbeitet der Linux-Kernel diese Aufrufe; Unter Windows 10 wird dies stattdessen vom Windows 10-Kernel ausgeführt.

Die Spekulation

Die Frage ist also, ob die von Docker benötigten Syscalle (ua für Chroot und Namespaces) implementiert wurden oder nicht. Die Antwort ist, dass dies wahrscheinlich "Nein" ist. Docker erfordert ziemlich ausgeklügelte (und Linux-spezifische) Funktionen für die Prozess- und Ressourcenverwaltung sowie für die Prozessisolierung. Obwohl es wahrscheinlich möglich ist, all das unter Windows zu replizieren, wäre das eine Menge Arbeit, und da das Ziel dieser Windows-Funktion darin besteht, Linux-Userspace-Programme auszuführen, scheint es unwahrscheinlich, dass sie die ganze Arbeit erledigt haben (und sie geheim gehalten haben). .

Allerdings gibt es, soweit ich das beurteilen kann, keine endgültigen Informationen. 

Vorhandene Docker-Ports

Natürlich, wenn Microsoft entscheidet, dass sie Docker-Unterstützung in Windows 10 wollen, werden sie es wahrscheinlich anbieten können. Es gibt einige Präzedenzfälle für die Portierung von Docker auf einen anderen Kernel:

  • Da ist ein Docker-Port für FreeBSD. Es wird als "experimentell" bezeichnet, scheint aber prinzipiell zu funktionieren. Es kann unmodifizierte Docker-Container aus dem Docker-Repository verwenden, was bedeutet, dass es tatsächlich eine Linux-ähnliche Host-Umgebung für die Bilder bereitstellt.
  • Es gibt ein Projekt zur Portierung von Docker auf Windows (speziell Windows Server 2016) - siehe hierzu Docker Blogeintrag ab August 2015. Im Gegensatz zum obigen FreBSD-Port ist dies jedoch ein Port, über den Docker Windows-Images unter Windows, nicht Linux-Images unter Windows ausführen kann. Danke an Rory McCune für den Hinweis darauf.

50
2018-04-05 07:15



Update: Es gibt einen Artikel zum Thema in einem MSDN-Blog jetzt: Windows-Subsystem für Linux Überblick. - sleske
Ab heute ist es mit Hyper-V möglich: tutorials.ubuntu.com/tutorial/... - Nick Sweeting
Ich habe einfach abgelehnt, weil die höher gewählte Antwort nützlicher ist als Spekulationen darüber, was sein könnte. - James


Sie können Docker für Windows als Engine und Docker für Linux als Client in Bash unter Ubuntu unter Windows verwenden. Verbinde sie über TCP.

Installieren Sie Docker für Windows: https://docs.docker.com/docker-for-windows/ Wenn Sie Windows Containers anstelle von Linux Containern verwenden möchten, können beide Typ Container vom Linux Docker Client im Bash Userspace verwaltet werden.

Seit Version 17.03.1-ce-win12 (12058) müssen Sie überprüfen Setzen Sie den Daemon auf tcp: // localhost: 2375 ohne TLS frei Damit der Linux Docker Client weiterhin mit dem Windows Docker Daemon über TCP kommuniziert

Folge diesen Schritten:

cd
wget https://download.docker.com/linux/static/stable/x86_64/docker-18.06.1-ce.tgz
tar -xzvf docker-*.tgz
cd docker
./docker -H tcp://0.0.0.0:2375 ps

oder

env DOCKER_HOST=tcp://0.0.0.0:2375 ./docker ps

Um es dauerhaft zu machen:

mkdir ~/bin
mv ~/docker/docker ~/bin

Fügen Sie die entsprechenden Variablen zu .bashrc hinzu

export DOCKER_HOST=tcp://0.0.0.0:2375
export PATH=$PATH:~/bin

Natürlich können Sie docker-compose installieren

sudo -i
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

Oder mit Python Pip

sudo apt-get install python-pip bash-completion
sudo pip install docker-compose

Und Bash-Abschluss. Der beste Teil:

sudo -i
apt-get install bash-completion
curl -L https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker > /etc/bash_completion.d/docker
curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

Ich habe es mit der 18.06.0-ce-win59 (19098) Version von Docker für Windows mit Hyper-V getestet:

~$ docker version
Client:
 Version:           18.06.0-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        0ffa825
 Built:             Wed Jul 18 19:04:39 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.0-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       0ffa825
  Built:            Wed Jul 18 19:13:46 2018
  OS/Arch:          linux/amd64
  Experimental:     true

Schaue sowohl Client als auch Server an OS / Arch: Linux / AMD64

Volumen

Vorsicht beim Hinzufügen von Volumes. Der Weg C:\dir wird als sichtbar sein /mnt/c/dir auf WSL und als /c/dir/ von Docker Motor. Sie können es dauerhaft überwinden:

sudo bash -c "echo -e '[automount] \nroot = /'>/etc/wsl.conf"

Sie müssen WSL beenden und neu laden, nachdem Sie die Änderung in wsl.conf vorgenommen haben, sodass WSL Ihre Änderungen beim Start einliest.

AKTUALISIEREN

von: Was ist neu für die Befehlszeile in Windows 10 Version 1803

Unix-Sockets   Unix Sockets wurden unter Windows nicht unterstützt, und jetzt sind sie es! Sie können auch über Unix-Sockets zwischen Windows und WSL kommunizieren. Eine der großen Vorteile ist, dass WSL den Linux Docker Client zur Interaktion mit dem Docker Daemon unter Windows ausführen kann.

Grüße


99
2017-07-19 22:05



Hallo @ Joel-Pearson, Docker haben zwei Teile: die Engine und der Client. Die Engine läuft in Windows mit Docker Toolbox (auf der Basis von VirtualBox) oder Docker für Windows (auf der Basis von Hyper-V), die offiziell vom Docker-Team unterstützt werden. Die Docker Engine läuft noch nicht im bash Userspace. Docker-Client in Windows kann in Cmd, Powershell oder Cygwin ausgeführt werden. Diese Antwort besagt, dass der Andock-Client im Bash-Benutzerbereich ausgeführt werden muss. Warum? Persönlich bevorzuge ich Bash, die Fertigstellung funktioniert. Ich stimme zu, dass die Frage in Bezug auf Docker Engine ist, aber ich fand es, als ich nach dem Client suchte, und viele Leute machen das gleiche. - Carlos Rafael Ramirez
Ich habe es gerade getestet und es funktioniert für mich auf 1.12 :) Super aufgeregt, jetzt in der Lage zu sein, einige ernsthafte Entwicklung unter Windows zu machen. - Zach Russell
Habe deine Anweisungen in Bash unter Ubuntu unter Windows versucht, habe "Kann keine Verbindung zum Docker-Daemon herstellen. Wird der Docker-Daemon auf diesem Host ausgeführt?". Vermissen Sie einige Schritte? - mpen
Ab Februar 2017 ist dies immer noch der einzige Weg. - hdave
Nach dem Juni 2017 können Sie führe die Andockfenster für Windows ausführbare Dateien aus der Bash-Shell. Anstatt den Docker-Client zu installieren, können Sie den docker.exe direkt zum Abfragen / Interagieren des Docker Subsystems. Beachten Sie jedoch, dass das Andockfenster für Windows die Windows-Variablen und -Konfigurationen verwendet. - Jaime


Die erste Insider-Vorschau wurde gestern veröffentlicht. Ich habe versucht, docker zu installieren, schlägt aber mit folgendem fehl: docker fail

So scheint es, dass es für die erste Vorschau momentan nicht funktioniert. Wie viele Leute jedoch spekuliert haben, könnte es in einer zukünftigen Version funktionieren.


12
2018-04-07 10:29



Cool - danke fürs ausprobieren! - Hawkeye
Gute Idee, dies tatsächlich zu versuchen. Eine Sache: Könnten Sie bitte den Text des Screenshots als tatsächlichen Text hinzufügen (Ubuntu-Terminal unterstützt Copy & Paste). "Echter" Text hat zahlreiche Vorteile (einfacher zu lesen, unterstützt Screenreader, kann von Suchmaschinen gecrawlt werden) - sleske
Einiges Update: Ich konnte den Docker vollständig auf meinem Rechner installieren, auf dem das letzte Jubiläums-Update läuft. Aber a docker ps scheitert mit: Get http:///var/run/docker.sock/v1.18/containers/json: dial unix /var/run/docker.sock: setsockopt: invalid argument. Are you trying to connect to a TLS-enabled daemon without TLS? - kumar_harsh
Sieht so aus, als ob es jetzt funktioniert: tutorials.ubuntu.com/tutorial/... - Nick Sweeting


Nein das ist nicht möglich.

Docker benötigt mehrere Dinge, um Container auszuführen:

  • Chroot
  • Namespaces für:
    • PID
    • Benutzer
    • Netzwerk
    • Halterungen
    • UTS
    • IPC

Dies sind alles Kernel-Features, die in Linux implementiert sind. Leider haben die meisten von ihnen kein ähnliches Feature in Windows, das als Ersatz verwendet werden kann (auch nicht im Linux-Subsystem, das Microsoft im Windows-Kernel implementiert hat). All diese müssen vom Betriebssystem bereitgestellt werden.


11
2018-04-04 10:21



Tatsächlich hat Windows Namespaces für Benutzer, Halterungen und IPC. Benutzer-Namespaces sind für Active Directory erforderlich, Mount-Namespaces und IPC-Namespaces sind für den Mehrbenutzerbetrieb erforderlich. Grundsätzlich hat der Kernel-Objekt-Manager in Windows seit der allerersten Windows NT-Version immer Namespaces, also ist es nicht so seltsam. - MSalters
Und mit den Remotedesktopdiensten verwenden die Sitzungsobjekte diese Namespaces aktiv, um einen gleichzeitigen Betrieb bereitzustellen. Das bedeutet nicht, dass Sie die erforderliche Infrastruktur haben, aber wichtige Teile sind vorhanden. Wie für chrootBeachten Sie, dass die Ubuntu-Umgebung bereits eine andere Wurzel hat als die WIN32-Umgebung. - MSalters
Eigentlich denke ich, es ist zu früh, um so oder so zu antworten. Wie beschrieben in ein Kommentar von Scott Hanselmanakzeptiert der Windows 10-Kernel jetzt Linux-Systemaufrufe. Die Frage ist also, ob die von Docker benötigten Aufrufe (für Chroot und Namespaces) implementiert wurden oder nicht. Während die Antwort wahrscheinlich "Nein" ist, gibt es keine endgültigen Informationen, so weit ich das beurteilen kann. - sleske
@sleske hat recht, diese Frage ist im Moment nicht zu verantworten, und zu sagen "nein, das kann nicht" ohne irgendeinen Hinweis darauf, was die Devs, die an dem Linux-Space in Witwen arbeiten, tun, ist ziemlich anmaßend. - Ryan
Ich weiß nicht genug, um mit Zuversicht zu sagen, dass diese Antwort völlig falsch ist, aber die Art, wie sie formuliert wird, macht mich ein wenig skeptisch bezüglich ihrer Gültigkeit. Insbesondere die Aussage "Bash ist ein einfaches Benutzer-Space-Programm und kann keine davon bieten" und die Bezugnahme auf das Window-Subsystem für Linux als "das neue Bash-Feature" macht es so, als ob diese Antwort auf der völlig falschen Annahme beruht, dass Microsoft alles getan hat war Port Bash zu Windows. Das ist nicht passiert. Sie entwickelten eine vollständige Linux-Kernel-Oberfläche, die auf dem Windows-Kernel lief: msdn.microsoft.com/en-us/commandline/wsl/about - Ajedi32


Ab dem Entwickleraktualisierung (veröffentlicht am 13. Juni 2017) Sie können native Windows-Programmdateien direkt in WSL ausführen. Dies bedeutet, wenn Sie bereits installiert haben Docker für Windows Sie können einfach die aufrufen docker Binärdateien installiert unter C:\Program Files. Da sie enden .exe Die einfachste Möglichkeit besteht darin, Aliase zu erstellen. Etwas wie das folgende in deinem .bashrc sollte arbeiten:

DOCKER_BIN='/mnt/c/Program Files/Docker/Docker/resources/bin'
for f in "$DOCKER_BIN"/*; do
  alias "$(basename "$f" | sed 's/.exe$//')"'="'"$f"'"'
done

Dies erzeugt Aliase für alle Dateien in der DOCKER_BINVerzeichnis:

$ type docker
docker is aliased to `"/mnt/c/Program Files/Docker/Docker/resources/bin/docker.exe"'

$ docker --version
Docker version 17.03.1-ce, build c6d412e

Ein Vorbehalt: Sie erhalten eine Fehlermeldung wie "Das aktuelle Arbeitsverzeichnis konnte nicht übersetzt werden"wenn aus einem Linux-Verzeichnis ausgeführt wird. Just cd in ein Windows-Verzeichnis (z.B. /mnt/c/Users/YourUsername) und du solltest gut sein.


6
2018-06-22 06:02



Dies scheint bash-Umgebungsvariablen nicht in docker-compose YML-Dateien aufzunehmen. Irgendeine Idee dafür? - Rüdiger Schulz
Das ist sinnvoll, da Sie Windows aufrufen docker binär und tun dies nur durch die Linux-Shell. Ich bin mir nicht sicher, ob es einen guten Weg gibt, das zu erreichen. - dimo414


Sobald Docker 1.12 freigegeben ist und der Linux Docker Client getrennt ist, sollten Sie das Andockfenster ausführen können Klient in Windows 10 bash.

Wenn Sie einen Docker Windows-Client haben, klingt das vielleicht nicht nach viel, aber es ist nützlich, wenn Sie Linux-Toolchains mit Docker für die clientseitige Funktionalität haben.


5
2018-04-29 09:31





In Windows 10 Version 1607 Build 1493.10 können Sie es erfolgreich unter Ubuntu Bash installieren, aber es funktioniert nicht :(

Eine einfache "Docker-Version" wird Ihnen sagen:

Client version: 1.6.2
Client API version: 1.18
Go version (client): go1.2.1
Git commit (client): 7c8fca2
OS/Arch (client): linux/amd64
FATA[0000] Get http:///var/run/docker.sock/v1.18/version: dial unix /var/run/docker.sock: setsockopt: invalid argument. Are you trying to connect to a TLS-enabled daemon without TLS?

Wenn Sie dann "sudo docker -d" ausführen, erhalten Sie folgende Fehlermeldung:

FATA[0000] ERROR: You are running Linux kernel version 3.4.0+, which is unsupported for running Docker. Please upgrade your kernel to 3.8+.

Das ist definitiv ein Stopper von der Bash-Seite.

Trotzdem können Sie installieren Docker für Windows und es funktioniert wie ein Zauber, Sie können offensichtlich Linux-Server und alles, was Sie brauchen, bereitstellen.

> docker version
Client:
 Version:      1.12.0
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   8eab29e
 Built:        Thu Jul 28 21:15:28 2016
 OS/Arch:      windows/amd64

Server:
 Version:      1.12.0
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   8eab29e
 Built:        Thu Jul 28 21:15:28 2016
 OS/Arch:      linux/amd64

3
2017-08-12 21:38





Ab September 2016, Nein.

Alle aktuellen Implementierungen von Docker unter Windows nutzen die Virtualisierung, Docker 1.12 verwendet einen Hypervisor in Windows - damit entfällt der Vorteil der Containerisierung gegenüber der Virtualisierung.

Docker benötigt mehr als nur Linux-Systemaufrufe.

Es benötigt Prozesskontrollgruppen (cgroups), ein stapelbares Dateisystem (aufs) sowie andere Linux-basierte Systeme außerhalb des Kernels.

Weder cgroups noch aufs befinden sich nativ im Windows 10-Kernel.

Es gibt eine Implementierung von Windows Server 2016 hier: https://msdn.microsoft.com/en-gb/virtualization/windowscontainers/quick_start/quick_start_windows_server ..aber das wird nur einige Windows-Dienste, z. IIS und nicht Ubuntu


2
2017-09-05 13:15