Neuigkeiten von trion.
Immer gut informiert.

Docker Container unter Windows betreiben

docker-small

Unsere Docker-Schulungen werden in der letzten Zeit sehr häufig angefragt. Damit ist zumeist Docker unter Linux gemeint, also native Linux-Container auf nativen Linux-Systemen. So weit so klar.

Mit dieser Klarheit ist es allerdings schnell vorbei, wenn Docker für Windows angefragt wird. Hier gibt es nämlich einen bunten Strauss an Optionen und Werkzeugen. Grund genug mit diesem Artikel für Klarheit zu sorgen!

Docker und native Windows Container auf Windows-Server

Neben der typischen Windows-Server Virtualisierung via Hyper-V lassen sich leichtgewichtige Windows Container betreiben und via docker CLI verwalten.

Dazu sind lediglich einige Features zu installieren (Powershell mit Admin-Rechten):

> Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
> Install-Package -Name docker -ProviderName DockerMsftProvider
> Restart-Computer -Force

Der Docker-Daemon kann nun als System-Dienst gestartet werden:

> Start-Service Docker

Anschliessend können Docker-Container angelegt und verwaltet werden, z.B. das altbekannte hello-world, dass auf Docker-Hub auch als Windows-Variante verfügbar ist.

> docker pull hello-world
> docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
...

Hierbei handelt es sich wohlgemerkt nicht um einen virtualisierten Linux-Container, sondern um echtes natives Windows!

> docker image inspect hello-world
[
    {
        "Id": "sha256:17355e81ee5faeabab9e50b541b40544de8aa52c23e9afea68463f76d985bf1e",
        ...
        "ContainerConfig": {
            "Hostname": "88f8bddfe3bd",
            "Domainname": "",
            "User": "ContainerUser",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": null,
            "Cmd": [
                "cmd",
                "/S",
                "/C",
                "#(nop) ",
                "CMD [\"cmd\" \"/C\" \"type C:\\\\hello.txt\"]"
            ],
            ...
        },
        ...
        "Architecture": "amd64",
        "Os": "windows",
        "OsVersion": "10.0.17763.3165",
        ...
    }
]

Selbstverständlich kann auch ein Port-Mapping in Richtung Windows-Host durchgeführt werden, z.B. für den Container-Verwalter Portainer:

> docker run -P -d --rm --name portainer portainer/portainer-ce
> docker port portainer
8000/tcp -> 0.0.0.0:50054
9000/tcp -> 0.0.0.0:50053
9443/tcp -> 0.0.0.0:50052

Docker und native Windows Container auf Windows Professional 10/11

Es wäre viel zu einfach, wenn man das Verfahren für Windows-Server auch für Windows-Professional Systeme verwenden könnte. Leider setzt dies die zusätzliche Installation von Docker Desktop voraus.

Aber eins nach dem anderen…​

Zunächst müssten die passenden Features Container und Hyper-V installiert werden:

features

Und natürlich muss das System neu gestartet werden.

Da es sich bei Docker Desktop um ein Hybrid-Docker handelt (d.h. es kann sowohl native Windows Container als auch via Hyper-V / WSL2 virtualisierte Linux-Container ausführen), sollte zusätzlich das Windows Subsystem for Linux in der Version 2 installiert werden:

> wsl --install

Jetzt endlich können wir zu der Installation unseres Docker Desktop kommen:

> Start-Process '.\Docker Desktop Installer.exe' -Wait install

Fertig! Fertig? Nein. Um die nativen Window Container zu aktivieren, muss aktiv gewechselt werden:

switch

Anschliessend können wir wie auf den Windows Server Systemen nativ dockern!

> docker run -it mcr.microsoft.com/windows/servercore:ltsc2022 powershell
Unable to find image 'mcr.microsoft.com/windows/servercore:ltsc2022' locally
ltsc2022: Pulling from windows/servercore
97f65a0ec59e: Downloading [===>                                               ]    107MB/1.437GB
e1a27cb9d461: Downloading [======>                                            ]  110.8MB/863.4MB

In diesem Beispiel wird ein Windows Server virtualisiert. Daher die massive Datenmenge…​

Docker und WSL2 Linux Container auf Windows Professional 10/11

