Satria (Diskussion | Beiträge) (→Docker Installation) |
Satria (Diskussion | Beiträge) K (→Docker Installation) |
||
Zeile 124: | Zeile 124: | ||
=== Manuelle Installation === | === Manuelle Installation === | ||
− | Wenn man die Linux Distribution nicht über die Ubuntu App aus | + | 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: |
#WSL 2 installieren (ab Windows 1903) | #WSL 2 installieren (ab Windows 1903) |
Version vom 19. Mai 2022, 01:13 Uhr
Dieser Artikel dient einem ersten Eindruck in und einem Grundverständnis für Docker.
Inhaltsverzeichnis
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:
- Die 2 WSL Distributions, die Docker angelegt hat verschieben.
- 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.
- WSL 2 installieren (ab Windows 1903)
- WSL 2 als Standardversion für neue Distributionen setzen!
wsl --set-default-version 2
- 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! - Linux starten (Kommando
ubuntu
) - Beim ersten Start soll ein Benutzer erstellt werden. Wir nennen ihn hier exemplarisch docker mit Passwort docker.
- 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. - System aktualisieren:
sudo apt update && sudo apt upgrade
- Ein paar Umgebungsvariablen setzen:
source /etc/os-release
- Dem Docker Repo vertrauen:
curl -fsSL https://download.docker.com/linux/${ID}/gpg | sudo apt-key add -
- 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
- apt aktualisieren:
sudo apt update
- Docker installieren:
sudo apt install docker-ce docker-ce-cli containerd.io
- Den aktuellen User zur Gruppe docker hinzufügen:
sudo usermod -aG docker $USER
- 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! - Dieser Socket sollte im Windows Hostsystem in die DOCKER_HOST Variable geschrieben werden.
- 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 istdocker.exe
aufrufbar. - 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
- 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:
- WSL 2 installieren (ab Windows 1903)
- WSL 2 als Standardversion für neue Distributionen setzen!
wsl --set-default-version 2
- 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! - 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
- Ist Linux dann installiert, startet man diese Instanz mit
wsl -d <Name>
(ggf. ist <Name> auch der Default, dann genügt:wsl
- 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://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