Installieren und Konfigurieren von Docker unter Windows Subsystem Linux (WSL)

Voraussetzungen


Bevor Sie beginnen, stellen Sie sicher, dass Ihr System ungefähr die folgende Konfiguration hat:

  • Windows 10 Version 1803 Build 1734 und höher
  • Ubuntu für WSL 16.0.4 LTS oder ähnliches (Ihre Version kann leicht variieren)

Es ist wichtig, dass die Version und der Build von Windows nicht niedriger sind als hier angegeben. Tatsache ist, dass ausgehend von diesen Zahlen grundlegende Änderungen am Windows WSL-Kernel vorgenommen wurden, die die Verwendung von cgroups ermöglichen (Kontrollgruppen - 2008 zum Linux-Kernel hinzugefügt). Und sie sind erforderlich, damit Docker die Ressourcen Ihres Systems in Containern verwalten kann.



Installieren Sie Docker-CE 09.17.0


Wir werden Docker Community Edition 17.09.0 installieren (da zum Zeitpunkt dieses Schreibens neuere Versionen bei der Installation auf WSL gefallen sind ).

Als erstes werden wir alle vorherigen Docker-Installationen (falls vorhanden) entfernen. Führen Sie dazu das Bash-Terminal aus und schreiben Sie Folgendes:

$ sudo apt-get remove docker docker-engine docker.io containerd runc


Installieren Sie nun das Repository für Docker CE. Über apt-get können wir die gewünschte Version installieren, ohne sie selbst aus den Quellen erstellen zu müssen. Gemäß den Empfehlungen auf der offiziellen Docker-Website schreiben wir die folgenden Befehle:

#   
$ sudo apt-get update
#   ,   apt    HTTPS
$ sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common

#      GPG   Docker
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
#  Docker   :
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

#        Docker    
$ sudo apt-get update

Wenn Sie jemals ein neues Repository mit apt hinzugefügt haben, ist Ihnen dies alles als Ganzes bekannt. Wenn nicht, hoffe ich, dass Sie noch bei mir geblieben sind :)

Installieren Sie als Nächstes Docker:

$ sudo apt-get install docker-ce=17.09.0~ce-0~ubuntu

Wenn Sie keine WSL im Ubuntu-Stil verwenden, sehen Sie die Liste der verfügbaren Versionen wie folgt:

$ apt list -a docker-ce


... oder verwenden Sie einen ähnlichen Befehl aus einer anderen Bibliothek, wenn Sie APT verlassen haben.

Am Ende müssen Sie Ihren aktuellen Benutzer zur Docker-Gruppe hinzufügen, um die Docker Engine, mit der auf Ihrem System ausgeführt werden soll, korrekt verwenden zu können als Wurzel.

sudo usermod -aG docker $USER

Docker unter Windows ausführen


Nachdem Docker installiert ist, müssen wir jedes Mal, wenn wir Windows starten, eine ziemlich knifflige Methode verwenden, um es als Dienst in der WSL zu starten. Dies ist nicht so einfach, wie es scheint. Wir müssen im Namen des Superusers handeln und die Befehlsshell mit erhöhten Berechtigungen ausführen, was die Aufgabe etwas kompliziert macht.

Um den Vorgang ein wenig zu vereinfachen, erstellen Sie eine neue Datei in / usr / local / sbin / - einem Skript, das die entsprechenden Befehle zum Starten des Docker-Dienstes enthält:

$ sudo nano /usr/local/sbin/start_docker.sh

mit folgenden Inhalten:

#!/usr/bin/env bash
sudo cgroups-mount
sudo service docker start

Der erste sudo-Befehl dient zum Mounten von cgroups (wird beim Neustart ausgeführt), und der zweite Befehl gibt den Docker-Dienst an systemd weiter (dies ist das Ubuntu-Subsystem zum Initialisieren und Verwalten von Diensten).

Lassen Sie nun das Skript ausführen und ausführen:

$ sudo chmod +x /usr/local/sbin/start_docker.sh
#  
$ sudo chmod 755 /usr/local/sbin/start_docker.sh
$ /bin/sh /usr/local/sbin/start_docker.sh

Der Docker-Dienst wird jedoch aus zwei Gründen nicht gestartet:

  1. Das Skript ruft als Superuser auf, daher muss das Skript selbst mit Superuser-Berechtigungen ausgeführt werden, damit es wie beabsichtigt funktioniert. Theoretisch ist dies so einfach wie das Schreiben eines sudo-Befehls. Dazu muss der Benutzer jedoch nach jedem Download seine Daten eingeben, was sehr ärgerlich ist.
  2. Der erste Befehl zum Mounten von cgroups muss in bash mit erhöhten Berechtigungen ausgeführt werden. Um es ohne Benutzereingabe auszuführen, müssen wir den Windows Task Scheduler verwenden.

Alles klar? Dann auf den Punkt ...

