1. Dashboard
  2. Articles
  3. Forum
    1. Unresolved Threads
    2. Members
      1. Recent Activities
      2. Users Online
      3. Team
      4. Search Members
  4. Linux Guides
    1. Homepage
    2. YouTube
    3. Telegram
    4. Community-Stammtisch
  5. Lexicon
  • Login
  • Register
  • Search
Netzwerk & Server
  • Everywhere
  • Netzwerk & Server
  • Articles
  • Pages
  • Forum
  • Lexikon
  • More Options
  1. Linux Guides Community
  2. Netzwerk & Server

Windows mit Docker Compose

  • Toadie
  • December 18, 2024 at 7:00 PM
  • 383 Views
  • 15 Replies
Contents [hideshow]
  1. Theorie
    1. Motivation
    2. Voraussetzungen
      1. KVM Unterstützung Prüfen
    3. Was dieses Tutorial dir zeigt
    4. Was dieses Tutorial dir nicht zeigt
  2. Grundkonzept
    1. Aufbau einer .YML Datei
      1. Ports
      2. Environment
      3. Volumes
  3. Praxis Teil 1 - (Automatische) Installation
    1. Schritt 1
      1. Version 1
      2. Version 2
    2. Schritt 2
    3. Schritt 3
  4. Praxis Teil 2 - Platz-schaffen
    1. Schritt 1 - USB-Stick
    2. Schritt 2 - Zusätzliche Partitionen
  5. Praxis Teil 3 - Special Operations
    1. Teil 1 - Manuelle Windows Installation
    2. Teil 2 - Dateien mit dem Hostsystem teilen
    3. Teil 3 - Pass-Through
      1. WARNUNG:
    4. Teil 4 - Eigenes ISO für die Installation
  6. Fazit und abschließende Worte
    1. Performance
    2. Empfehlungen
    3. Ausblick
  7. Anhang
    1. Verfügbare Windows Versionen
    2. Parameter
      1. Devices
      2. Volumes
      3. Enviroment

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

Code
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.

Code
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

  1. Verzeichnis erstellen, in dem der Container gespeichert werden soll (z.B. /home/docker)
  2. Eine Datei mit dem Namen docker-compose.yml im selben Verzeichnis erstellen
  3. Folgenden Code (Version 1 oder Version 2) in die Datei kopieren und nach eigenen Wünschen anpassen.

Version 1

Code
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:

Code
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.

Code
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

  1. Terminal starten und in das angelegte Verzeichnis wechseln
  2. Container starten mit
Code
docker compose up

# oder ohne Ausgabe mit

docker compose up -d

docker_windows_01.mp4

Ü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.

Code
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.

Code
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:

Code
- /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:

Code
DISK2_SIZE: "10G"
DISK3_SIZE: "2G"

Den Abschnitt Volumes ergänzen wir folgendermaßen:

Code
    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.

Code
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

Code
    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:

Code
- /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:

Code
    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.

Anhang

Verfügbare Windows Versionen

Wert für DockerVersionDownload Größe
win11Windows 11 Pro6.4 GB
win11eWindows 11 Enterprise5.8 GB
win10Windows 10 Pro5.7 GB
ltsc10Windows 10 LTSC4.6 GB
win10eWindows 10 Enterprise5.2 GB
win8Windows 8.1 Pro4.0 GB
win8eWindows 8.1 Enterprise3.7 GB
win7Windows 7 Enterprise3.0 GB
vistaWindows Vista Enterprise3.0 GB
winxpWindows XP Professional0.6 GB
2022Windows Server 20224.7 GB
2019Windows Server 20195.3 GB
2016Windows Server 20166.5 GB
2012Windows Server 20124.3 GB
2008Windows Server 20083.0 GB
core11Tiny 11 Core2.1 GB
tiny11Tiny 113.8 GB
tiny10Tiny 103.6 GB

Parameter

Devices

ParameterBeschreibung
/dev/kvm
/dev/bus/usb
/dev/sdb:/disk2


Volumes

ParameterBeschreibung
- /home/tux/docker/win10:/storagePfad für die virtuelle Docker Festplatte
- /home/tux/docker/share:/sharedPfad für ein Share-Verzeichnis, um Dateien mit zwischen Host und Container auszutauschen

Enviroment

ParameterBeschreibung
VERSIONWindows Version - siehe Tabelle verfügbare Windows Versionen
RAM_SIZEGröße des zur Verfügung gestellten physischen Arbeitsspeichers
CPU_CORESAnzahl der zur Verfügung gestellten CPU Kerne
DISK_SIZEGröße der virtuellen Festplatte
LANGUAGEGewünschte Sprache, z.B. German
REGIONZeitzone usw., z.B. de-DE
KEYBOARDTastaturlayout, z.B. de-DE für das deutsche Tastaturlayout
USERNAMEBenutzername für den Windows Benutzer, z.B. Tux
PASSWORDPasswort für den Windows Benutzer
ARGUMENTSz.B. für USB Geräte
MANUALEine manuelle Installation wird getriggert (MANUAL: "Y")
  • Windows
  • Docker
  • Previous Article IP-Adresse ermitteln

Replies 15

