Nous verrons dans cet article comment installer dans une VM Virtualbox un Windows Server 2016 équipé du docker-engine, et rendre ce docker-engine accessible depuis le client Docker de votre Mac.

Note: on peut faire à peu près la même chose sur un Linux ou un Windows. D’ailleurs si vous avez un Windows 10 Pro mis à jour avec la version Anniversary, vous avez déjà la possibilité d’installer un docker-engine.

 

Pré-requis

Vous devez avoir installé Virtualbox et le client Docker sur votre Mac. Le plus simple est d’installer Docker Toolbox.

Je n’expliquerai pas le fonctionnement de Docker et de Virtualbox, je considère que vous savez ce que désignent les termes VM, host, image, container, engine… dans ce contexte.

Enfin il vous faudra une connexion internet stable et rapide. Il m’a fallu 3h pour télécharger l’image windowsservercore en Adsl à 10Mbits/s.

 

Windows Server 2016

Commencez par télécharger une iso Windows Server 2016 Final. Microsoft propose des versions d’évaluation actives 180 jours à cette adresse : https://www.microsoft.com/en-us/evalcenter/evaluate-windows-server-2016
Vous pouvez aussi utiliser une autre source d’iso si vous préférez.

Dans l’interface Virtualbox, créez une VM :

  • Type Microsoft Windows, version “Other Windows (64-bit)”
  • 2 Go de RAM minimun (j’ai mis 8 Go pour être à l’aise)
  • Créez un disque VDI de 40 Go “dynamiquement alloué” (les images Windows Containers peuvent faire plusieurs Go et Microsoft recommande 32 Go).

Revenez dans la configuration de votre VM :

  • Dans la section Système, Processeur, assignez 2 vCPU.
  • Dans la section Stockage, montez votre iso Windows Server 2016 comme disque virtuel.
  • Enfin, dans la partie Réseau, activez la seconde interface réseau en mode “Réseau privé hôte”. Elle servira à accéder au docker-engine depuis votre Mac.

Démarrez la VM, choisissez une langue, puis “installer” pour commencer l’installation de Windows. Suivez l’assistant d’installation en choisissant :

  • Système “Windows Server 2016 Standard (Desktop experience)”
  • Installation personnalisée
  • Saisissez un mot de passe administrateur avec majuscule, chiffres et caractères spéciaux

Vous verrez ensuite un joli fond d’écran vous demandant d’appuyer sur Ctrl+Alt+Delete.
Sous Virtualbox ça se fait via le menu Input > Keyboard > Insert Ctrl+Alt+Delete.

Une fois loggué, Windows ouvre automatiquement le gestionnaire de serveur.

Pour plus de détails sur l’installation, avec des copies écrans :
http://blog.arungupta.me/windows-server-2016-virtualbox-getting-ready-docker/

 

Installation du docker-engine

Une fois l’installation terminée, mettez à jour le serveur via Windows Update. Docker refusera de s’installer dans le cas contraire.

Vous trouverez Windows Update avec un clic sur le Menu Démarrer, puis tapez

  • update” pour un Windows anglais,
  • consulter les mises à jour” si vous êtes en français.

Installez toutes les mises à jour et redémarrez autant de fois que nécessaire.

Ouvrez un terminal Powershell Admin.
Ajoutez le “store” NuGet et installez docker-engine
# Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force
# Install-Module -Name DockerMsftProvider -Force
# Install-Package -Name docker -ProviderName DockerMsftProvider -Force

Puis redémarrez le serveur :
# Restart-Computer -Force

Vous devriez maintenant pouvoir utiliser le client Docker sous Windows. Ouvrez une fenêtre de commande et exécutez la commande docker version. Vous devriez obtenir ces informations :

win-win.png

 

Depuis mon Mac

Ouvrez le panneau de configuration du firewall pour autoriser la réponse aux pings.
Dans le menu Démarrer, tapez :

  • [en] “firewall” et choisissez “Windows Firewall with advanced security
  • [fr] “pare-feu” et choisissez “Pare-feu Windows avec fonctions avancées de sécurité

firewall.png

Dans les règles de trafic entrant (Inbound rules), activez :

  • [en] “File and printer Sharing (Echo Request – ICMPv4-In)
  • [fr] “Partage de fichiers et d’imprimantes (Demande d’écho - Trafic entrant ICMPv4)

Source: https://www.rootusers.com/how-to-enable-ping-in-windows-server-2016-firewall/

Revenez dans Powershell.
Ajoutez une règle firewall pour autoriser les connexions entrantes sur le port 2375 :
# netsh advfirewall firewall add rule name="docker engine" dir=in action=allow protocol=TCP localport=2375

Pour que le docker-engine écoute sur les interfaces réseau, recréez le service Windows “docker” avec de nouvelles options :
# Stop-Service docker
# dockerd --unregister-service
# dockerd -H npipe:// -H 0.0.0.0:2375 --register-service
# Start-Service docker

Source: https://blog.docker.com/2016/09/build-your-first-docker-windows-server-container/

Ensuite, utilisez ipconfig pour récupérer l’adresse IP de votre VM. Vous en avez deux :

  • L’une en 10.x.x.x correspond à la première interface réseau en NAT permettant à votre VM d’accéder au net,
  • L’autre en 198.168.x.x est celle de l’interface “Réseau privé hôte”. Nous allons l’utiliser pour lancer des containers depuis le client Docker de votre Mac.

Ouvrez un terminal dans votre Mac.
Commencez par vérifier que vous pinguez votre VM. Si la VM répond, ajoutez la variable d’environnement DOCKER_HOST pour indiquer au client docker qu’il doit discuter avec le docker-engine de la VM Windows.
$ export DOCKER_HOST=tcp://192.168.x.x:2375

Note : L’IP peut changer à chaque redémarrage de votre VM, en particulier si vous avez plusieurs VMs.

Vous pouvez maintenant passez des commandes docker au docker-engine Windows depuis votre Mac. Vérifiez avec docker version, on voit l’architecture windows/amd64 côté serveur et darwin/amd64 côté client.

mac-win.png
 

Récupérer les images des Windows Containers

Vous allez maintenant vous lancer dans le téléchargement des deux images Docker utilisées comme base de tous les Windows Containers :

  • nanoserver, 800 Mo de téléchargement
  • windowsservercore, 3,7Go de téléchargement

Très important : avant de lancer le pull, pensez à brancher votre Mac et désactiver la mise en veille. Le téléchargement doit se faire en une fois.

Revenez sous Windows et ouvrez une fenêtre de commande.
Je lance ces commandes sous Windows pour éviter une éventuelle déconnexion du client Docker de votre Mac, mais ça devrait fonctionner depuis le client Docker sur Mac.

$ docker pull microsoft/nanoserver
Allez vous préparer un café.

$ docker pull microsoft/windowsservercore
Faites vous un bon film en buvant votre café. Sauf si vous avez la fibre, vous en avez pour 2h.

Une fois ces deux images téléchargées, extraites et vérifiées, vous pouvez les lister avec :
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
microsoft/nanoserver latest 787d9f9f8804 2 weeks ago 918.3 MB
microsoft/windowsservercore latest f49a4ea104f1 2 weeks ago 9.196 GB

Si tout a fonctionné, profitez de cet instant de satisfaction pour faire un snapshot de votre VM, vous pourrez la cloner pour créer de nouvelles VM prêtes à l’emploi pour docker.

 

Hello Windows Containers

Tentez maintenant d’instancier un container depuis l’image windowsservercore :

$ docker run microsoft/windowsservercore cmd /c echo Hello world
Hello world

Félicitation, vous êtes arrivés au bout de ce tutoriel.