Windows Server 2016 et la révolution des conteneurs

Microsoft se tourne vers l'avenir du Cloud privé avec l'ajout des conteneurs d'applications au sein de Microsoft Server 2016. Voici une analyse de l'implémentation de ces fonctionnalités en commençant par un rappel sur ce qu'est un conteneur.

Rappels sur les conteneurs

Qu’est-ce qu’un container ?

Docker est le logiciel le plus populaire permettant l'embarquement d’application dans un container virtuel qui pourra s'exécuter sur n'importe quel serveur. D'abord optimisé pour Linux, il l'est désormais pour Windows Server depuis la version 2016. L’objectif est de faciliter le déploiement d'application, ainsi que la gestion de l’infrastructure système.
 
Contrairement aux machines virtuelles traditionnelles, un conteneur Docker n'inclut pas de système d'exploitation. En effet, les conteneurs s’appuient sur les fonctionnalités du système d’exploitation du système hôte. Du côté des performances Docker faut aussi bien, voir même mieux que les systèmes de virtualisation classiques. IBM a même comparé les deux technologies via une étude de performance entre Docker et KVM.
 
Le premier avantage qu’il en ressort est la légèreté du conteneur. Cette légèreté permet un lancement plus rapide et une migration plus facile du conteneur vers un autre serveur physique. Un cas pratique d’utilisation est le passage d’un environnement de développement à celui de production de manière très rapide. Cette légèreté et simplicité permettent également aux développeurs de disposer rapidement d’un environnement de développement pour effectuer des tests ou des POCs.

Comment fonctionne Docker ?

Docker utilise des images pour créer des conteneurs. L’instance d’une image est donc appelée conteneur. Ces images permettent d’organiser son infrastructure par l’applicatif : le conteneur ne contient que les élements vitaux des application ce qui permet de se recentrer sur l'applicatif et non le système comme avec la virtualisation. Des images “de base” existent déjà, mais il est possible de construire les siennes grâce au système d’héritage d’images. Cette fonctionnalité permet de personnaliser sa banque d’image en fonction de ses besoins tout en limitant la duplication de données et en faisant abstraction de la couche système.

Les conteneurs sur Windows Server 2016

Windows Server 2016 introduit deux types de conteneurs différents qui ont leurs avantages et leurs inconvénients. Ces deux types de conteneurs sont directement basés sur Docker.

Les Windows Server Containers

Nous avons d’abord les Windows Server Containers. Ils assurent l’isolation des applications par rapport au système d’exploitation. Ce dernier est commun avec l’hôte et avec chacun des conteneurs exécutés par l’hôte. Les performances sont très bonnes du fait du partage direct des ressources entre le conteneur et l’hôte. 
De ce fait, l’isolation n’est pas totale, ce qui permet de faire sortir et de partager certaines données ou API’s d’un conteneur. Pour éviter des problèmes de sécurité, il faut par conséquent utiliser ces conteneurs au sein d’un environnement sécurisé et maîtrisé. 

Les Hyper-V Containers

Pour pallier au problème de sécurité, il existe les Hyper-V Containers. Ils enrichissent l’isolation fournie par les Windows Server Containers avec Hyper-V, le système de virtualisation de Microsoft. Hyper-V est utilisé pour isoler les ressources processeur, la mémoire et les Input/Output du reste du système. Dans cette configuration, chaque conteneur Hyper-V dispose de son propre noyau Windows. En ce qui concerne la sécurité, un conteneur Hyper-V est à mi-chemin entre le conteneur Windows Server et la machine virtuelle Hyper-V classique avec virtualisation matérielle. Ces spécificités font que le temps de démarrage est plus long que pour un conteneur Windows Server. De même le temps d’exécution en est ralenti.
 
 
S’ils ont leurs spécificités, ils ont aussi énormément de points communs. Les images des conteneurs Windows sont communes aux conteneurs Windows Server et Hyper-V. Dans le cadre du partenariat entre Docker et Microsoft ces types de conteneurs sont également tous les deux complètement pris en charge par Docker. Il est important de noter que Docker sur Windows ne permet pas encore la création et l’utilisation de conteneurs Linux.

