Bildquellen: Docker, Windows (Wikipedia)
Theorie
Motivation
Wir nutzen für unser Vorhaben das Docker Repository von dieser GitHub Seite: https://github.com/dockur/windows
Und genau dort liegen auch alle Credits und mein Dank gilt diesem tollen Projekt.
Persönlich war mir die Dokumentation zu dürftig und ich hatte viele Try & Error Momente.
Nun habe den Dreh raus und möchte mein neu erlangtes Wissen und Erfahrungen mit euch teilen.
Hoffentlich fällt euch der Einstieg dann leichter als mir
Voraussetzungen
- Beliebiges Linux als Host System
- CPU mit KVM Unterstützung
- Installiertes Docker und Docker Compose
- Internetanbindung
- Webbrowser (getestet Firefox und Brave)
- Terminal
- Optional: RDP Client
- Optional: Festplatte oder Partition mit NTFS oder FATx
- ca. 15-20 Minuten Zeit + Download und Installationszeit
KVM Unterstützung Prüfen
lscpu | grep Virt
Die Ausgabe sollte entweder Virtualisierung: VT-x für Intel CPUs oder Virtualisierung: AMD-SVM ausgeben.
Sollte dies nicht der Fall sein, prüfe, ob du die Funktion im BIOS aktiviert hast.
Was dieses Tutorial dir zeigt
Dieses Tutorial erklärt Schritt für Schritt, wie du eine "beliebige" Windows Version in einem Docker Container installierst.
Einmal als sogenannte unbeaufsichtigte Installation, also völlig automatisch und einmal eine normale, manuelle Installation.
Zudem werden wir
- mehrere virtuelle Festplatten einbinden
- USB-Stick Weiterleitung implementieren
- Dateien mit dem Host teilen
- Pass-Through einer NTFS oder FAT Partition
Was dieses Tutorial dir nicht zeigt
Du wirst nicht lernen, wie du Docker und die benötigten Komponenten installierst und auch nicht, was Docker ist und wie man damit umgeht.
Grundkonzept
Es ist simpel wie genial: Mit Hilfe einer einzigen Konfigurationsdatei (YAML Format), definieren wir unseren Docker Container.
Aufbau einer .YML Datei
Es folgt die einfachste Variante für eine Konfigurationsdatei.
services:
windows:
image: dockurr/windows
container_name: windows
devices:
- /dev/kvm
cap_add:
- NET_ADMIN
ports:
- 8006:8006
- 3389:3389/tcp
- 3389:3389/udp
stop_grace_period: 2m
restart: on-failure
environment:
VERSION: "win11"
RAM_SIZE: "4G"
CPU_CORES: "4"
DISK_SIZE: "64G"
volumes:
- /var/win:/storage
Display More
Der Parameter image verrät Docker, um welches Image es sich handelt und wo es sich für den Download befindet.
container_name ist schlicht der Name, den wir unserem neuen Container geben möchten und ist reine Kosmetik.
Ports
In der Sektion Ports, sind die Ports für VNC (8006) und RDP (3389) angegeben und sofort einsatzbereit.
Environment
Die Parameter und Environment und Volumes sind für uns am interessantesten.
Unter Environment legen wir die zu installierende Windows Version fest (siehe Tabelle im Anhang).
Der Rest dürfte selbsterklärend sein:
RAM_SIZE legt fest, wie viel Arbeitsspeicher wir dem Container von unsrem physischen RAM abgegeben wollen.
Gleiches gilt für die CPUCORES, also wie viele Kerne der eigenen CPU kann der Container verwenden.
DISKSIZE legen fest, wie groß die virtuelle Festplatte sein soll.
Volumes
/var/win:/storage
/var/win ist schlicht der Pfad, an dem wir unsere virtuelle Festplatte speichern wollen. Der Pfad kann beliebig angepasst werden.
Der Parameter storage sagt lediglich, dass es sich um ein Speichergerät handelt.
Praxis Teil 1 - (Automatische) Installation
Genug Theorie für den Moment. Jetzt starten wir unseren ersten Linux > Docker > Windows - Container!
Schritt 1
- Verzeichnis erstellen, in dem der Container gespeichert werden soll (z.B. /home/docker)
- Eine Datei mit dem Namen docker-compose.yml im selben Verzeichnis erstellen
- Folgenden Code (Version 1 oder Version 2) in die Datei kopieren und nach eigenen Wünschen anpassen.
Version 1
services:
windows:
image: dockurr/windows
container_name: windows
devices:
- /dev/kvm
cap_add:
- NET_ADMIN
ports:
- 8006:8006
- 3389:3389/tcp
- 3389:3389/udp
stop_grace_period: 2m
restart: on-failure
environment:
VERSION: "win11"
RAM_SIZE: "4G"
CPU_CORES: "4"
DISK_SIZE: "64G"
volumes:
- /var/win:/storage
Display More
Version 2
Version 2 erweitert Version 1 um einige Vorgaben für die automatische Installation.
Unter Environment habe ich folgende Werte hinzugefügt:
LANGUAGE: "German"
REGION: "de-DE"
KEYBOARD: "de-DE"
USERNAME: "tux"
PASSWORD: "tux"
Ich denke, die Werte sind selbsterklärend, aber im Anhang noch etwas genauer erklärt.
services:
windows:
image: dockurr/windows
container_name: windows
devices:
- /dev/kvm
cap_add:
- NET_ADMIN
ports:
- 8006:8006
- 3389:3389/tcp
- 3389:3389/udp
stop_grace_period: 2m
restart: on-failure
environment:
VERSION: "win11"
RAM_SIZE: "4G"
CPU_CORES: "4"
DISK_SIZE: "64G"
LANGUAGE: "German"
REGION: "de-DE"
KEYBOARD: "de-DE"
USERNAME: "tux"
PASSWORD: "tux"
volumes:
- /var/win:/storage
Display More
Schritt 2
- Terminal starten und in das angelegte Verzeichnis wechseln
- Container starten mit
docker compose up
# oder ohne Ausgabe mit
docker compose up -d
Über die URL http://localhost:8006/ kann direkt über VNC auf den neuen Container zugegriffen werden.
Nun heißt es abwarten, bis das ISO heruntergeladen ist und die automatische Installation abgeschlossen ist.
Schritt 3
Ist der Container fertig, bzw. die Installation abgeschlossen, kann das "frische" Windows verwendet werden.
Alternativ geht auch eine RDP Verbindung über localhost:3389. Meine Empfehlung gilt klar RDP. Fühlt sich einfach smoother an.
Praxis Teil 2 - Platz-schaffen
Im zweiten Praxis-Teil erweitern wir unseren Container um eine weitere virtuelle Festplatte und verbinden den Container mit einem USB-Stick.
Schritt 1 - USB-Stick
Die Zuordnung erfolgt Hardware-Nah - also spezifisch für jedes einzelne Gerät.
Im Abschnitt Environment benötigen wir einen neuen Eintrag, um dem Container einen USB-Stick zuzuweisen.
ARGUMENTS: "-device usb-host,vendorid=0x090c,productid=0x1000"
Benötigt wird die Vendor- und Product ID des Geräts. Um an diese beiden Werte zu kommen, benötigen wir den Befehl lsusb.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 0bda:5420 Realtek Semiconductor Corp. 4-Port USB 2.0 Hub
Bus 001 Device 003: ID 05e3:0610 Genesys Logic, Inc. Hub
Bus 001 Device 004: ID 046d:0843 Logitech, Inc. Webcam C930e
Bus 001 Device 005: ID 08bb:2902 Texas Instruments PCM2902 Audio Codec
Bus 001 Device 006: ID 090c:1000 Silicon Motion, Inc. - Taiwan (formerly Feiya Technology Corp.) Flash Drive
Bus 001 Device 007: ID 046a:0115 CHERRY CHERRY Wireless Device
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 002 Device 002: ID 0bda:0420 Realtek Semiconductor Corp. 4-Port USB 3.0 Hub
Bus 002 Device 003: ID 05e3:0626 Genesys Logic, Inc. Hub
Bus 002 Device 004: ID 0bda:8153 Realtek Semiconductor Corp. RTL8153 Gigabit Ethernet Adapter
Display More
In meinem Fall ist der USB-Stick Device 006 - zu erkennen an der Bezeichnung Flash Drive.
Der Abschnitt ID enthält die Vender- und Product ID und zwar in der Reihenfolge (getrennt durch einen :).
Vor jeder dieser Werte setzen wir ein 0x >> vendorid=0x090c,productid=0x1000.
Abschließend muss im Abschnitt Devices folgender Parameter hinzugefügt werden:
- /dev/bus/usb
Der Container kann gestartet werden und der USB-Stick kann normal genutzt werden.
Schritt 2 - Zusätzliche Partitionen
Wieder starten wir im Abschnitt Environment und erweitern diesen wie folgt:
DISK2_SIZE: "10G"
DISK3_SIZE: "2G"
Den Abschnitt Volumes ergänzen wir folgendermaßen:
volumes:
- /var/win:/storage
- /var/win:/storage2
- /var/win:/storage3
Größe und Speicherort der neuen virtuellen Festplatten können natürlich frei angepasst werden.
Nachdem der Container hochgefahren ist, müssen die neuen virtuellen Festplatten noch formatiert werden.
Praxis Teil 3 - Special Operations
Teil 1 - Manuelle Windows Installation
Wer auf eine automatische Installation verzichten möchte, kann mit einem einzigen Parameter auch eine manuelle Installation anstoßen.
environment:
MANUAL: "Y"
Teil 2 - Dateien mit dem Hostsystem teilen
Für mich einer der wichtigsten Punkte, Dateien zwischen Container und Hostsystem austauschen.
Im Abschnitt Volumes wird lediglich ein weiterer Parameter benötigt: - /home/toadie/share:/shared
volumes:
- /var/win:/storage
- /home/toadie/share:/shared
Unter Netzwerk erscheint das Gerät host.lan - hier ist das "Austausch" Verzeichnis zu finden.
Teil 3 - Pass-Through
WARNUNG:
Ich kann nicht sagen was passiert, wenn man eine Linux-Partition verwendet, auf der schon Daten liegen!
Meine Empfehlung: Verkleinere eine Partition und erstelle eine NTFS oder FATx Parition.
Bei Pass-Through handelt es sich um Technik, Geräte des Hostsystems direkt in einer VM oder Contrainer zu verwenden. D.h. Geräte nicht Emuliert, sondern die vorhandene Hardware wird wie vom Hostsystem direkt angesprochen. Natürlich bietet dies deutlich bessere Performance.
Der Abschnitt Devices muss nur um einen Parameter erweitert werden:
- /dev/sdb2:/disk2
In diesem Beispiel würde der Container direkten Zugriff auf die 2. Festplatte und deren 2. Partition bekommen.
Alternativ kann natürlich die gesamte Festplatte verwendet werden.
Teil 4 - Eigenes ISO für die Installation
Um ein eigenes Windows ISO zu verwenden, wird der Abschnitt Volumes wie folgt geändert:
volumes:
- /var/win/win.iso:/win.iso
- /var/win:/storage
Fazit und abschließende Worte
Performance
Ich möchte bezweifeln, dass es möglich ist, mit solch einem System Spiele, die neuer als 1999 sind, zu spielen - wenn überhaupt.
Für Gamer lohnt sich also Docker nicht.
Für kleinere Dienste oder Programme ist ein Windows-Docker aber durchaus eine Alternative zu einer virtuellen Maschine.
Erstaunt war ich über die Performance beim Konvertieren von Audio-Dateien. Hier liegt die Docker Variante ganz klar vor Virtual Box und QEMU.
Besonders unter Verwendung von Pass-Through gibt es nichts zu meckern.
Des Weiteren habe ich den, vielleicht subjektiven Eindruck, dass die Docker Windows Container insgesamt das Host-System weniger belasten als herkömmliche virtuelle Maschinen.
Empfehlungen
Für die kleinen Bedürfnisse sollte die Tiny Version ausreichend sein. Diese benötigt deutlich weniger Festplattenkapazität als vollwertige Windows Versionen. Ich selbst habe mich für die Tiny Version entschieden. Sie reicht bisher für meine wenigen Einsatzszenarien völlig aus.
Ausblick
Ob alle Images dieselben Features bieten und gleichermaßen gut funktionieren, kann ich nicht sagen.
Für meine Tests habe ich win11, win10, win7 und tiny10 verwendet. Alle ohne Probleme. Wobei tiny10 keine Änderung der Sprache akzeptiert hat - das dürfte aber Konzept eines Tiny Windows liegen.
Replies 15