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:
sudo vim ~/.profile
- in dieses File
export DOCKER_HOST=tcp://127.0.0.1:2376
eintragen - Speichern und beenden
- 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