Ce quatrième article s’intéresse à l’utilisation de Docker dans WSL-2.
Comme vu dans le premier article, Windows Subsystem for Linux (WSL) 2 propose un changement architectural important puisqu’il utilise une solution de virtualisation légère, pilotée par Windows qui exécute un noyau Linux complet construit par Microsoft, permettant à toutes les applications Linux de fonctionner nativement sans émulation.
WSL 2 apporte ainsi des améliorations au partage des systèmes de fichiers, au temps de démarrage, à la compatibilité des applications exécutables (notamment Docker) et aux performances de leur exécution.
Sous WSL-2, il est possible d’installer Docker dans une distribution ou d’utiliser Docker Desktop for Windows avec WSL-2.
Docker Desktop for Windows
Docker Desktop for Windows est proposée par Docker pour une utilisation de Docker sous Windows 10. Docker Desktop for Windows propose un support pour exécuter des conteneurs Linux et Windows. Cet article va se concentrer sur les conteneurs Linux.
La page d’accueil de Docker Desktop est à l’url :
Docker Desktop for Windows utilise une solution de virtualisation pour exécuter un noyau Linux dans lequel s’exécute Docker.
Historiquement, cette solution de virtualisation repose sur Hyper-V. WSL-1 n’étant qu’une émulation, il ne pouvait pas être utilisé pour exécuter Docker. Comme WSL-2 utilise une solution de virtualisation légère, il est possible d’exécuter Docker. Docker Desktop for Windows propose un support pour Hyper-V et WSL-2 au choix.
Sous Windows, deux solutions sont proposées depuis la version 2.3.0.2 de Docker Desktop :
- Hyper-V : la solution historique de Docker Desktop qui ne fonctionne que sur Windows Pro
- WSL-2 : une solution plus récente qui fonctionne avec Windows Pro et Windows Home
L’utilisation de la virtualisation reposant sur WSL-2 apporte plusieurs avantages :
- Un temps de démarrage très rapide : WSL-2 démarre en quelques secondes alors qu’une VM Hyper-V requiert plusieurs dizaines de secondes
- Les ressources allouées sont moins gourmandes notamment lorsque Docker n’est pas utilisé
Les pré-requis
A partir de la version 2.3.0.2 de Docker Desktop, WSL 2 est utilisable sur Windows 10 64 bits version 1903 (version 18363) ou ultérieure pour Windows Pro et Enterprise et version 2004 (version 19041) ou ultérieure pour Windows Home.
Sous Windows, WSL-2 doit être installé. Le détail de cette installation est fourni dans le second article de cette série.
L’installation
Téléchargez la dernière version de Docker desktop en utilisant le lien Docker Desktop for Windows ou sur le Docker
Hub.
Au moment de la rédaction de cet article, c’est la version 3.5.2.0.
Pour lancer l’installation, il suffit d’exécuter le fichier « Docker Desktop Installer.exe » téléchargé.
Cliquez sur « Ok »
Les fichiers sont décompressés
Les fichiers sont installés
A la fin de l’installation, le système doit être redémarré
Cliquez sur « Close and restart »
Après le redémarrage, Docker démarre automatiquement.
Si aucune distribution sous WSL-2 n’est trouvée alors Docker Desktop crée deux distributions nommées « docker-desktop » et « docker-desktop-data »
C:\Users\jm>wsl -l -v
NAME STATE VERSION
* Ubuntu-18.04 Stopped 1
docker-desktop-data Running 2
Ubuntu-20.04 Stopped 1
docker-desktop Running 2
C:\Users\jm>
Un tutoriel de démarrage est proposé.
Pour le suivre, il suffit de cliquer sur « Start » ou sur « Skip tutorial » pour l’ignorer.
La configuration
Une petite icône dans la barre de notification indique que Docker est en cours d’utilisation.
En cliquant dessus, l’application Docker Desktop s’affiche.
Cliquer sur le bouton pour accéder à la configuration.
L’onglet « General » permet de configurer des options générales selon ses besoins.
Pour prendre en compte des modifications, il faut cliquer sur « Apply & Restart ».
L’onglet « Resources » permet de configurer l’utilisation des ressources notamment celles du réseau et de l’intégration avec WSL.
Le panneau « WSL INTEGRATION » permet d’activer l’intégration avec la distribution par défaut et de l’activer sur d’autres distributions.
L’utilisation
L’installation de Docker Destop inclut : Docker Engine, Docker CLI client, Docker Compose, Docker Content Trust, Kubernetes et Credential Helper.
Elle configure aussi différentes fonctionnalités qui facilitent l’utilisation de Docker sous Windows et Mac.
Le lancement de Docker Desktop
Si Docker Desktop n’est pas configuré pour démarrer automatiquement, il faut le lancer manuellement avant de pouvoir l’utiliser.
Une notification apparaît pour indiquer le démarrage.
Il est possible de configurer Docker Desktop pour qu’il s’exécute automatiquement au login.
Une fois démarré, une petite icône en forme de baleine apparaît dans la barre de tâche.
L’exécution de commandes Docker CLI sous Windows
Le CLI docker est utilisable dans différents Shell Windows notamment PowerShell, cmd ou le Windows Terminal de Microsoft.
C:\Users\jm>docker version
Client:
Cloud integration: 1.0.17
Version: 20.10.7
API version: 1.41
Go version: go1.16.4
Git commit: f0df350
Built: Wed Jun 2 12:00:56 2021
OS/Arch: windows/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.7
API version: 1.41 (minimum version 1.12)
Go version: go1.13.15
Git commit: b0f5bc3
Built: Wed Jun 2 11:54:58 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.6
GitCommit: d71fcd7d8303cbf684402823e425e9dd2e99285d
runc:
Version: 1.0.0-rc95
GitCommit: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7
docker-init:
Version: 0.19.0
GitCommit: de40ad0
C:\Users\jm>
Il est aussi possible d’exécuter des commandes via le CLI sur l’engine qui s’exécute sous Linux.
C:\Users\jm>docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:df5f5184104426b65967e016ff2ac0bfcd44ad7899ca3bbcf8e44e4461491a9e
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
C:\Users\jm>
Le CLI docker est utilisable dans les différents terminaux tant que Docker Desktop est en cours d’exécution.
L’exécution de commandes Docker CLI sous Linux
L’onglet « Resources / WSL INTEGRATION » permet de sélectionner la ou les distributions WSL-2 sur lesquelles Docker doit être utilisable. Dans l’exemple ci-dessus, aucune n’est définie sur le système.
Il faut créer ou définir une distribution sous WSL-2 (par conversion en WSL-2 d’une distribution en WSL-1).
C:\Users\jm>wsl -l -v
NAME STATE VERSION
* Ubuntu-18.04 Stopped 1
docker-desktop-data Running 2
Ubuntu-20.04 Stopped 1
docker-desktop Running 2
C:\Users\jm>wsl.exe --set-version Ubuntu-20.04 2
La conversion est en cours. Cette opération peut prendre quelques minutes...
Pour plus d’informations sur les différences de clés avec WSL 2, visitez https://aka.ms/wsl2
La conversion est terminée.
C:\Users\jm>wsl -l -v
NAME STATE VERSION
* Ubuntu-18.04 Stopped 1
docker-desktop-data Running 2
Ubuntu-20.04 Stopped 2
docker-desktop Running 2
C:\Users\jm>wsl --set-default Ubuntu-20.04
C:\Users\jm>wsl -l -v
NAME STATE VERSION
* Ubuntu-20.04 Running 2
Ubuntu-18.04 Stopped 1
docker-desktop-data Running 2
docker-desktop Running 2
C:\Users\jm>
Cliquez sur le bouton « Refresh » dans Docker Desktop
Il suffit d’activer la ou les distributions désirées et de cliquer sur « Apply & Restart ».
Il faut lancer un shell sur une distribution activée (dans l’exemple ci-dessous, celle par défaut) et utiliser le CLI docker.
C:\Users\jm>wsl
jm@LAPTOP-59U21DN9:/mnt/c/Users/jm$ docker version
Client: Docker Engine - Community
Cloud integration: 1.0.17
Version: 20.10.7
API version: 1.41
Go version: go1.13.15
Git commit: f0df350
Built: Wed Jun 2 11:56:47 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.7
API version: 1.41 (minimum version 1.12)
Go version: go1.13.15
Git commit: b0f5bc3
Built: Wed Jun 2 11:54:58 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.6
GitCommit: d71fcd7d8303cbf684402823e425e9dd2e99285d
runc:
Version: 1.0.0-rc95
GitCommit: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7
docker-init:
Version: 0.19.0
GitCommit: de40ad0
jm@LAPTOP-59U21DN9:/mnt/c/Users/jm$
Comme sous Windows, les commandes peuvent être exécutées via le CLI docker dans la distribution WSL-2.
jm@LAPTOP-59U21DN9:/mnt/c/Users/jm$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
jm@LAPTOP-59U21DN9:/mnt/c/Users/jm$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
jm@LAPTOP-59U21DN9:/mnt/c/Users/jm$
Dans l’exemple, ci-dessus l’image est déjà présente dans le cache puisqu’elle a été téléchargée via l’exécution de commandes sous Windows.
La mise à jour de Docker Desktop
A partir de sa version 3.0, Docker Desktop est capable de se mettre à jour. Une icône informe d’une nouvelle version disponible, ce qui permet de choisir à quel moment elle doit être téléchargée et appliquée, reportée ou ignorée.
Lorsqu’une mise à jour est disponible, l’icône de Docker Desktop contient un petit point d’exclamation et une bulle d’aide indique « An update is available ».
Docker Desktop affichera des rappels périodiquement tant que la mise à jour n’est pas effectuée.
Pour faire la mise à jour, il suffit d’utiliser l’option « Download update… » du menu déroulant de l’icône.
Une boîte de dialogue s’affiche.
Il suffit de cliquer sur « Download update » pour lancer le téléchargement.
Une fois le téléchargement terminé, il faut cliquer sur l’option « Update and restart » du menu contextuel de l’icône.
L’installation s’effectue.
Une fois l’installation terminée, Docker Desktop redémarre.
La reconnexion en cas d’arrêt de la distribution
Si la distribution WSL-2 est arrêtée alors que Docker Desktop est en cours d’exécution, une popup demande si Docker Desktop doit être redémarré.
Un clic sur « Restart » permet de relancer la distribution WSL-2.
Les fonctionnalités réseau de Docker Desktop
Docker Desktop pour Windows propose quelques fonctionnalités réseau qui facilitent son utilisation.
Il est possible de mapper un ou plusieurs ports d’un conteneur en utilisant l’option -p port_hôte:port_conteneur lors du lancement du conteneur.
C:\Users\jm>wsl
jm@LAPTOP-59U21DN9:/mnt/c/Users/jm$ docker run -p 8083:80 -d nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
b4d181a07f80: Pull complete
66b1c490df3f: Pull complete
d0f91ae9b44c: Pull complete
baf987068537: Pull complete
6bbc76cbebeb: Pull complete
32b766478bc2: Pull complete
Digest: sha256:353c20f74d9b6aee359f30e8e4f69c3d7eaea2f610681c4a95849a2fd7c497f9
Status: Downloaded newer image for nginx:latest
d33e2ef44b05f30acb011c3e3f917a3cd87e8b925b7c4286141d1c5a68f0af4d
jm@LAPTOP-59U21DN9:/mnt/c/Users/jm$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d33e2ef44b05 nginx "/docker-entrypoint.…" 20 minutes ago Up 20 minutes 0.0.0.0:8083->80/tcp, :::8083->80/tcp upbeat_mccarthy
jm@LAPTOP-59U21DN9:/mnt/c/Users/jm$
Il est alors possible d’ouvrir un navigateur sous Windows et d’ouvrir l’url http://localhost:8083
Il est aussi possible d’accéder au port sur une autre machine du même réseau en utilisant l’adresse IP de l’hôte.
C:\Users\jm>ipconfig
Configuration IP de Windows
Carte Ethernet Ethernet 4 :
Suffixe DNS propre à la connexion. . . :
Adresse IPv6 de liaison locale. . . . .: fe80::195d:27ea:6c91:594d%11
Adresse IPv4. . . . . . . . . . . . . .: 192.168.56.1
Masque de sous-réseau. . . . . . . . . : 255.255.255.0
Passerelle par défaut. . . . . . . . . :
Carte réseau sans fil Wi-Fi :
Suffixe DNS propre à la connexion. . . : home
Adresse IPv6. . . . . . . . . . . . . .: 2a01:cb11:3e1:fb00:9c07:5cbf:c743:9a11
Adresse IPv6 temporaire . . . . . . . .: 2a01:cb11:3e1:fb00:5d1d:5e6a:63f8:41c
Adresse IPv6 de liaison locale. . . . .: fe80::9c07:5cbf:c743:9a11%16
Adresse IPv4. . . . . . . . . . . . . .: 192.168.1.23
Masque de sous-réseau. . . . . . . . . : 255.255.255.0
Passerelle par défaut. . . . . . . . . : fe80::3649:5bff:fe32:cb60%16
192.168.1.1
Carte Ethernet vEthernet (WSL) :
Suffixe DNS propre à la connexion. . . :
Adresse IPv6 de liaison locale. . . . .: fe80::b4e1:6efa:3ec6:ec9a%33
Adresse IPv4. . . . . . . . . . . . . .: 172.20.80.1
Masque de sous-réseau. . . . . . . . . : 255.255.240.0
Passerelle par défaut. . . . . . . . . :
C:\Users\jm>
Il suffit d’ouvrir un navigateur en utilisant l’IP de l’hôte et le port mappé
Sur l’hôte, il est aussi possible d’utiliser le réseau vEthernet de WSL.
Cet accès ne peut pas être réalisé sur d’autres machines, même appartenant au même réseau.
Les limitations
L’utilisation de docker Desktop for Windows présente quelques limitations.
L’exécution de Docker Desktop dans une solution de virtualisation
Docker Desktop n’est pas pris en charge dans les scénarios de virtualisation imbriqués. Il peut fonctionner dans certains cas, dans une VM Windows 10 exécutée sur Parallels ou VMware Fusion sur Mac, mais pas dans d’autres : des problèmes et des défaillances intermittentes peuvent cependant survenir notamment avec certains processeurs ou si la configuration recommandée par Docker n’est pas appliquée.
Les limitations réseau
Docker Desktop pour Windows présente quelques limitations concernant la couche réseau.
Il n’y a pas de pont docker0 sous Windows. En raison de la manière dont le réseau est implémentée dans Docker Desktop for Windows, il n’y a pas d’interface docker0 sur l’hôte. Cette interface se trouve à l’intérieur de la machine virtuelle.
Docker Desktop for Windows ne peut pas router le trafic vers des conteneurs Linux.
Le pont réseau docker sous Linux n’est pas accessible depuis l’hôte Windows.
Le changement de licence depuis le 31 août 2021
A partir du 31 août 2021, Docker a changé son modèle de souscription concernant Docker Desktop.
Pour les organisations de plus de 250 salariés ou de plus de 10 millions de dollars, l’utilisation de Docker Desktop requiert la souscription d’un contrat de service payant : trois souscriptions sont proposées selon les besoins (Docker Pro, Docker Team et Docker Business).
Docker Desktop reste gratuit pour un usage personnel, les établissements d’enseignement, les projets open source non commerciaux en utilisant modèle Docker Personal qui remplace Docker Free.
Ce changement de licence concerne uniquement Docker Desktop. Docker accorde un délai jusqu’au 31 janvier 2022 pour se conformer au nouveau modèle de souscription.
Lors d’une mise à jour, cette nouvelle licence est présentée et doit être acceptée.
Conclusion
Docker Desktop facilite l’utilisation de Docker notamment en utilisant WSL-2. Attention toutefois à bien prendre en compte le changement de licence notamment dans le cadre d’une utilisation professionnelle.