Docker Desktop supporte WSL2

2019-11-24 par Badre BSAILA

Bonne nouvelle pour ceux qui développent pour Linux sous une configuration Windows, les équipes de Docker et Microsoft collaborent depuis plusieurs mois pour arriver à une mouture de Docker Desktop, qui n’utilise plus la VM MobyLinux sous Hyper-V, mais plutôt le noyau Linux embarqué sous Windows appelé communément Windows Sub-system for Linux (WSL). Aujourd’hui ils sont arrivés à un stade assez avancé, d’un côté Microsoft vient d’embarquer depuis peu WSL dans sa version 2 sur la build de production de Windows, quand aux équipes de Docker ils ont livré une version expérimentale sur le canal Edge utilisant WSL2 à la demande.

Des conteneurs Linux sur Windows ???

Rappelons que Docker Desktop supporte les conteneurs Windows et Linux pour son client de Windows. Builder et lancer un conteneur fait pour Windows dans une machine Windows is no big deal. Mais comment le faire pour un conteneur Linux, sachant que ce dernier est fortement lié à son système d’exploitation cible (lire dans un système de fichiers ou envoyer/recevoir du trafic réseau sont faits différemment sur les 2 OS). Pour contourner le problème, Docker vous crée une VM Linux (appelée MobyLinux) sous l’hyperviseur de Windows Hyper-V et ainsi on peut lancer des conteneurs Linux en faisant tourner cette fois le démon Docker sur cette VM. Un petit schéma explicatif vaut mille mots:

alt Archi de Docker sous Windows

Où est le mal, donc ?

Alors commençons par citer quelques points de doléances :

  • Le démarrage du client Docker sous Windows est trop lent et coûteux en terme de performance car il faut démarrer la VM d’abord.
  • Des défaillances peuvent arriver du moment que la VM MobyLinux ne peut pas démarrer.
  • Passer par une VM pour les opérations I/O est juste trop lent. Par exemple: les développeurs PHP/Symfony ne travaillent pas sur des grosses applications conteneurisées sous Windows pour Linux (PHP est un langage interprété et du coup les opérations de lecture de fichiers sources sont intensives).
  • Les conteneurs Linux ne pouvaient pas accéder à toute la puissance CPU, RAM et de stockage de la machine Windows et il y avait des quotas définis pour ça sur le client Docker.

WSL: délivre-moi

L’équipe de Windows 10 a embarqué la version 2 de WSL en juin 2019 sur une MAJ pour les Windows Insiders. Aujourd’hui elle est disponible sur la version prod ready. Un noyau de Linux réside désormais à côté du noyau traditionnel Windows NT sur lequel tu peux installer plusieurs distributions depuis le Microsoft Store:

How to start

  • D’abord mettez à jour Windows 10 à la dernière version stable.

  • Activez WSL2 sur votre OS en exécutant le script PowerShell et redémarrez la machine après.

  • Installez les distributions de votre choix sur le Microsoft Store.

alt Distro Linux sur MS Store

  • Après la fin de l’installation, vous pouvez démarrer votre distribution Linux depuis le menu de démarrage de Windows 10.

alt Linux dans le menu Windows

  • Et voilà votre shell Linux depuis Windows 10.

alt Linux shell

  • Sur le 1er démarrage, vous devez créer un nouveau compte utilisateur Linux.

alt Linux shell

  • N’oubliez pas de mettre à jour vos distributions.

  • Si vous installez plusieurs distributions, vous pouvez forcer WSL2 à utiliser une de votre choix avec la ligne de commande PowerShell suivante:

Intégration avec Docker

