# Windows Server Containers: Docker & Cloud-Native für Windows

TL;DR / Management Summary Während Docker oft mit Linux assoziiert wird, bietet Windows Server eine native Container-Runtime. Wir unterscheiden zwischen Windows Server Containers (gemeinsamer Kernel, schnell) und Hyper-V Isolation (eigener Kernel pro Container, maximale Sicherheit). Für Senior Admins ist dies der Weg, um Legacy .NET Apps zu modernisieren, ohne für jede Instanz eine eigene VM auf Proxmox betreiben zu müssen.


# 1. Einführung & Architektur

Die Revolution der Abstraktion.

Ein Windows-Container ist keine VM. Er teilt sich die Systemressourcen und den Kernel des Hosts, isoliert aber das Dateisystem, die Registry und das Netzwerk.

# Die Isolations-Modi

  1. Process Isolation: Der Container läuft direkt auf dem Host-Kernel.
    • Vorteil: Extrem schnell, minimaler RAM-Verbrauch.
    • Voraussetzung: Host und Container-Image müssen die identische Windows-Version haben.
  2. Hyper-V Isolation: Der Container läuft in einer winzigen, optimierten VM.
    • Vorteil: Höhere Sicherheit, Versions-Mix möglich (z.B. Win 2019 Image auf Win 2022 Host).

# Architektur-Übersicht (Mermaid)

graph TD
    subgraph "Windows Server Host"
    KERN[Kernel]
    RES[Hardware Resources]
    end

    subgraph "Process Isolation"
    C1[Container A: IIS]
    C2[Container B: .NET]
    end

    subgraph "Hyper-V Isolation"
    HYP[Mini Hypervisor]
    C3[Container C: Secure App]
    end

    C1 & C2 --> KERN
    C3 --> HYP
    HYP --> KERN

# 2. Einrichtung in der Praxis

Die Runtime vorbereiten.

# Schritt 1: Feature installieren

Install-WindowsFeature -Name Containers
# Optional: Hyper-V für Hyper-V Isolation
Install-WindowsFeature -Name Hyper-V
Restart-Computer

# Schritt 2: Docker / Mirantis Container Runtime

Auf Windows Server nutzen wir meist die Mirantis Container Runtime (früher Docker EE) oder das Open-Source Tool containerd.

# Installation via Provider
Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
Install-Package -Name docker -ProviderName DockerMsftProvider
Start-Service docker

# 3. Deep Dive: Windows Container Images

Nano Server vs. Server Core.

Wählen Sie das richtige Basis-Image für Ihre App:


# 4. Day-2 Operations: Networking

IPs für die Container.

Windows Container nutzen standardmäßig den NAT-Modus.

docker network create -d "transparent" --subnet 10.0.0.0/24 --gateway 10.0.0.1 MyNetwork

# 5. Troubleshooting & “War Stories”

Wenn der Container hakt.

# Top 3 Fehlerbilder

  1. Symptom: “The container image is not compatible with this host”.

    • Ursache: Version-Mismatch im Process-Isolation Modus (z.B. 20H2 Image auf 22H2 Host).
    • Lösung: --isolation=hyperv beim Start nutzen.
  2. Symptom: Container startet, aber der Webserver ist nicht erreichbar.

    • Lösung: Port-Forwarding prüfen (docker ps) und Windows Firewall-Regeln am Host für den Container-Traffic öffnen.
  3. Symptom: Langsames Pulling von Images.

    • Lösung: Lokale Container Registry (z.B. Harbor oder Azure Container Registry) nutzen.

# “War Story”: Das “Timezone” Desaster

Ein Kunde migrierte eine Buchhaltungs-App in einen Windows-Container. Die App berechnete alle Steuern falsch. Analyse: Der Container-Kernel läuft standardmäßig in UTC. Die App erwartete aber “Berlin Time” (CET). Die Entdeckung: Man kann die Zeitzone eines Windows-Containers nicht einfach mit tzutil im laufenden Betrieb ändern (wie bei VMs). Lösung: Wir mussten ein PowerShell-Skript in das Dockerfile einbauen, das die Registry-Keys für die Zeitzone beim Build-Prozess festschreibt. Lehre: Container sind keine “kleinen VMs”, sie sind Prozesse. Prüfen Sie Umgebungs-Annahmen (Zeit, Sprache, Pfade) doppelt!


# 6. Monitoring & Reporting

Container-Health.

# WMI / PerfMon

Nutzen Sie den Counter Hyper-V Container \ % Processor Time auf dem Host, um zu sehen, welcher Container die CPU stresst.


# 7. Fazit & Empfehlung

Windows Containers sind das ideale Werkzeug für die Cloud-Transformation.


# Anhang: Cheatsheet

Aufgabe Befehl
Image suchen docker search microsoft
Container starten docker run -d -p 80:80 --name web iis
In Container springen docker exec -it web powershell
Logs ansehen docker logs web
Images bereinigen docker image prune -a

# Referenzen