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

126

Mein Verständnis war, dass die hauptsächliche Einschränkung beim Ausführen von Docker auf anderen Betriebssystemen die Linux-Netzwerkcontainer waren, die dies ermöglichten. (Auf jeden Fall für Macs).

Kürzlich hat Microsoft eine Beta- Version eines Ubuntu- Linux- Benutzermodus angekündigt , der nativ unter Windows 10 ausgeführt wird. Damit können unter Windows im ELF-Format kompilierte Binärdateien ausgeführt werden (im Gegensatz zu Cygwin, für das eine Kompilierung erforderlich ist).

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

Falkenauge
quelle
4
Es ist nicht "nur" ein bashUserspace. Es ist ein echter, ziemlich vollständiger Linux-Benutzerbereich, aber ohne X-Windows, dh nur Text. Wenn Sie "bash" sagen, wird die Beschränkung nur auf Text sehr gut kommuniziert.
MSalters,
Habe ich etwas verpasst? Wurde das tatsächlich verteilt? Im Moment kenne ich es nur als Vaporware.
Michael Hampton
2
Ich denke, es wird nicht klar sein, bis sie dies veröffentlichen (AFAIK gibt es noch nicht einmal für Windows-Insider). Es ist jedoch erwähnenswert, dass Microsoft und Docker daran arbeiten, Docker nativ auf Windows zu bringen, um gemeinsam mit Windows Server 2016
R®ry veröffentlicht zu werden McCune
1
@ RоryMcCune: Interessant. Laut diesem Docker-Blogeintrag vom August 2015 ist dies jedoch ein Port, mit dem Docker Windows- Abbilder unter Windows ausführen kann, nicht Linux-Abbilder unter Windows.
Sleske
2
In der Tat ist dies der Zweck des nativen Windows Dockers. Die Art der Containerisierung ist, dass Sie keine Systeme mit anderen Kerneln ausführen können, ohne eine gewisse Virtualisierung oder (möglicherweise) dieses neue Subsystem, das Microsoft entwickelt,
hinzuzufügen

Antworten:

103

Sie können Docker Desktop für Windows als Engine und Docker für Linux als Client in WSL unter Ubuntu / Debian unter Windows verwenden. Verbinden Sie sie über TCP.

Installieren Sie Docker Desktop für Windows: https://hub.docker.com/editions/community/docker-ce-desktop-windows Wenn Sie Windows-Container anstelle von Linux-Containern verwenden möchten, können beide Container vom Linux-Docker-Client in verwaltet werden der bash benutzerraum.

Seit Version 17.03.1-ce-win12 (12058) müssen Sie Expose-Dämon unter tcp: // localhost: 2375 ohne TLS aktivieren , damit der Linux Docker-Client weiterhin über TCP mit dem Windows Docker-Dämon kommunizieren kann

Folge diesen Schritten:

cd
wget https://download.docker.com/linux/static/stable/`uname -m`/docker-19.03.1.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.24.1/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-Vervollständigung. 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 Version 2.1.0.1 (37199) von Docker Desktop unter Verwendung von Hyper-V getestet:

$ docker version
Client: Docker Engine - Community
 Version:           19.03.1
 API version:       1.40
 Go version:        go1.12.5
 Git commit:        74b1e89e8a
 Built:             Thu Jul 25 21:17:37 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.1
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.5
  Git commit:       74b1e89
  Built:            Thu Jul 25 21:17:52 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.6
  GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb
 runc:
  Version:          1.0.0-rc8
  GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
Look both client and server say **OS/Arch: linux/amd64**

Bände

Seien Sie vorsichtig, wenn Sie Volumes hinzufügen. Der Pfad C:\dirwird sowohl /mnt/c/dirin der WSL als auch in /c/dir/der Docker-Engine angezeigt. 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 an wsl.conf vorgenommen haben, damit WSL Ihre Änderungen beim Start einliest.

AKTUALISIEREN

from: Was ist neu in der 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. Eines der großartigen Dinge dabei ist, dass WSL den Linux Docker Client ausführen kann, um mit dem Docker Daemon unter Windows zu interagieren.

AKTUALISIEREN

Dieses Skript und die Verwendung von Unix Sockets waren in Pengwins Pengwin-Setup enthalten.

Grüße

