Aus SatriaWiki
Wechseln zu: Navigation, Suche

Dieser Artikel dient einem ersten Eindruck in und einem Grundverständnis für Docker.

Was ist Docker?

Kurz und bündig: Docker ist eine Form der Virtualisierung, bei der aber keine komplette Maschine erzeugt wird (wie z.B: bei VMWare), sondern nur eine Art Sandbox, die direkt Ressourcen vom Hostsystem verwendet. Das ist sehr viel schneller als eine komplette VM zu starten.

Docker basiert auf Linux. Bei "Docker for Windows" sieht es daher doch so aus, dass per Hyper-V eine komplette Linux-VM erzeugt wird (automatisch bei der Installation), in der Docker dann läuft. Was beim Umschalten auf Windows-Docker passiert, weiß ich zum derzeitigen Zeitpunkt nicht. Die Auswahl an fertigen images wird hier auch geringer sein als bei den nativen Linux images.

Update: Mit der Integration von WSL 2 in Windows 10 / Server 2019 ab build 1903 ist Hyper-V für Docker nicht mehr nötig. Mit WSL 2 gibt es eine native Linuxschicht in Windows, die Docker noch schneller und ressourcenschonender macht.

Und wie muss man sich das vorstellen?

Docker wird zunächst grundsätzlich per CLI bedient. Die binaries für die Bedienung liegen bei Docker for Windows als echte Windows .exe Dateien vor. Über den Befehl

docker pull | build | run | start | stop | kill | rmi | tag | ...

können sog. Images vom docker hub (community driven) heruntergeladen und verwendet, gestartet, gestoppt, getagged, gelöscht und neue Images gebaut werden. Z.B. möchte man ein Docker image mit Java haben, um sein eigenes Java-Tool darin laufen zu lassen. Dann könnte man mit

docker pull openjdk:8u181-jre-slim-stretch

ein Image ziehen, das ein Linux enthält und eine Java runtime. Dieses Image liegt nach dem download lokal im Docker repository und ist zunächst aber nicht aktiv. Welche images heruntergeladen werden können und wie sie heißen (hier openjdk:8u181-jre-slim-stretch), ermittelt man auf https://hub.docker.com/

Ob es selber gestartet werden kann, und was dabei passiert hängt vom image ab. Dieses image würde man eher as Basis-image zum Bau eines eigenen verwenden. Das geht mit dem Befehl

docker build

