Installation et configuration de Docker sur le sous-système Windows Linux (WSL)

Conditions préalables


Avant de commencer, assurez-vous que votre système a approximativement la configuration suivante:

  • Windows 10 version 1803 build 1734 et versions ultérieures
  • Ubuntu pour WSL 16.0.4 LTS ou quelque chose comme ça (votre version peut varier légèrement)

Il est important que la version et la version de Windows ne soient pas inférieures à ce qui est indiqué ici. Le fait est qu'à partir de ces chiffres, des changements fondamentaux ont été apportés au noyau Windows WSL qui permettent l'utilisation de groupes de contrôle (groupes de contrôle - ajoutés au noyau Linux en 2008). Et ils sont nécessaires à Docker pour gérer les ressources de votre système dans des conteneurs.



Installez Docker-CE 09.17.0


Nous installerons Docker Community Edition 17.09.0 (car au moment de la rédaction de ce document, des versions plus récentes sont tombées lors de l'installation sur WSL).

La première chose que nous ferons est de supprimer toutes les installations Docker précédentes (le cas échéant). Pour ce faire, exécutez le terminal bash et écrivez ce qui suit:

$ sudo apt-get remove docker docker-engine docker.io containerd runc


Installez maintenant le référentiel pour Docker CE. Grâce à apt-get, nous pouvons installer la version nécessaire sans avoir à la construire nous-mêmes à partir des sources. En suivant les recommandations du site officiel de Docker, nous écrivons les commandes suivantes:

#   
$ sudo apt-get update
#   ,   apt    HTTPS
$ sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common

#      GPG   Docker
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
#  Docker   :
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

#        Docker    
$ sudo apt-get update

Si vous avez déjà ajouté un nouveau référentiel en utilisant apt, tout cela vous est familier dans son ensemble. Sinon, j'espère que vous êtes toujours resté avec moi :)

Ensuite, installez Docker:

$ sudo apt-get install docker-ce=17.09.0~ce-0~ubuntu

Si vous n'utilisez pas WSL de style Ubuntu, vous pouvez voir la liste des versions disponibles comme celle-ci:

$ apt list -a docker-ce


... ou utilisez une commande similaire à partir d'une autre bibliothèque si vous avez abandonné APT.

À la fin, vous devez ajouter votre utilisateur actuel au groupe de dockers afin de pouvoir utiliser correctement le Docker Engine, qui devrait fonctionner sur votre système avec en tant que root.

sudo usermod -aG docker $USER

Exécuter Docker sous Windows


Maintenant que Docker est installé, nous devons utiliser une méthode assez délicate pour le démarrer en tant que service dans WSL à chaque démarrage de Windows. Ce n'est pas aussi simple que cela puisse paraître. Nous devons agir au nom du superutilisateur et exécuter le shell de commande avec des privilèges élevés, ce qui complique un peu la tâche.

Pour simplifier un peu le processus, créez un nouveau fichier dans / usr / local / sbin / - un script qui contient les commandes appropriées pour démarrer le service Docker:

$ sudo nano /usr/local/sbin/start_docker.sh

avec le contenu suivant:

#!/usr/bin/env bash
sudo cgroups-mount
sudo service docker start

La première commande sudo consiste à monter des cgroups (elle sera exécutée au redémarrage), et la seconde donne le service docker à systemd (il s'agit du sous-système Ubuntu pour l'initialisation et la gestion des services).

Maintenant, laissez le script s'exécuter et exécutez-le:

$ sudo chmod +x /usr/local/sbin/start_docker.sh
#  
$ sudo chmod 755 /usr/local/sbin/start_docker.sh
$ /bin/sh /usr/local/sbin/start_docker.sh

Cependant, le service Docker ne démarre pas pour deux raisons:

  1. Le script effectue des appels en tant que superutilisateur, donc le script lui-même doit être exécuté avec des privilèges de superutilisateur pour fonctionner comme prévu. En théorie, cela est aussi simple que d'écrire n'importe quelle commande sudo, mais pour cela, l'utilisateur doit entrer ses données après chaque téléchargement, ce qui est très ennuyeux.
  2. La première commande pour monter des cgroups doit être exécutée dans bash avec des privilèges élevés. Pour l'exécuter sans intervention de l'utilisateur, nous devons utiliser le Planificateur de tâches Windows.

Tout est clair? Alors au point ...

Exécution d'un script avec des privilèges root sans intervention de l'utilisateur


Dans la famille des systèmes d'exploitation Linux, le fichier / etc / sudoers détermine qui et quoi peut s'exécuter avec les privilèges de superutilisateur. Modifions-le pour que votre utilisateur puisse appeler le script sans avoir à entrer constamment le mot de passe root. (Mais soyez très prudent avec ce fichier! Il est très facile de vous couper du système si vous ne savez pas ce que vous faites!)

$ sudo nano /etc/sudoers

Ajoutez une nouvelle ligne à la fin du fichier. Dans ce cas, vous devez connaître votre nom d'utilisateur exactement (exécutez echo $ USER si vous n'êtes pas sûr):

