Hyper-V Containers dans Windows 10

Les conteneurs -et Docker !- débarquent sur Windows et c'est une bonne chose. Sur Windows Server 2016 bien sûr, mais aussi sur Windows 10 version 1607 Anniversary Update, disponible depuis le 2 août 2016.

Je m'intéresse aujourd'hui aux conteneurs Windows Hyper-V, sur Windows 10 version 1607. Il est important de le préciser car on est passé en quelques mois de *rien* à un nombre non négligeable de manières d'utiliser des conteneurs sur Windows :

En effet nous avons tout d'abord Docker et ses conteneurs LXC dans une machine virtuelles Linux :

  • Docker Toolbox, utilisant une machine virtuelle Linux (Boot2Docker) dans VirtualBox. Il est possible d'utiliser Hyper-V à la place de VirtualBox avec Docker Machine, mais Docker Toolbox est dans la pratique remplacé par Docker for Windows.
  • Docker for Windows (https://www.docker.com/products/docker#/windows), utilisant la dernière version du Docker Engine dans une machine virtuelle Alpine Linux dans Hyper-V.

Nous avons maintenant des conteneurs Windows, pour exécuter des applications Windows :

  • Windows Server Containers sur Windows Server 2016 (isolation de process, comme avec Docker sous Linux)
  • Hyper-V Containers sur Windows Server 2016 (isolation de machines virtuelles)
  • Hyper-V Containers sur Windows 10 (idem, mais sous Windows 10 1607)

Sous Windows Server nous pouvons exécuter des images basées sur Windows Server Core et Nano Server. Sous Windows 10, le cas qui m'intéresse aujourd'hui, nous avons droit à l'image Nano Server. Rappelons en effet qu'il s'agit de fournir la fonctionnalité des conteneurs à des développeurs, et que cela concerne des applications serveurs.

La beauté de la chose est que, pour les conteneurs Windows comme pour les conteneurs Linux, nous utilisons Docker pour leur gestion. Donc simplement pour nos containers Windows nous aurons dockerd.exe pour le moteur Docker, et docker.exe pour le client. Et donc la même commande docker que l'on connait sous Linux. Pouvait-on faire plus simple ?

Les choses étant ce qu'elles sont, il se trouve que les documentations actuelles concernant les conteneurs sous Windows 10 ne sont pas parfaites, et que cela ne fonctionne pas toujours comme escompté..

Voici la documentation "officielle" :
https://msdn.microsoft.com/en-us/virtualization/windowscontainers/quick_start/quick_start_windows_10

À ce jour (mi-août 2016), elle ne fonctionne pas immédiatement. Dans ma procédure simplifiée ci-dessous, je récupère une version plus récente de Docker, la version 1.13.0-dev, qui fonctionne, au moins dans mon cas. Voici donc comment, sur un Windows 10 1607 (Pro ou Enterprise), installer et utiliser les conteneurs Hyper-V.

Version courte :

  • Installer la fonctionnalité Containers et Hyper-V, puis rebooter.
  • Désactiver les "OpLocks" (petite limitation actuelle…)
  • Récupérer dockerd.exe et docker.exe depuis https://master.dockerproject.org/
  • Exécuter dockerd.exe (comme un service ou simplement dans un cmd.exe à part)
  • Récupérer l'image Nano Server : docker pull microsoft/nanoserver
  • Tester : docker run --rm -it microsoft/nanoserver cmd.exe

Version détaillée :

Tout d'abord, dans un PowerShell en tant qu'administrateur, installer la fonctionnalité Containers et Hyper-V, et rebooter :

Enable-WindowsOptionalFeature -Online -FeatureName containers -AllEnable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -AllRestart-Computer -Force

Après le redémarrage, toujours dans un PowerShell administrateur, désactiver les "OpLocks" (le copier-coller s'impose ici) :

Set-ItemProperty -Path 'HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers' -Name VSmbDisableOplocks -Type DWord -Value 1 -Force

Créer le répertoire docker dans Program Files et ajouter ce répertoire dans le PATH système (optionnel mais pratique) :

mkdir "$env:ProgramFiles\docker"[Environment]::SetEnvironmentVariable("Path", $env:Path + ";$env:ProgramFiles\docker\", [EnvironmentVariableTarget]::Machine)

Quitter et redémarrer PowerShell en mode administrateur, pour bénéficier du PATH ainsi modifié.

Aller dans le nouveau répertoire docker :

cd "$env:ProgramFiles\docker"

Récupérer dockerd.exe et docker.exe :

Invoke-WebRequest https://master.dockerproject.org/windows/amd64/dockerd.exe -OutFile dockerd.exeInvoke-WebRequest https://master.dockerproject.org/windows/amd64/docker.exe -OutFile docker.exe

Vérifier la version de dockerd.exe et docker.exe :

dockerd.exe --versiondocker.exe --version

À l'heure où j'écris ceci, le résultat est :

Docker version 1.13.0-dev, build 92b10b4

À ce stade il s'agit de démarrer dockerd.exe. La doc "officielle" préconise de l'exécuter en tant que service, après l'avoir enregistré. Mon avis est de ne pas se précipiter ici, et de garder cela pour la suite, quand le fonctionnement sera validé. Donc pour l'instant, ouvrir une autre ligne de commande en administrateur (un cmd.exe suffit, PowerShell n'est plus utile à ce stade). Dans cette seconde fenêtre, lancer dockerd.exe, éventuellement avec l'option --debug. Le gros avantage de cette méthode est que cela fournit un affichage en temps réel du fonctionnement de dockerd, ce qui n'est pas possible en l'exécutant en tant que service.

Donc, dans cette seconde fenêtre :

cd "\Program Files\docker"dockerd.exe --debug

Retourner dans la première fenêtre et vérifier la connexion entre le client et le serveur :

docker info

Si tout est OK, récupérer l'image de Nano Server :

docker pull microsoft/nanoserver

Et finalement, tester votre premier container Nano Server sur Windows 10 :

docker run --rm -it microsoft/nanoserver cmd.exe

Si tout se passe bien, le container démarre et vous avez accès à son cmd :

Windows 10 Containers

A partir de là tout est permis, si vous avez l'habitude de Docker dans d'autres environnements vous ne devriez pas être trop perdus.

Pour quitter la démo : tapez exit dans le container, et le fait d'avoir utilisé l'option --rm lors de son démarrage le supprimera dès sa sortie. Pour quitter le moteur dockerd, tapez simplement Ctrl+C dans sa console.

Par la suite si vous souhaitez enregistrer dockerd en tant que service, il suffit d'exécuter :

dockerd.exe --register-service

et pour démarrer le service, depuis PowerShell :

start-service docker

Retrouvez la documentation complète des conteneurs Windows sur la page :

https://msdn.microsoft.com/virtualization/windowscontainers/containers_welcome