Dieser Befehl sucht im aktuellen Verzeichnis nach einer Datei dockerfile, die Definitionen enthält, wie das neue image zu bauen ist (https://docs.docker.com/engine/reference/builder/) Im Wesentlichen gibt man an, von welchem image man ausgehen möchte (FROM), was man hinzufügen möchte (ADD oder COPY) und was beim Start des images ausgeführt werden soll (CMD).

FROM openjdk:8u181-jre-slim-stretch
COPY dist/myTool.jar /usr/bin/
CMD java -jar /usr/bin/myTool.jar

Wird das image auf diese Art gebaut, kann man es später mit

docker run <imageName or ID>

ausführen. Ein image, das gerade ausgeführt wird, nennt man container, oder vielmehr wird ein container basierend auf dem image erzeugt. Er ist quasi die laufende Instanz des images. Es können prinzipiell beliebig viele container eines images parallel gestartet werden.

Welche container gerade laufen oder glaufen sind, sieht man mit

docker ps -a

Dockerfile

ADD / COPY

Zwischen ADD und COPY besteht ein feiner Unterschied. Während COPY einfach nur kopiert, würde ADD normale Dateien auch kopieren, aber bekannte Archive (.tar, ...?) stattdessen entpacken. Der zweite Parameter ist der Zielort, der ggf. im selben Schritt erstellt wird.

RUN / CMD

RUN führt Befehle IM image zum build-Zeitpunkt aus. Man kann hier z.B. apt-get tasks unterbringen, um im image Software nachzuinstallieren.

CMD führt den nachfolgenden Befehl jedes Mal (im container) aus, wenn ein image gestartet wird.

Volumes

Volumes sind Dateipfade des Hostsystems, die in den container hinein gelinked werden können wie mount points. Somit kann ein Austausch zwischen container und Hostsystem stattfinden. Das geschieht beim Starten des containers:

docker run <image name or ID> --volume \Hostpfad:/Containerpfad

Zu ermitteln, welche volumes in einem container gemounted sind, geht mit diesem Befehl:

docker inspect -f {{ .Mounts }} <ContainerID>

Hardwarewechsel

Eine negative Erfahrung beim Wechsel der Hardware (neuer Laptop, alte SSD): Docker startete nicht mehr. Irgendein Problem mit Hyper-V. Hyper-V ließ sich aber auch nicht deinstallieren, um es dann neuzuinstallieren. Beim Deinstallationsprozess wollte Windows neustarten, meldete dann einen Fehler und meinte, die Änderungen würden rückgängig gemacht - Hyper-V war noch da. Es gab keine Lösung außer einer Neuinstallation.

Also: Vermutlich sollte man sowohl Docker als auch Hyper-V sauber deinstallieren, dann Platte und BS auf die neue Hardware bringen und dort Hyper-V und Docker wieder installieren.

Docker verschieben

Diese Beschreibung bezieht sich auf Docker unter WSL 2 (ab Windows 10 1903)

Möchte man Platz auf Laufwerk C: sparen und Docker verschieben, muss man 2 Dinge tun:

  1. Die 2 WSL Distributions, die Docker angelegt hat verschieben.
  2. Das Installationsverzeichnis von Docker verschieben und den Dienst anpassen.

WSL Distributionen verschieben

Ich weiß nicht, ob Windows da etwas mitbringt, aber es gibt ein Tool, das WSL sehr gut managen kann: LxRunOffline.

Docker legt 2 Distributionen an, die man mit

lxrunoffline l

abfragen kann:

docker-desktop
und
docker-desktop-data

Informationen, z.B. über Speicherort erhält man mit: lxrunoffline sm -n docker-desktop Verschieben lassen sich beide Distributionen per:

lxrunoffline m -n docker-desktop -d <Zielverzeichnis1>
und
lxrunoffline m -n docker-desktop-data -d <Zielverzeichnis2>

Docker-Installationsverzeichnis

Man beendet Docker Desktop und beendet den Docker-Dienst.

Dann verschiebt man das gesamte Docker-Verzeichnis (C:\Program Files\Docker) zum gewünschten Ort (<Zielverzeichnis>) und führt dann aus:

sc config com.docker.service binPath="<Zielverzeichnis>\Docker\com.docker.service.exe"

Docker-Dienst und Docker-Desktop starten, und alles sollte jetzt funktionieren.

Docker Installation

Wenn nicht Docker Desktop verwendet weren soll (ab Version 4 ist diese Software unter gewissen Umständen kostenpflichtig), dann sind ein paar manuelle Schritte nötig, um Docker zu installieren.

Voraussetzung: Die Virtualisierungsplattform ist aktiviert. (Windows-Features: "Plattform für virtuelle Computer") ggf. hilft das Kommando: dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

  1. WSL 2 installieren (ab Windows 1903)
  2. WSL 2 als Standardversion für neue Distributionen setzen! wsl --set-default-version 2
  3. Linux Distribution für WSL installieren über den MS Store. Am besten Ubuntu 20.04 LTS (https://www.microsoft.com/store/productId/9NBLGGH4MSV6).
    Die weiteren Schritte enthalten nicht immer alle nötigen Schritte für andere Distributionen!
  4. Linux starten (Kommando ubuntu)
  5. Beim ersten Start soll ein Benutzer erstellt werden. Wir nennen ihn hier exemplarisch docker mit Passwort docker.
  6. Sicherstellen, dass docker ein superuser ist: sudo grep -E 'sudo' /etc/group Hierbei sollte so eine Zeile wie sudo:x:27:docker herauskommen. Wenn nicht, muss das hier ausgeführt werden: usermod -aG sudo docker, wobei docker der Benutzername ist, den wir in Schritt 4 erstellt haben.
  7. System aktualisieren: sudo apt update && sudo apt upgrade
  8. Ein paar Umgebungsvariablen setzen: source /etc/os-release
  9. Dem Docker Repo vertrauen: curl -fsSL https://download.docker.com/linux/${ID}/gpg | sudo apt-key add -
  10. Repo Info aktualisieren: echo "deb [arch=amd64] https://download.docker.com/linux/${ID} ${VERSION_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/docker.list
  11. apt aktualisieren: sudo apt update
  12. Docker installieren: sudo apt install docker-ce docker-ce-cli containerd.io
  13. Den aktuellen User zur Gruppe docker hinzufügen: sudo usermod -aG docker $USER
  14. Jetzt kann der Docker Deamon gestartet werden: sudo dockerd -H 127.0.0.1
    Dabei wird am Ende ein Socket gemeldet, z.B.: API listen on 127.0.0.1:2375
    Hierfür muss Linux Distro mit Adminrechten gestartet werden!
  15. Dieser Socket sollte im Windows Hostsystem in die DOCKER_HOST Variable geschrieben werden in der Form tcp://127.0.0.1:2375.
  16. In Windows wird dann das Docker CLI (https://github.com/StefanScherer/docker-cli-builder/releases) heruntergeladen und an beliebiger Stelle platziert.
    Integration in den PATH und schon ist docker.exe aufrufbar.
  17. Um das Benutzerpasswort nicht immer eingeben zu müssen, kann den Benutzern der Gruppe docker das Ausführen von dockerd ohne Passwort erlaubt werden. Dazu wird dieser Befehl aufgerufen: sudo visudo und diese Zeilen ergänzt: %docker ALL=(ALL) NOPASSWD: /usr/bin/dockerd
  18. Ab jetzt kann von Windows aus (z.B. über die Aufgabenplanung) das asynchrone Kommando abgesetzt werden, um den Docker-Deamon im Hintergrund zu starten: wsl sh -c "nohup sudo -b dockerd -H 127.0.0.1 > /mnt/wsl/docker.log"

Manuelle Installation

Wenn man die Linux Distribution nicht über die Ubuntu App aus dem Windows Store installieren möchte oder aber einfach nur das Installationsverzeichnis anpassen will, müssen die Schritte 1-4 etwas anders aussehen:

  1. WSL 2 installieren (ab Windows 1903)
  2. WSL 2 als Standardversion für neue Distributionen setzen! wsl --set-default-version 2
  3. Linux Distribution für WSL installieren über den MS Store. Am besten Ubuntu 20.04 LTS (https://www.microsoft.com/store/productId/9NBLGGH4MSV6). Wir benötigen hier nur das GZip Archiv!
    Die weiteren Schritte enthalten nicht immer alle nötigen Schritte für andere Distributionen!
  4. Im Ordner C:\Program Files\WindowsApps\CanonicalGroupLimited.UbuntuonWindows_2004.2021.825.0_x64__79rhkp1fndgsc sollte sich jetzt eine Datei install.tar.gz liegen.
    Also führt man den Befehl aus: wsl --import <Name> <Zielverzeichnis> C:\Program Files\WindowsApps\CanonicalGroupLimited.UbuntuonWindows_2004.2021.825.0_x64__79rhkp1fndgsc\install.tar.gz --version 2
  5. Ist Linux dann installiert, startet man diese Instanz mit wsl -d <Name> (ggf. ist <Name> auch der Default, dann genügt: wsl
  6. Man erstellt einen nicht-root Benutzer mit adduser docker

Ab hier geht es mit dem obigen Schritt 5 weiter.

Außerdem kann man per Regedit jetzt den neuen Benutzer, der die ID 1000 haben sollte, als Default-Benutzer eintragen: HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss\{Instanz-CLSID}\DefaultUid = 1000 (Dezimal)
Als weitere Registrymodifikation kann man den Schlüssel KernelCommandLine auf BOOT_IMAGE=/kernel init=/init setzen (wie bei der automatischen Installation), da sonst defaultmäßig BOOT_IMAGE=/kernel init=/init ro angenommen wird. Was der Unterschied ist, kann ich leider nicht sagen, ich habe diesen einfach erst mal festgestellt.

Aufpassen muss man jetzt bei Mounted Volumes ins Windows-Dateisystem. Diese funktionieren unter Docker Desktop mit lokalen Pfadangaben wie -v D:\Ordner1\Ordner2:/tmp jetzt aber muss man -v /mnt/d/Ordner1/Ordner2:/tmp schreiben!

Verbindungen aus dem Container zum Host

In einem Briged Network kann aus dem Container heraus natürlich nicht per "localhost" auf den Host zugegriffen werden. Man muss den Container mit dem Parameter --add-host host.docker.internal:host-gateway starten, damit host.docker.internal zum Host führt.

VMWare

Auch wenn Hyper-V nicht installiert sein muss, erfordert WSL2 den Hypervisor, der normalerweise als Startparameter im Bootmanager von Windows aktiviert ist. Möchte man VMWare verwenden, muss dieser deaktiviert werden und Windows neu gestartet werden!

bcdedit /set hypervisorlaunchtype off

Möchte man wieder WSL2 verwenden, aktiviert man ihn wieder und startet neu:

bcdedit /set hypervisorlaunchtype Auto

Quellen

https://docs.docker.com/reference/

https://www.cloudmanav.com/tools/moving-docker-desktop-another-drive

https://forums.docker.com/t/how-could-i-install-docker-for-windows-on-drive-e-my-ssd-c-is-full/52347/5

https://dev.to/_nicolas_louis_/how-to-run-docker-on-windows-without-docker-desktop-hik

https://dev.to/bowmanjd/install-docker-on-windows-wsl-without-docker-desktop-34m9