<your username here> ALL=(ALL:ALL) NOPASSWD: /bin/sh /usr/local/sbin/start_docker.sh

Nous pouvons maintenant démarrer le service Docker en tant que root sans intervention de l'utilisateur:

$ sudo /bin/sh /usr/local/sbin/start_docker.sh 

Hourra, camarades!

Démarrage approprié de Docker au démarrage de Windows


Désormais, au démarrage du système, nous pourrons lancer Docker en tant qu'administrateur à l'aide d'une commande distincte qui ne nécessite pas d'interaction avec l'utilisateur.



Lancez le Planificateur de tâches Windows et sélectionnez Bibliothèque du Planificateur de tâches dans le volet gauche. Sélectionnez ensuite Créer une tâche dans le volet droit.



Ensuite, vous serez invité à modifier les paramètres de base de la tâche. Donnez un nom clair à votre tâche et assurez-vous que les autres paramètres correspondent au mien. Il est important de sélectionner Exécuter avec les privilèges les plus élevés .



Dans l'onglet Déclencheurs , ajoutez un nouveau déclencheur qui démarrera la tâche dès que l'utilisateur local se connectera.



En passant à l'onglet Actions , créez une nouvelle action qui exécutera bash et exécutera immédiatement notre script avec le commutateur -c :

-c "sudo /bin/sh /usr/local/sbin/start_docker.sh"


Veuillez noter que cela doit être fait avec des privilèges élevés, alors cochez la case Exécuter avec les privilèges les plus élevés dans l'onglet Général .



Le reste des paramètres dépend principalement des préférences individuelles, mais je vais montrer mes paramètres. Si vous le souhaitez, vous pouvez les copier. Certains paramètres d'alimentation peuvent ne pas apparaître si vous êtes assis sur une voiture à l'arrêt. Personnellement, j'utilise un ordinateur portable.



Eh bien, tout se passe comme prévu. Si vous n'avez pas démarré Docker dans les étapes précédentes à l'aide de commandes avec des privilèges élevés, cliquez simplement avec le bouton droit sur la tâche que nous avons créée dans le Planificateur de tâches et sélectionnez «Exécuter»! C'est tout!

Vérifiez que tout fonctionne


Si vous voulez jouer en toute sécurité, redémarrez votre machine (oui, pour cela, vous devrez fermer les onglets de votre navigateur pendant un certain temps) , lancez bash et entrez:

$ docker run --rm hello-world

Si tout se passe bien, vous verrez le message d'accueil standard de Docker. Le service démarrera automatiquement et directement en WSL! Toutes nos félicitations!

Compléter


Vous venez d'installer et de démarrer Docker dans WSL. Cela signifie que vos conteneurs peuvent désormais partager Ubuntu déjà en cours d'exécution sur votre système. Ainsi, il n'est pas nécessaire de déployer un nouveau système d'exploitation (virtualisé), comme le fait un Docker standard pour Windows.

Les performances de Docker en WSL jusqu'à présent [au moment de la rédaction de l'article original] laissent beaucoup à désirer, mais au fur et à mesure que la plate-forme se développe et que les mises à jour Windows sont publiées, cela ne fera que s'améliorer.


  1. onomatopellan GitHub: https://github.com/Microsoft/WSL/issues/2291#issuecomment-383698720
  2. Official Docker Documentation: https://docs.docker.com/install/linux/docker-ce/ubuntu/
  3. cgroupfs-mount: https://github.com/tianon/cgroupfs-mount
  4. Bash Command Line Interface: https://docs.microsoft.com/en-us/windows/wsl/reference


All Articles