Carlos Rafael Ramirez
quelle
3
Hallo @ Joel-Pearson, Docker haben zwei Teile: die Engine und den Client. Die Engine wird unter Windows mit Docker Toolbox (VirtualBox-basiert) oder Docker für Windows (Hyper-V-basiert) ausgeführt, die beide offiziell vom Docker-Team unterstützt werden. Die Docker-Engine läuft noch nicht im Bash-User-Space. Docker-Client in Windows kann in cmd, Powershell oder Cygwin ausgeführt werden. Mit dieser Antwort können Sie den Docker-Client im Bash-Benutzerbereich ausführen. Warum? Ich persönlich bevorzuge bash, die Vervollständigung funktioniert. Ich bin damit einverstanden, dass die Frage sich auf Docker Engine bezieht, aber ich habe sie gefunden, als ich nach dem Kunden gesucht habe, und viele Leute tun dasselbe.
Carlos Rafael Ramirez
1
Ich habe es gerade getestet und es funktioniert für mich am 1.12.
Zach Russell
2
Versuchte Ihre Anweisungen in Bash unter Ubuntu unter Windows, bekam "Kann keine Verbindung zum Docker-Daemon herstellen. Läuft der Docker-Daemon auf diesem Host?". Vermissen Sie einige Schritte?
9.
5
Ab Februar 2017 ist dies immer noch der einzige Weg.
Hdave
3
Nach Juni 2017 können Sie den Docker für ausführbare Windows- Dateien über die Bash-Shell ausführen . Anstatt den Docker-Client zu installieren, können Sie docker.exedas Docker-Subsystem mit direkt abfragen / interagieren. Beachten Sie jedoch, dass der Docker für Windows die Windows-Variablen und -Konfigurationen verwendet.
Jaime
51

Ab sofort (April 2016) lautet die Antwort:

Wir wissen es noch nicht (aber wahrscheinlich nicht).

Die Fakten

  • Windows 10 kann jetzt eine Vielzahl von Linux-Programmen ausführen (darunter die Bash-Shell und verschiedene Textdienstprogramme). Dies sind keine Ports (dh neu kompilierte Versionen, wie zum Beispiel in Cygwin ), sondern dieselben ELF-Binärdateien , die auf einem typischen Linux-System ausgeführt werden. In diesem Fall wurden sie aus Ubuntu übernommen.
  • Um dies zu ermöglichen, wurde Windows 10 so modifiziert, dass es Linux-Systemaufrufe (Syscalls) akzeptiert und ELF-Binärdateien laden und ausführen kann ( Kommentar von Scott Hanselman ). Dies bedeutet, dass unveränderte ausführbare Linux-Dateien ausgeführt werden können. Sie laden ihre unveränderten gemeinsam genutzten Bibliotheken nach Bedarf und Windows führt sie als Windows-Prozesse aus.
  • Wenn ein solches Linux-Programm mit dem Kernel interagieren möchte, 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 Systemaufrufe (unter anderem für Chroot und Namespaces) implementiert wurden oder nicht. Die Antwort ist wahrscheinlich "nein". Docker erfordert ziemlich ausgefeilte (und Linux-spezifische) Funktionen für das Prozess- und Ressourcenmanagement und die Prozessisolierung. Obwohl es wahrscheinlich möglich ist, all dies unter Windows zu replizieren, wäre dies eine Menge Arbeit, und da das Ziel dieser Windows-Funktion darin zu bestehen scheint, Linux-Userspace-Programme auszuführen, ist es unwahrscheinlich, dass sie die ganze Arbeit erledigt haben (und sie geheim gehalten haben). .

Soweit ich das beurteilen kann, gibt es jedoch keine endgültigen Informationen.

Bestehende Docker-Ports

Wenn Microsoft entscheidet, dass Docker in Windows 10 unterstützt werden soll, können sie dies wahrscheinlich anbieten. Es gibt einige Präzedenzfälle, um Docker auf einen anderen Kernel zu portieren:

  • Es gibt einen Docker-Port für FreeBSD . Es wird als "experimentell" bezeichnet, scheint aber im Prinzip zu funktionieren. Es kann unveränderte Docker-Container aus dem Docker-Repository verwenden, was bedeutet, dass es tatsächlich eine Linux-ähnliche Host-Umgebung für die Images bereitstellt.
  • Derzeit läuft ein Projekt für die Portierung von Docker auf Windows (insbesondere Windows Server 2016) - siehe diesen Docker-Blogeintrag vom August 2015. Im Gegensatz zum obigen FreBSD-Port ist dies jedoch ein Port, mit dem Docker Windows-Images unter Windows ausführen kann. keine Linux-Images unter Windows. Vielen Dank an Róry McCune für den Hinweis.