Macht die native Windows Containerisierung Sinn? Das kommt natürlich auf das Einsatz-Szenario an. In den allermeisten Fällen (Image-Verfügbarkeit!) wird man wahrscheinlich Linux Container bevorzugen.

Auch diese lassen sich via Docker Desktop virtualisieren. Einfach mittels "Switch to Linux Container…​" zurück wechseln:

switch-back

Dabei muss man sich aber immer vergegenwärtigen, dass via Hyper-V / WSL2 virtualisiert wird, d.h. auch wenn die WSL-Entwickler bei Microsoft sich viel Mühe gegeben haben, die Performanceschmerzen zu lindern: Wenn man die Chance hat, Docker auf einem nativen Linux zu verwenden, dann sollte man diese Option favorisieren!

Docker in einer WSL2 Linux Distribution auf Windows Professional 10/11

Mittels WSL2 kann man komplette Linux-Distributionen unter Windows verwenden, z.B. Ubuntu

> wsl --install -d Ubuntu

Damit kann man via Package-Installer auf eine Vielzahl von Linux-Werkzeugen zugreifen, z.B. Docker:

ubuntu

Leider verfügen WSL2 Linux-Distributionen nicht über ein separates System-Dienste Subsystem. Um Linux Container zu verwalten, wird daher ein Docker-Daemon benötigt! Im Docker Desktop muss der Zugriff dazu noch freigegeben werden:

wsl-ubuntu

WSL2 Linux Container auf Windows Professional 10/11 mit Rancher Desktop

Eine weitere, weniger bekannte Möglichkeit, Linux Container ohne Docker Desktop zu verwenden ist die Verwendung von Rancher Desktop. Diese Anwendung fungiert eigentlich dazu, mit wenig Aufwand einen Kubernetes Cluster aufzusetzen; man kann allerdings auch via Docker CLI aus einer WSL Distribution heraus Linux-Container verwalten, z.B:

rd-auswahl
rd-wsl

Fazit

Bei der beschriebenen mannigfaltigen Auswahl stellt sich natürlich die Frage, für welche Anwendungsfälle welche Werkzeuge / Features geeignet sind.

  • Server-Betrieb

Für den Betrieb von Windows-Containern bietet sich der native Betrieb auf Windows-Server (2016, 2019, 2022) Systemen an; die Systeme bringen die dazu notwendige Infrastruktur (inbesondere den Docker-Daemon) als auch die Werkzeuge mit (Docker-CLI).

Für den Betrieb von Linux-Containern bietet sich entsprechend der native Betrieb auf Linux-Serversystemen / Kubernetes-Clustern an.

  • Entwicklersysteme (Windows)

Um auf Entwicklersystemen (meist dürfte dies Windows Professional sein) Windows-Container oder Linux-Container zu verwenden bietet sich der Einsatz von Docker Desktop mit aktiviertem Windows-Container- und WSL2-Feature (für virtualisierte Linux-Container) an. Dabei bitte die Lizenzbedingungen für den kommerziellen Einsatz beachten!

Empfohlen sei hier die zusätzliche Installation einer passenden Linux-Distribution (der Autor präferiert ubuntu) basierend auf WSL2. Dadurch steht auf dem Entwicklersystem die gewaltige Funktionalität von Linux-Werkzeugen zur Verfügung.

  • Buildsysteme (CI/CD)

Buildsysteme sind meist operativ gesetzt und basieren auf Linux. Damit können Linux-Container im Rahmen von Integrationstests verwendet werden (z.B. Testcontainers).

Sollen Windows-Container verwendet werden, dann sind passende Windows-Server Systeme (virtualisiert oder physikalisch) aufzusetzen und aus dem Buildsystem "passend" zu steuern. Beispielsweise stellt jenkins dafür Agenten zur Verfügung.




Zu den Themen Docker und Kubernetes bieten wir sowohl Beratung, Entwicklungsunterstützung als auch passende Schulungen an:

Auch für Ihren individuellen Bedarf können wir Workshops und Schulungen anbieten. Sprechen Sie uns gerne an.

Feedback oder Fragen zu einem Artikel - per Twitter @triondevelop oder E-Mail freuen wir uns auf eine Kontaktaufnahme!

Los geht's!

Bitte teilen Sie uns mit, wie wir Sie am besten erreichen können.