Ausführen eines Skripts mit Root-Rechten ohne Benutzereingabe


In der Linux- Betriebssystemfamilie bestimmt die Datei / etc / sudoers , wer und was mit Superuser-Berechtigungen ausgeführt werden kann. Lassen Sie es uns so ändern, dass Ihr Benutzer das Skript aufrufen kann, ohne ständig das Root-Passwort eingeben zu müssen. (Aber seien Sie sehr vorsichtig mit dieser Datei! Es ist sehr einfach, sich aus dem System herauszuschneiden, wenn Sie nicht wissen, was Sie tun!)

$ sudo nano /etc/sudoers

Fügen Sie am Ende der Datei eine neue Zeile hinzu. In diesem Fall müssen Sie Ihren Benutzernamen genau kennen (führen Sie echo $ USER aus, wenn Sie sich nicht sicher sind):

<your username here> ALL=(ALL:ALL) NOPASSWD: /bin/sh /usr/local/sbin/start_docker.sh

Jetzt können wir den Docker-Dienst als Root ohne Benutzereingabe starten:

$ sudo /bin/sh /usr/local/sbin/start_docker.sh 

Hurra, Genossen!

Richtiger Docker-Start beim Windows-Start


Wenn das System jetzt startet, können wir Docker als Administrator mit einem separaten Befehl starten, für den keine Benutzerinteraktion erforderlich ist.



Starten Sie den Windows- Taskplaner und wählen Sie im linken Bereich die Taskplanerbibliothek aus. Wählen Sie dann im rechten Bereich Aufgabe erstellen aus .



Als Nächstes werden Sie aufgefordert, die Grundeinstellungen der Aufgabe zu bearbeiten. Geben Sie Ihrer Aufgabe einen eindeutigen Namen und stellen Sie sicher, dass die restlichen Einstellungen mit meinen übereinstimmen. Es ist wichtig, dass Sie Mit den höchsten Berechtigungen ausführen auswählen . Fügen Sie auf der



Registerkarte Auslöser einen neuen Auslöser hinzu, der die Aufgabe startet, sobald sich der lokale Benutzer anmeldet.



Wechseln Sie zur Registerkarte Aktionen , erstellen Sie eine neue Aktion, die bash ausführt, und führen Sie unser Skript sofort mit der Option -c aus :

-c "sudo /bin/sh /usr/local/sbin/start_docker.sh"


Bitte beachten Sie, dass dies mit erhöhten Berechtigungen erfolgen muss. Aktivieren Sie daher das Kontrollkästchen Mit höchsten Berechtigungen ausführen auf der Registerkarte Allgemein .



Der Rest der Parameter hängt hauptsächlich von den individuellen Einstellungen ab, aber ich werde meine Einstellungen anzeigen. Wenn Sie möchten, können Sie sie kopieren. Einige Leistungseinstellungen werden möglicherweise nicht angezeigt, wenn Sie in einem stehenden Auto sitzen. Persönlich benutze ich einen Laptop.



Nun, alles läuft so, wie wir es beabsichtigt haben. Wenn Sie Docker in den vorherigen Schritten nicht mit Befehlen mit erhöhten Berechtigungen gestartet haben, klicken Sie einfach mit der rechten Maustaste auf die Aufgabe, die wir im Aufgabenplaner erstellt haben, und wählen Sie "Ausführen"! Das ist alles!

Überprüfen Sie, ob alles funktioniert


Wenn Sie auf Nummer sicher gehen möchten , starten Sie Ihren Computer neu (ja, dazu müssen Sie die Browser-Registerkarten für einige Zeit schließen) , starten Sie bash und geben Sie Folgendes ein:

$ docker run --rm hello-world

Wenn alles gut geht, sehen Sie die Standardbegrüßung von Docker. Der Dienst startet automatisch und direkt in der WSL! Herzliche Glückwünsche!

Abrunden


Sie haben Docker gerade in WSL installiert und gestartet. Dies bedeutet, dass Ihre Container jetzt Ubuntu gemeinsam nutzen können, das bereits auf Ihrem System ausgeführt wird. Daher muss kein neues (virtualisiertes) Betriebssystem bereitgestellt werden, wie dies bei einem normalen Docker für Windows der Fall ist.

Die bisherige Leistung von Docker in der WSL [zum Zeitpunkt des Schreibens des Originalartikels] lässt zu wünschen übrig, wird sich jedoch mit der Entwicklung der Plattform und der Veröffentlichung von Windows-Updates nur verbessern.


  1. onomatopellan GitHub: https://github.com/Microsoft/WSL/issues/2291#issuecomment-383698720
  2. Official Docker Documentation: https://docs.docker.com/install/linux/docker-ce/ubuntu/
  3. cgroupfs-mount: https://github.com/tianon/cgroupfs-mount
  4. Bash Command Line Interface: https://docs.microsoft.com/en-us/windows/wsl/reference


All Articles