Docker a collaboré avec Microsoft pour créer un client Docker Windows qui utilise WSL2 pour les conteneurs Linux au lieu d’utiliser la VM MobyLinux à la demande. Ils ont livré une preview sur la canal Edge (ce canal est expérimental, non stable et non prod ready). Plusieurs améliorations sont au RDV:

  • Le conteneur peut utiliser toute la puissance CPU, RAM et stockage interne de la machine Windows.
  • Allocation/libération dynamique de ces ressources selon le besoin des conteneurs.
  • Les opérations I/O sont plus performantes puisque qu’on n’utilise plus de VM.
  • Le démarrage du client Docker est plus rapide et moins agressif en ressources.
  • L’utilisation de la VM MobyLinux est toujours celle par défaut, l’intégration avec WSL2 est activé optionnellement dans les paramètres du client Docker.

A noter que Docker est compatible avec WSL2 si vous êtes inscris parmi les Windows Insiders: ils reçoivent les dernières mises à jours et patches de la branche dév de Windows 10 avant qu’elle soient disponibles sur la branche de prod (A noter que ces versions ne sont pas stables et bug-free et qu’ils sont destinées à être testées par les Windows Insiders en preview pour avoir leurs retours avant de les intégrer en prod).

Petit bonus sur WSL 2

Il faut savoir que le projet WSL n’a pas été fait uniquement pour Docker mais pour permettre aux clients des plateformes Microsoft de rester sur ces dernières même s’ils veulent réaliser des projets pour des technologies qui ne sont pas des produits Microsoft en l’occurrence Linux (le fameux slogan de Microsoft: “Any Language, Any Platform”). Pour illustrer les possibilités offertes par WSL2 pour le développement Linux, vous pouvez depuis Windows 10: builder et exécuter le code source du démon docker de Linux et même builder le noyau Linux lui-même :open_mouth:. Mais comment font-ils :flushed: ?

Sans vouloir vous perdre on utilise toujours de la virtualisation. Mais pas dans le sens des VMs traditionnelles. Microsoft désigne ce genre par Lightweight utility VM ou single purpose VM:

  • Développé pour Hyper-V isolated containers.
  • Capable de démarrer beaucoup plus de conteneurs sur une seule machine host (avec moins de charge).
  • Démarrage rapide de la VM pour pouvoir créer rapidement des conteneurs en temps de montée de charge.
  • Plusieurs applications clientes utilisent la technologie en l’occurrence Windows Defender Application Guard et Windows Sandbox.

Un tableau comparatif entre WSL2 et une VM traditionnelle:

VM traditionnelle WSL2
Isolée Intégrée
Démarrage lent Démarrage rapide (de l’ordre de 1 seconde)
Charge de mémoire grande Charge de mémoire petite
Doit être maintenu manuellement Démarrage sur demande et libération automatique des ressources

Récapitulons le schéma de fonctionnement:

alt Archi de Docker sous Windows

  • PS1: ne soyez pas surpris si vous voyez que le noyau Windows NT lui même s’exécute sur un hyperviseur.
  • PS2: la petite flèche veut dire que Windows NT peut communiquer avec Linux en envoyant par exemple des paramètres d’entrée pour exécuter des binaires Linux et recevoir le retour. On utilise pour ça des apis de sockets Linux et Windows.
  • PS3: A noter que Linux peut accéder au système de fichier de Windows et vice-versa.
  • PS4: VS Code permet de développer des applications depuis Windows 10 et les déboguer+exécuter contre Linux avec WSL (voir).

Conclusion

Avec WSL2, Microsoft confirme son engagement pour viser “Any Language, Any Platform” et pour renforcer son partenariat avec l’écosystème Linux. Et contrairement à ce que pensent beaucoup de gens, l’ouverture et l’open-sourcing de l’écosystème Microsoft ne peut que revenir avec du bien sur sa performance financière (plus de 33 milliards de dollars sur les 3 premiers trimestres de 2019). Le backlog de WSL est déjà prometteur: support de CUDA et améliorations du réseautage entre le noyau Linux et Windows (une seule adresse localhost pour les deux est en cours d’étude). D’un autre côté les équipes Docker continuent à expérimenter avec WSL 2 pour arriver à une version stable du client Docker pour Windows.

Ressources


Badre BSAILA, Ingénieur d'étude et développement .NET sénior