Sonnenschein
December 18, 2024 at 7:10 PM

Hallo Toadie ,

bei meinem AMD-Rechner ergibt die anfängliche Virtualisierungsabfrage "AMD-V". Ist das analog zu "AMD-VSM"?

Toadie
December 18, 2024 at 7:14 PM

Hi Sonnenschein,

sicher bin ich mir nicht aber ich denke ja, sollte das gleiche sein.

Siehe hier: https://www.thomas-krenn.com/de/wiki/Virtua…sfunktion_AMD-V


Da ich keine AMD CPU habe kann ich nicht viel dazu sagen :(

Sonnenschein
December 18, 2024 at 7:16 PM

Danke Toadie, für deine schnelle Rückmeldung und den Link.

Zur Sicherheit schaue ich wohl besser selbst in das BIOS meines Rechners rein.

Toadie
December 18, 2024 at 7:18 PM

Naja im schlimmsten Fall bekommst du beim starten eine Fehlermeldung. Kaputt gehen kann nichts ;)

Sonnenschein
December 18, 2024 at 7:33 PM

Hier ein klärender Screenshot des Bios meines Notebooks:

JensA
December 18, 2024 at 7:57 PM
Quote

Docker ist eine freie Software zur Isolierung von Anwendungen mit Hilfe von Containervirtualisierung.

Quelle: Wikipedia

Einzelne Anwendungen, nicht ganze Betriebssysteme! Nur weil es bootet ist es nicht unbedingt das Richtige ;)

Stoppst du Docker, z.B. Neustart des Host, ist der Container weg. Damit alles was du im Container installiert oder konfiguriert hast. Ja, die Daten auf eingebundenem externen Speicher bleiben erhalten aber das System selbst ist wieder ganz frisch und um es zu benutzen muss es wieder eingerichtet, Programme installiert werden. Bei jedem Neustart. Dazu fehlt mir da ein Hinweis in deiner Anleitung.


Davon ab, was übersehe ich, das dem ganzen Vorhaben irgendeinen Sinn verleiht?


Gruß, Jens

Toadie
December 18, 2024 at 9:30 PM
Quote from JensA

Quelle: Wikipedia

Einzelne Anwendungen, nicht ganze Betriebssysteme! Nur weil es bootet ist es nicht unbedingt das Richtige ;)

Stoppst du Docker, z.B. Neustart des Host, ist der Container weg. Damit alles was du im Container installiert oder konfiguriert hast. Ja, die Daten auf eingebundenem externen Speicher bleiben erhalten aber das System selbst ist wieder ganz frisch und um es zu benutzen muss es wieder eingerichtet, Programme installiert werden. Bei jedem Neustart. Dazu fehlt mir da ein Hinweis in deiner Anleitung.


Davon ab, was übersehe ich, das dem ganzen Vorhaben irgendeinen Sinn verleiht?


Gruß, Jens

Display More

Es gibt keinen Hinweis, weil dies hier nicht der Fall ist. Desweiteren kann man Docker Container auch persistent machen - also das die Änderungen gespeichert werden. Hier handelt es sich aber nicht um einen klassischen Docker Container.

JensA
December 18, 2024 at 10:59 PM
Quote from Toadie

Es gibt keinen Hinweis, weil dies hier nicht der Fall ist.

Na dann viel Spass mit Datenverlust. Der Container selbst ist nie persistent - außer man macht Backup vom Containerinhalt. Aber das führt die Nutzung von Docker in dem Szenario noch mehr ad absurdum.

Ich lasse mich mit vernünftigen Quellen aber auch vom Gegenteil überzeugen.

Toadie
December 18, 2024 at 11:10 PM
Quote from JensA

Na dann viel Spass mit Datenverlust. Der Container selbst ist nie persistent - außer man macht Backup vom Containerinhalt. Aber das führt die Nutzung von Docker in dem Szenario noch mehr ad absurdum.

Ich lasse mich mit vernünftigen Quellen aber auch vom Gegenteil überzeugen.

Probier es doch einfach selbst aus.

Ich nutze diesen Container / VM hybriden um gekaufte Adible Inhalte in MP3 zu konvertieren. Funktioniert problemlos.

JensA
December 19, 2024 at 8:57 PM
Quote from Toadie

VM hybriden

Das war das richtige Stichwort, danke. Hab mir das Repo angesehen. Windows läuft als Virtuelle Maschine mittels QEMU. Und das läuft als Docker Container. Das erklärt dass die Windows Installation persistent ist - VM halt.

Der Vorteil gegenüber einer "normalen" VM erschließt sich mir immer noch nicht, aber egal :)

Join the discussion! 5 more replies

Categories

  1. Software-Vorstellung 2
  2. Tutorials zu: Ubuntu 0
  3. Die Kommandozeile 0
  4. Allgemein 4
  5. Tutorials zu: Linux Mint 0
  6. Einstieg in Linux 3
  7. Gaming 5
  8. Netzwerk & Server 3
  9. Linux-News 1
  10. Reset Filter
Discussion Thread 15 replies, last: December 27, 2024 at 9:05 PM
  1. Privacy Policy
  2. Legal Notice
  1. Nutzungsbedingungen
Powered by WoltLab Suite™