Windows- und Linux-basierte Docker-Container auf Windows nutzen (Teil 1 von 2)

Microsoft hat mittlerweile nicht nur in Windows 10 und Windows Server 2016, sondern auch in Visual Studio eine Unterstützung für Docker-Container eingebaut. Wie sie zu installieren und einzusetzen ist, soll ein Zweiteiler zeigen.

Werkzeuge  –  4 Kommentare
Windows- und Linux-basierte Docker-Container auf Windows nutzen (Teil 1 von 2)

Docker ist in aller Munde, und im letzten Jahr hat Microsoft verstärkt Bemühungen unternommen, um die Containertechnik auch Nutzern des eigenen Betriebssystems zugänglich zu machen. Vorweg sei erwähnt, dass einige Werkzeuge für Docker auf Windows noch in den Kinderschuhen stecken, was man an Versionsnummern wie "0.1" sowie dem Fehlen automatischer Installationen und der zum Teil sehr spärlichen Dokumentation erkennt.

Um den Einsatz von Docker auf Windows einmal exemplarisch durchzugehen, soll im Folgenden ein Windows-10-Rechner zum Einsatz kommen. Mindestvoraussetzung ist die Version 1607 (alias Anniversary Update) vom August 2016 in den Varianten Professional, Enterprise oder Education. Als Entwicklungsumgebung wird hier Visual Studio 2017 Update 2 genutzt, das die Docker-Werkzeuge bereits enthält. Alternativ kann man ein Add-on für Visual Studio 2015 nutzen, das aber in der Preview-Phase stecken geblieben ist.

Vor dem ersten Schritt muss Docker auf Windows 10 installiert werden, da das Betriebssystem in der Grundinstallation keine Container-Unterstützung mitbringt. Dabei ist zu berücksichtigen, dass es zwei Container-Implementierungen für Windows 10 gibt:

  1. "Hyper-V Windows Container" von Microsoft für Windows-basierte Container
  2. "Docker for Windows" von der Firma Docker Inc. für Linux-Container

Auf Windows Server 2016 gibt es zusätzlich noch "Windows Server Container", die ohne Hyper-V auskommen (siehe Abbildung 1). Für ältere Windows-Version gibt es von Docker die Docker Toolbox. In diesem Beitrag wird zunächst ein Windows- und anschließend ein Linux-Container erstellt.

Es gibt mittlerweile vier Varianten zum Betrieb von Containern auf Windows (Abb. 1).


Leider ist die Docker-Host-Installation auf Windows 10 mit mehreren Schritten verbunden. Das folgende Listing zeigt dafür ein mit Administratorrechten auszuführendes Installationsskript, das nach der Windows-Feature-Installation und dem dann notwendigen Betriebssystemneustart in Schritt 1 ein weiteres Mal aufzurufen ist, um die Docker-Werkzeuge zu laden. In Schritt 2 installiert das Skript im Verzeichnis C:\Program Files\Docker die Kommandozeilenbefehle docker.exe (Docker client) und dockerd.exe (Docker Server). Letzterer wird als Windows-Systemdienst mit Namen "Docker" eingerichtet. In Schritt 3 folgen noch der Download und die Installation der PowerShell-Commandlets für Docker, die auf der ".NET (C#) Client Library für das Docker Remote API" basieren und sich mit Version 0.1 noch in einem früheren Entwicklungsstadium befinden. Die aktuellen Download-URLs sind in der Dokumentation oder auf GitHub nachzulesen und oben im Skript einzutragen. Leider hat Microsoft das PowerShell-Modul für Docker bislang noch nicht in der PowerShell Gallery veröffentlicht, was eine vereinfachte Installation mit dem Install-Modul ermöglicht hätte (Pfeile zeigen im Folgenden lediglich formatbedingte Zeilenumbrüche an).

[string] $AktuelleDockerSetupUrl = "https://get.docker.com/builds/Windows/↵
x86_64/docker-17.03.0-ce.zip"
[string] $AktuelleDockerPowerShellUrl = "https://github.com/Microsoft/↵
Docker-PowerShell/releases/download/v0.1.0/Docker.0.1.0.zip"

function Test-IsAdmin {
([Security.Principal.WindowsPrincipal] ↵
[Security.Principal.WindowsIdentity]::GetCurrent())↵
.IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")
}

if (-not (Test-IsAdmin)) { Write-Error "Skript erfordert Admin-Rechte!"; ↵
return }

# -------------- Schritt 1
"Installation Windows Container auf Windows 10 - Schritt 1 (Windows-Features)"

[bool] $restart = $false
if ( (Get-WindowsOptionalFeature –Online -FeatureName containers)↵
.State -ne "Enabled")
{
Enable-WindowsOptionalFeature -Online -FeatureName containers -All
$restart = $true
}

if ( (Get-WindowsOptionalFeature –Online -FeatureName Microsoft-Hyper-V)↵
.State -ne "Enabled")
{
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
$restart = $true
}

if ($restart -eq $true) { Restart-Computer -Force; return; }

# -------------- Schritt 2
"Installation Windows Container auf Windows 10 - Schritt 2 (Docker-Werkzeuge)"

# Registry-Einstellung für Docker
Set-ItemProperty -Path 'HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion↵
\Virtualization\Containers' -Name VSmbDisableOplocks -Type DWord -Value 0 -Force

# Docker-Werkzeuge herunterladen. Achtung: Versionsnummer kann sich ändern!
$tempname = "c:\temp\docker-setup.zip"
Invoke-WebRequest $AktuelleDockerSetupUrl -OutFile $tempname -UseBasicParsing
Expand-Archive -Path $tempname -dest $env:ProgramFiles

# Umgebungsvariablen setzen im RAM
$env:path += ";$env:ProgramFiles\Docker"
# Umgebungsvariablen setzen persistent
$existingMachinePath = [Environment]::GetEnvironmentVariable("Path",↵
[System.EnvironmentVariableTarget]::Machine)
[Environment]::SetEnvironmentVariable("Path", $existingMachinePath + ↵
";$env:ProgramFiles\Docker", [EnvironmentVariableTarget]::Machine)

# Docker als Dienst starten
dockerd --register-service
Start-Service Docker
Get-Service Docker
docker --version

# -------------- Schritt 3
"Installation Windows Container auf Windows 10 - Schritt 3 (PowerShell-Modul)"

# PowerShell-Modul herunterladen. Achtung: Versionsnummer kann sich ändern!
$tempname = "c:\temp\docker-powershell-setup.zip"
Invoke-WebRequest $AktuelleDockerPowerShellUrl -OutFile $tempname -UseBasicParsing
Expand-Archive -Path $tempname -dest "$Home\Documents\WindowsPowerShell\↵
Modules\Docker"
Get-Command -Module Docker

Um zu prüfen, ob die Installation erfolgreich war, können Nutzer abfragen, ob der Docker-Dienst läuft (in der PowerShell: Get-Service Docker), was die aktuelle Version des Docker-Kommandozeilentools ist (docker-compose --version), und die Verfügbarkeit der zurzeit 38 PowerShell-Commandlets via Get-Command-Module Docker testen. Microsoft stellt unter https://aka.ms/Debug-ContainerHost.ps1 ein Diagnoseskript bereit, das Installation- und Konfigurationsfehler aufdecken kann.