sleske
quelle
1
Update: Es gibt jetzt einen Artikel zum Thema in einem MSDN-Blog: Windows-Subsystem für Linux - Übersicht .
Sleske
Ab heute ist es mit Hyper-V möglich: tutorials.ubuntu.com/tutorial/…
Nick Sweeting
Ich habe einfach herabgestimmt, weil die höher gestimmte Antwort nützlicher ist als die Spekulation darüber, was möglicherweise ist, sie deckt das ab, was ist.
James
13

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

Es scheint also, dass es für die erste Vorschau derzeit nicht funktioniert. Wie viele Leute auch spekuliert haben, es könnte in einer zukünftigen Version funktionieren.

CodedBeard
quelle
5
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, durchsuchbar durch Suchmaschinen)
sleske
Einige Updates: Ich konnte docker vollständig auf meinem Computer installieren, auf dem das letzte Jubiläumsupdate ausgeführt wurde. Aber ein docker psGet 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?
Fehler
Sieht so aus, als ob es jetzt funktioniert: tutorials.ubuntu.com/tutorial/…
Nick Sweeting
13

Nein das ist nicht möglich.

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

  • Chroot
  • Namensräume für:
    • PID
    • Benutzer
    • Netzwerk
    • Anschlüsse
    • UTS
    • IPC

Dies sind alles Kernel-Funktionen, die in Linux implementiert sind. Leider verfügen die meisten von ihnen nicht über eine ähnliche Funktion in Windows, die als Ersatz verwendet werden kann (und auch nicht in dem Linux-Subsystem, das Microsoft im Windows-Kernel implementiert hat). All dies muss vom Betriebssystem bereitgestellt werden.

Florin Asăvoaie
quelle
4
Tatsächlich verfügt Windows über Namespaces für Benutzer, Bereitstellungen und IPC. Benutzer-Namespaces sind für Active Directory erforderlich, Mount-Namespaces und IPC-Namespaces für den Mehrbenutzerbetrieb. Grundsätzlich hatte der Kernel-Objekt-Manager in Windows seit der ersten Windows NT-Version immer Namespaces, daher ist das nicht so seltsam.
MSalters
3
Bei Remotedesktopdiensten verwenden die Sitzungsobjekte diese Namespaces aktiv, um einen gleichzeitigen Betrieb zu ermöglichen. Das bedeutet nicht, dass Sie über die gesamte erforderliche Infrastruktur verfügen, aber große Teile sind vorhanden. Was chroot, erkennt bereits , dass die Ubuntu - Umgebung eine andere Wurzel als der WIN32 man hat.
MSalters
6
Eigentlich denke ich, dass es zu früh ist, so oder so zu antworten. Wie in einem Kommentar von Scott Hanselman beschrieben , akzeptiert der Windows 10-Kernel jetzt Linux-Systemaufrufe. Die Frage ist also, ob die von Docker benötigten Systemaufrufe (für Chroot und Namespaces) implementiert wurden oder nicht. Während die Antwort wahrscheinlich "nein" ist, gibt es so oder so keine endgültigen Informationen, soweit ich das beurteilen kann.
Sleske
1
@sleske hat recht, diese Frage ist im Moment nicht zu beantworten, und es ist ziemlich anmaßend, "nein, kann es nicht" zu sagen, ohne einen wirklichen Hinweis darauf zu haben, was die Entwickler auf dem Linux-Space in Witwen vorhaben.
Ryan
2
Ich weiß nicht genug, um mit Zuversicht zu behaupten, dass diese Antwort völlig falsch ist, aber die Art und Weise, wie sie formuliert ist, lässt mich ein bisschen skeptisch hinsichtlich ihrer Gültigkeit werden. Insbesondere die Angabe "Bash ist ein einfaches User Space-Programm und kann keines dieser Programme bereitstellen" und die Bezugnahme auf das Windows-Subsystem für Linux als "neue Bash-Funktion" lässt den Eindruck entstehen, dass diese Antwort auf der völlig falschen Annahme basiert, die Microsoft insgesamt vertreten hat war Port Bash auf 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
7

