Docker in der Windows Bash (WSL)

Docker unter Windows kann bekanntermaßen auch Container mit Linux ausführen. Alle Befehle zum Steuern von Docker funktionieren auch unter Windows recht zuverlässig.
Nun kann es aber vorkommen, dass man dennoch gern die Bash unter Windows verwenden möchte um mit Docker zu arbeiten.

Man stellt schnell fest, dass man in dem Linux Subsystem die Docker-Engine nicht installieren kann da diese Zugriff auf bestimmte Kernel Features benötigt welche von dem Subsystem nicht bereitgestellt werden können.

Und nun?

Unter Windows ist Docker bereits eingerichtet und läuft?
Sehr gut!

Jetzt müsste man nur noch den Docker-Client in die Bash bekommen und diesem beibringen die Engine von Windows zu nutzen.

Doch so einfach?

Ich gehe in diesem Beitrag von der Ubuntu-Bash aus. Die folgenden Schritte sollten sich so in der Art auch auf die anderen Varianten der Bash anwenden lassen.

Docker-Client installieren

Manuell

In der Bash lädt man sich zunächst die nötigen Docker Tools:

cd
wget https://download.docker.com/linux/static/stable/x86_64/docker-17.12.0-ce.tgz
tar -xzvf docker-*.tgz

Den entsprechenden Link kann man sich hier zusammensuchen: https://download.docker.com/linux/static/

Man legt nun noch die Docker Files in ~/bin ab:

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

apt-get

Diese Variante ist etwas aufwendiger, bringt aber die Möglichkeit von automatischen Updates mit sich. Die Empfehlung geht deutlich in diese Richtung.

In Grunde kann man sich hierfür an der Docker Dokumentation orientieren. Aber Obacht! das zu installierende Paket ist in unserem Fall ein anderes.

Zunächst bereiten wir das System auf die Verwendung von Repositories über https vor:

sudo apt-get update && sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

und fügen den offiziellen GPG Schlüssel von Docker hinzu:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Jetzt wird noch das Repository mit folgendem Befehl hinzugefügt:

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

Noch einmal den apt Cache aktualisieren mit sudo apt-get update und schon kann man die Docker CLI installieren. Zu bechten ist das cli am Ende.

sudo apt-get install docker-ce-cli

Tipp die korrekt Installation kann man mit docker version überprüfen.

Der erste Versuch

Voller Vorfreude tippt man docker info ein und wird mit folgender Aussage wieder geerdet:

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

Umgebung konfigurieren

Wir müssen dem Docker-Client noch mitteilen wo er denn nach dem Docker-Deamon zu schauen hat:

export DOCKER_HOST=tcp://127.0.0.1:2375

Wieder wird docker info eingetippt mit folgendem Resultat:

Cannot connect to the Docker daemon at tcp://127.0.0.1:2375. Is the docker daemon running?

Nanu?!

Windows-Deamon freigeben

In den Einstellungen von Docker unter Windows findet man unter General eine Checkbox mit der Bezeichnung Expose deamon on tcp://localhost:2375 without TLS. Diese wird aktiviert.

Achtung!!!!111elf: Die Aktivierung dieser Option ist nicht ohne verbundene Risiken. Belest euch bitte ob ihr das Risiko eingehen könnt oder nicht. Ich empfehle den Deamon nur so lange auf diese weise zu veröffentlichen wie ihr diesen wirklich benötigt.

Wir gehen wieder in die Bash und versuchen unser Glück erneut: docker info

Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 17.12.0-ce
...

BÄÄÄÄM!

Aber halt!
Man sollte diese Konfiguration nicht im Dauerbetrieb nutzen!
Hier nun also wie man die Verbinfung zu dem Docker Host mit TLS herstellt. Stefan Scherer hat in seinem Blog Artikel einen sehr guten Weg aufgezeigt wie man die nötigen Zertifikate unter Windows erstellt bekommt. Ich nutze sein Docker Image auf folgende Weise:

docker run --rm `
    -e SERVER_NAME=$(hostname) `
    -e IP_ADDRESSES=127.0.0.1 `
    -v "C:\ProgramData\docker:C:\ProgramData\docker" `
    -v "$env:USERPROFILE\.docker:C:\Users\containeruser\.docker" `
    stefanscherer/dockertls-windows:latest

Zu beachten ist, dass die gewünschten IP Adressen mit IP_ADDRESSES übergeben werden müssen. Mehrere werden durch , getrennt.

Hat das Erstellen funktioniert liegen die Zertifikate unter Windoes an den richtigen stellen. Um Docker davon zu überszeugen diese dann auch zu verwenden genügt in der Regel ein Restart-Service Docker.

Möchte man prüfen ob die Verbindung klappt wird folgendes ausgeführt:

docker --tlsverify \
    --tlscacert=/c/Users/<USERNAME>/.docker/ca.pem \
    --tlscert=/c/Users/<USERNAME>/.docker/cert.pem \
    --tlskey=/c/Users/<USERNAME>/.docker/key.pem \
    -H=tcp://127.0.0.1:2376 \
    version

INFO: Obacht! ich nutze die verkürzten Mounts für die Windows Laufwerke wie hier beschrieben.

Bekommt man beide Versionen für den Client als auch den Server zurück ist alles richtig. Kommt ein Fehler hat bei mir ein Neustart des Rechners geholfen.

Docker Einstellungen persistieren

Möchte man die Konfiguration der Umgebungsvariable nicht immer wieder neu setzen hilft Folgendes:

  1. sudo vim ~/.profile
  2. in dieses File export DOCKER_HOST=tcp://127.0.0.1:2376 eintragen
  3. Speichern und beenden
  4. mit source ~/.profile das Profil neu laden.

Nutzt man die Variante mit TLS müssen noch diese Zeilen hinzugefügt werden:

export DOCKER_CERT_PATH=/c/Users/<USERNAME>/.docker/
export DOCKER_TLS_VERIFY=1

Quellen

Stefan Scherer

Running Docker containers on Bash on Windows