Das Container-Management System Docker ist ganz praktisch, um Dienste und Applikationen in einer kontrollierten und isolierten Umgebung laufen zu lassen. In vielen Situationen ist es außerdem hilfreich, Verzeichnisse in einem Docker Container auf ein lokales Verzeichnis mappen zu können.
Speziell in Entwicklungs-Umgebungen, wo diese Konfiguration es erlaubt Dateien (z.B. für eine Web-Applikation) auf dem Host-Volume direkt in der IDE zu modifizieren, so dass der laufende Docker Dienst diese geänderten Dateien direkt ohne ein Deployment übernimmt.
Auch wenn Docker Container oft Linux Binaries laufen lassen, gibt es mit der „Docker Desktop“ Suite die Möglichkeit native Linux Container auf einem Windows-System laufen zu lassen.
Wie funktioniert das?
Um Linux Container laufen zu lassen verwendet Docker Desktop eine Virtuelle Machine mit einem richtigen Linux System. Um genau zu sein, muss für die Verwendung von Docker Desktop das Windows10 Virtualisierungsfeature „Hype-V“ aktiv sein.
Jeder laufende Linux Container wird dann über diese Virtuelle Maschine ausgeführt. Man diese VM auch sehen, wenn man die Hyper-V Management Applikation öffnet, und findet dort die von Dokcer Desktop angelegte „MobyLinuxVM“.
Host Volumes werden dann über SMB/CIFS Shares in der Virtuellen Maschine eingebunden (wie ein Netzlaufwerk). Damit ein solches Host Volume verwendet werden kann, muss dieses zunächst in den Docker Desktop Einstellungen „aktiviert“ werden:
Diese wird die ausgewählten Laufwerke als Windows Netzwerkfreigaben auf dem Rechner freigeben, mit den Zugriffsrechten des aktuellen Benutzers.
Falls du diesbezüglich irgendwelche Sicherheitsbedenken hast, solltest du das Host Volumes Feature nicht verwenden!
Beispiel
Um ein einfaches Beispiel zu zeigen, werden wir einen Apache Httpd Web-Server starten und damit den Inhalt eines lokalen Verzeichnisses ausliefern:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
simon@WorkPC MINGW64 ~ $ cd /d/Docker simon@WorkPC MINGW64 /d/Docker $ mkdir webserver-example simon@WorkPC MINGW64 /d/Docker $ echo "<h1>Hello World" > webserver-example/index.html simon@WorkPC MINGW64 /d/Docker $ docker run --rm -v d:/Docker/webserver-example:/usr/local/apache2/htdocs -p 80:80 httpd:2.4 Unable to find image 'httpd:2.4' locally 2.4: Pulling from library/httpd 27833a3ba0a5: Pull complete 7df2f4a2bf95: Pull complete bbda6f884d14: Pull complete 4d3dcf503f89: Pull complete b2f11da8a23e: Pull complete Digest: sha256:b4096b744d92d1825a36b3ace61ef4caa2ba57d0307b985cace4621139c285f7 Status: Downloaded newer image for httpd:2.4 AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message [Fri Apr 26 11:15:05.091604 2019] [mpm_event:notice] [pid 1:tid 140371628560448] AH00489: Apache/2.4.39 (Unix) configured -- resuming normal operations [Fri Apr 26 11:15:05.091718 2019] [core:notice] [pid 1:tid 140371628560448] AH00094: Command line: 'httpd -D FOREGROUND' 172.17.0.1 - - [26/Apr/2019:11:15:14 +0000] "GET / HTTP/1.1" 200 16 |
Jetzt kannst du deinen Web-Browser auf der URL http://localhost öffnen, und wirst den Text „Hello World“ sehen. Jedes Mal, wenn du die erstellte Datei webserver-example/index.html änderst, wird die Änderung direkt nach einem Refreshen des Browsers übernommen.
Problembehandlung
Da das Docker Desktop System von einigen verschiedenen Teilen des Systems (SMB Netzwerkfreigaben, Hyper-V Virtuelle Maschine, Virtuelle Netzwerkgeräte) abhängig ist, ist es leider recht fehleranfällig.
Problem 1: Das Docker System kann sicht nicht mehr mit dem Internet verbinden, und auch keine Ports mehr freigeben
Das scheint zu passieren, wenn das Windows-System neu gestartet wird, die Option „Schnellstart“ aktiviert ist, und die Virtuelle Maschine noch läuft. Anscheinend speichert Windows dann den Zustand der VM und stellt diesen nach dem Start (unvollständig) wieder her.
Um das zu beheben gibt es mehrere Möglichkeiten:
- den Docker Desktop Dienst nach jedem System-Neustart auch noch einmal durchstarten (Rechtsklick auf das Icon, dann „Restart …“ auswählen)
- die Option „Schnellstart“ in der Systemsteuerung unter Energieoptionen deaktivieren
- den Docker Dienst vor dem Herunterfahren/Neustarten immer ausschalten
Problem 2: Das Host Verzeichnis synchronisiert nicht mit dem Docker Volume
Angenommen du hast einen Docker Container erstellt mit einem Volume das zu einem Verzeichnis auf dem Host gemappt ist. Aber im Docker Container können die Dateien auf dem Host nicht länger gefunden werden, und auch erstellte/geänderte Dateien im Container werden nicht mehr auf der Host Maschine angezeigt.
Dies kann passieren, wenn die CIFS-Verbindung zwischen dem Host und der MobyLinuxVM gestört ist.
- du hast den Username oder das Passwort geändert
- du hast den Namen des Computers im Netzwerk geändert
- du hast etwas an den Netzwerk-Freigabe Einstellungen von WIndows geändert
Wenn das Problem auch nach einem Neustart der Maschine noch besteht, kannst du versuchen die gespeicherten Zugangsdaten für die Netzwerkfreigabe zu aktualisieren.
Im gleichen Dialog der Docker Desktopn Einstellungen, wo auch die „Shared Drives“ konfiguriert werden können, gibt es einen klickbaren Link „Reset credentials“. Dies wird dir erlauben, die Shared Drives erneut zu aktivieren und fragt dich erneut nach deinen Netzwerk-Zugangsdaten.
Wenn dies das Problem nicht löst, kannst du du noch versuchen, Docker Desktop auf den Werkszustand zurücksetzen. Dies wird auch alle deine Images und Container löschen, also solltest du vorher ein Backup von allem machen, was du noch brauchst.
Da dieser Vorgang auch die MobyLinuxVM entfernt und neu anlegt, können dadurch vorige Fehlkonfigurationen behoben werden. Bei mir hat das schon einmal geholfen, die Shared Drives wieder zum laufen zu bringen, nachdem die anderen Optionen fehlgeschlagen waren.