Ab dem Creator Update (veröffentlicht am 13. Juni 2017) können Sie native ausführbare Windows-Dateien direkt in WSL ausführen. Wenn Sie Docker für Windows bereits installiert haben , können Sie einfach die dockerunter installierten Binärdateien aufrufen C:\Program Files. Da sie enden, ist es .exeam einfachsten, Aliase zu erstellen. Etwas wie das Folgende in deinem .bashrcsollte funktionieren:

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

Dadurch werden Aliase für alle Dateien im DOCKER_BINVerzeichnis erstellt:

$ 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

Eine Einschränkung: Sie erhalten eine Fehlermeldung wie "Das aktuelle Arbeitsverzeichnis kann nicht übersetzt werden ", wenn Sie von einem Linux-Verzeichnis ausgeführt werden. Einfach cdin ein Windows-Verzeichnis (zB /mnt/c/Users/YourUsername) und du solltest gut sein.

dimo414
quelle
Dies scheint keine bash-Umgebungsvariablen in Docker-Compose-YML-Dateien aufzunehmen. Irgendeine Idee dafür?
Rüdiger Schulz
1
Das ist sinnvoll, da Sie die Windows- dockerBinärdatei aufrufen und dies nur über die Linux-Shell. Ich bin mir nicht sicher, ob es einen guten Weg gibt, das zu erreichen.
dimo414
6

Sobald Docker 1.12 freigegeben und der Linux Docker-Client getrennt ist, sollten Sie in der Lage sein, den Docker- Client in Windows 10 bash auszuführen .

Wenn Sie einen Docker-Windows-Client haben, hört sich das vielleicht nicht so an, aber es ist nützlich, wenn Sie Linux-Toolchains haben, die Docker für die clientseitige Funktionalität enthalten.

mixja
quelle
4

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

Eine einfache "Docker-Version" sagt Ihnen:

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 also definitiv ein Stopper von der Bash-Seite.

Trotzdem können Sie Docker für Windows installieren und es funktioniert wie ein Zauber, Sie können natürlich 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
Bruno Medina
quelle
3

Stand September 2016, Nr.

Alle aktuellen Implementierungen von Docker unter Windows verwenden Virtualisierung. Docker 1.12 verwendet unter Windows einen Hypervisor, wodurch der Vorteil der Containerisierung gegenüber der Virtualisierung beseitigt wird.

Docker braucht mehr als nur Linux-Systemaufrufe.

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

Weder cgroups noch aufs sind nativ im Windows 10 Kernel.

Eine Implementierung von Windows Server 2016 finden Sie hier: https://msdn.microsoft.com/en-gb/virtualization/windowscontainers/quick_start/quick_start_windows_server . Damit werden jedoch nur einige Windows-Dienste ausgeführt, z. B. IIS, und nicht Ubuntu

Graham
quelle
2

Docker funktioniert derzeit nicht im aktuellen Build (14316) - vorausgesetzt, Sie können es installieren.

root@localhost:~# docker --help
runtime: address space conflict: map(0x7ff5ddbb0000) = 0x7ff5ffd20000
fatal error: runtime: address space conflict
lgj
quelle
Genial! Bitte versuchen Sie es weiter.
Hawkeye
Es sieht so aus, als würde dies damit zusammenhängen, wie die Speicherzuweisung in Golang (in dem Docker geschrieben ist) funktioniert
Timothy Meade
Meins hängt nur für immer nach dem Befehl.
wieczorek1990
1

Von: https://blog.docker.com/2016/07/docker-for-mac-and-windows-production-ready/

Faster and more reliable – native development environment using
hypervisors built into each operating system. (No more VirtualBox!)
gavenkoa
quelle
2
Dies wird durch die Tatsache ergänzt, dass Sie jetzt Docker-Client für Linux in Bash ausführen können. Vermeiden Sie daher die Verwendung von PowerShell, wenn Sie nicht daran
Carlos Rafael Ramirez
1
Es wird interessant sein zu sehen, ob sie dies auf Docker-Schwarm skalieren.
Hawkeye