Installation et création d’un premier conteneur

Installation de docker

Avant de déployer des conteneurs, il faut installer l’application de manipulation de conteurs de Docker.  L’installation se fait via le module PowerShell de fournisseur OneGet. 
 
Dans une fenêtre PowerShell en administrateur, il faut d’abord vérifier les mises à jour avec la commande suivante :
 

sconfig

Sélectionnez l’option 6, une fenêtre cmd s’ouvre, cliquez sur T.
 
 
Ensuite, installez le module PowerShell OneGet.
 
Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
 
On installe la dernière version de Docker via OneGet
 
Install-Package -Name docker -ProviderName DockerMsftProvider
 
Ensuite, redémarrez  l’ordinateur pour terminer l’installation de Docker
 
Restart-Computer -Force

Création d’un conteneur IIS

La création d’un conteneur se fait par le biais d’un Dockerfile. Le Dockerfile de cet exemple décrit le déploiement d’un site internet sur un serveur web IIS en se basant sur l’image Docker officielle IIS disponible sur le hub de docker.
 
Pour cela, créez un Dockerfile nommé Dockerfile dans le dossier de votre choix. A noter qu’à l’heure actuelle, Docker au sein d’un environnement Windows ne supporte pas totalement les dossiers avec des espaces au sein de leur nom. Le contenu du Dockerfile d'exemple est le suivant : 
 
Dans le répertoire courant on crée un fichier index.html qui sera utilisé par le conteneur et servira de Hello World.

Conteneur Windows Server

On construit l’image pour le conteneur Windows Server que l’on nomme iis-web.
 
docker build -t iis-web .
 
Pour instancier le conteneur et mapper le port 8000, utilisez cette commande.
 
docker run -d -p 8000:8000 --name mon-site iis-web
 
Une adresse IP est associée au conteneur mon-site, pour la récupérer et ainsi accéder à notre site de test utilisez la commande docker inspect
 
docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" mon-site
 
Ainsi en utilisant un navigateur internet sur la machine hôte avec l’IP retourné et le port configuré dans le Dockerfile, nous visualisons notre Hello World.
 
La commande docker stop mon-sit arrête le conteneur.

Conteneur Hyper-V

Avant de pouvoir exécuter un conteneur Hyper-V, il faut installer sur l’hôte Windows Server 2016 le rôle Hyper-V et redémarrer le serveur.  Cette installation peut se faire en mode graphique ou en Powershell avec les commandes suivantes :
 
Install-WindowsFeature hyper-v
Restart-Computer -Force
 
Comme dit précédemment, les deux types de conteneurs sont basés sur les mêmes images, le "seul" changement visible lors du lancement du conteneur est l’utilisation du paramètre --isolation=hyperv.
 
docker run -d -p 8000:8000 --name mon-site iis-web --isolation=hyperv
 
 
Le résultat visible est presque le même qu’avec un conteneur Windows Server classique.  Cependant sur l’hôte, le processus vmwp est visible, qui correspond à la fonctionnalité Hyper-V en cours d’exécution qui encapsule le conteneur afin d’isoler les processus de celui-ci.
 
Le moteur Docker (Docker deamon ou Dockerd) combiné au client Docker (docker.exe, l’outil de gestion de conteneurs) permet une utilisation encore bien plus poussée du système de conteneurs que ce qui vient d’être expérimenté durant ce billet. On peut par exemple configurer la façon dont le démon accepte les requêtes entrantes ou encore personnaliser les options de gestion du réseau. Cette modularité permet d’adapter son environnement IT avec la vision et l’organisation interne de chacun. 
 
 
Julien Dutartre

Consultant Systèmes et Réseaux - DevOps