Practical activity
Duration1h15Présentation & objectifs
Dans cette activité pratique, vous allez découvrir la virtualisation.
Essentiellement, c’est un mécanisme qui permet d’exécuter des applications dans un environnement contrôlé.
Vous allez expérimenter Docker, pour créer un conteneur dans lequel vous ferez tourner un serveur web.
Contenu de l’activité
1 — Introduction
Essayons d’aller un peu plus loin avec notre environnement numérique…
D’accord, la virtualisation est un autre mot à la mode en informatique, mais pas seulement.
En informatique, beaucoup de choses peuvent être virtualisées : ordinateurs, systèmes d’exploitation, applications, réseaux, etc.
Ce mot peut recouvrir beaucoup de choses différentes.
Quand vous entendez parler de virtualisation, la première question à se poser est : parle-t-on de la même chose ?
Pour nous, c’est une solution pratique pour exécuter des applications ou des systèmes informatiques dans un environnement contrôlé.
La virtualisation peut être motivée par plusieurs facteurs : reproductibilité, développement, tests, empaquetage, sécurité.
Pour fonctionner, un logiciel doit être installé sur un système approprié, avec toutes les bibliothèques dont il dépend, en utilisant les bonnes versions, entièrement configuré, etc.
Donc, l’idée est de figer tout cela (l’application, le système sur lequel elle tourne, les bibliothèques associées, la configuration, etc.) dans quelque chose prêt à l’emploi, généralement appelé une « image ».
Ainsi empaqueté, cela peut être facilement distribué, testé dans les mêmes conditions, permettant d’explorer différentes variantes sans effets secondaires, etc.
L’autre idée est que ces images sont relativement bornées.
Leurs entrées/sorties sont gérées par le système de virtualisation, qui peut alors être utilisé pour contrôler l’isolation des images entre elles et par rapport au reste du monde.
Cela fournit un moyen de sécurité.
Quelques termes de vocabulaire :
- Le guest est le système ou logiciel à virtualiser.
- Le host est le système réel qui exécute effectivement le système virtualisé.
- L’hypervisor est le logiciel qui implémente la solution de virtualisation.
L’hôte exécute l’hyperviseur qui exécute le guest.
Wikipedia fournit un aperçu des différentes manières de procéder, selon ce que la solution virtualise réellement.
Par exemple, certaines solutions proposent de virtualiser le matériel d’un ordinateur (CPU, RAM, disque, écran, carte Ethernet, etc.)
Ex. VirtualBox, VMware, QEMU, etc.
C’est plutôt lourd (un hôte, comme un ordinateur personnel, ne peut généralement pas exécuter plus d’un ou deux guests),
mais offre une grande polyvalence (les guests peuvent être très différents de l’hôte et ne sont rien d’autre qu’un système PC complet typique, ce qui peut aussi être lourd en espace disque).
Certaines de ces solutions proposent des techniques de déchargement pour utiliser le matériel de l’hôte et ainsi gagner en performance.
Mais ici, dans cette session, nous regardons une solution plus légère : la containerisation. L’idée est de virtualiser le système d’exploitation (ou une partie de celui-ci).
Cela vient de l’écosystème Linux.
Les applications en cours d’exécution sont normalement associées à un contexte système d’exploitation qui référence et contrôle les ressources utilisées (fichiers, utilisateurs, pilotes, etc.).
Ce mécanisme a évolué en un moyen (nommé cgroups) de fournir un contexte aux applications pour voir quelque chose de possiblement différent du système d’exploitation hôte.
Ainsi est né le principe des conteneurs.
Cette solution de virtualisation est bien adaptée pour exécuter une ou un ensemble d’applications (et non un système complet, même si c’est possible).
C’est très léger.
On peut citer des solutions telles que LXC, Docker,
Podman, Singularity, etc.
Même si c’est très proche de Linux, Docker peut fonctionner sur Windows et Mac, grâce à quelques astuces.
2 — Installer Docker Desktop
Juste quelques mots avant de commencer.
Docker, Inc. est une entreprise américaine qui propose des services (Docker Hub) et des logiciels (Docker Engine, Docker Desktop).
Selon les conditions d’utilisation, leurs logiciels peuvent être installés et utilisés gratuitement pour un usage personnel et étudiant.
L’accès aux services est aussi possible gratuitement, mais nécessite la création d’un compte et le partage de certaines informations personnelles.
Mais nous n’en aurons pas besoin ici.
- Docker Hub : entre autres, le dépôt cloud proposé par la société avec de nombreuses images de conteneurs prêtes à l’emploi.
- Docker Engine : la solution historique dédiée aux hôtes Linux.
L’hyperviseur est une application système (fonctionnant avec les permissions root) responsable de l’exécution des conteneurs à la demande des utilisateurs.
Notez que cette architecture est un des points de sécurité critiqués. (Dans certaines circonstances particulières, un utilisateur peut s’élever aux permissions root.) - Docker Desktop : la nouvelle solution mise en avant par la société, capable de fonctionner sur Windows, Mac et maintenant Linux, grâce à quelques astuces.
Sur Windows, il utilise la couche WSL2 existante (Windows Subsystem for Linux), une sorte de solution de virtualisation Windows pour faire tourner des systèmes Linux.
Sur Mac, il utilise QEMU, la solution de virtualisation polyvalente mentionnée plus haut avec de nombreuses techniques de déchargement.
Et maintenant sur Linux, il utilise aussi QEMU, et bénéficie ainsi d’une nouvelle couche d’isolation, qui assure la sécurité.
Comme on le voit, l’idée est d’empiler les choses : une virtualisation matérielle sur l’hôte qui exécute plusieurs conteneurs.
Ce mélange des deux techniques de virtualisation mentionnées dans l’introduction offre une solution homogène sur différents systèmes, tout en restant assez efficace globalement.
Veuillez noter que les enseignants n’ont aucun intérêt financier dans cette entreprise ni dans aucune des alternatives. Nous déclarons aucun conflit d’intérêt. ;-)
Docker a été une des toutes premières solutions à faire des conteneurs.
Des critiques techniques existent (certaines alternatives peuvent être plus sécurisées ou plus efficaces, tout en étant plus complexes).
De nombreuses ressources sur Docker sont disponibles sur le web.
Notez aussi que certaines alternatives offrent une compatibilité avec Docker.
C’est pourquoi vos enseignants ont choisi Docker pour cette session.
Avant de vous précipiter sur le téléchargement de Docker Desktop, veuillez voir les conseils ci-dessous, selon votre système :
Lisez la documentation.
La grande quantité de détails techniques est certainement intéressante, mais l’objectif ici est de comprendre comment faire les tâches suivantes :
- Comme mentionné plus tôt, Docker Desktop nécessite que WSL2 soit activé. C’est un prérequis.
(Eh bien, il peut aussi utiliser l’ancien Hyper-V, mais oublions cela ici.)
WSL2 est probablement déjà activé sur votre PC, sinon, récupérez-le et suivez les instructions. - WSL2 lui-même nécessite que la virtualisation matérielle soit activée dans le BIOS.
Elle est aussi probablement déjà activée sur votre PC.
Sinon, vous devrez redémarrer votre PC, aller dans le menu BIOS au démarrage, retrouver l’option correspondante et l’activer.
Cette étape dépend du fabricant et du modèle de votre PC. - Ensuite, récupérez comment télécharger le fichier
Docker Desktop Installer.exe
et exécutez-le.
Une fois fait, vous pouvez lancer Docker Desktop (recherchez dans le menu).
Pour des raisons historiques, le processus installe à la fois le Docker Engine traditionnel et le nouveau Docker Desktop.
En résumé, Docker Engine tourne dans le QEMU configuré par Docker Desktop.
(En effet, lorsque vous arrêtez le service Docker Desktop sur votre PC, vous retombez sur le service Docker Engine tournant nativement sur le système hôte de votre PC, comme à l’ancienne.
Les commandes de contrôle Docker de bas niveau sont les mêmes, sauf que si Docker Desktop tourne vous parlez aux images de conteneurs gérées dedans, et si Docker Desktop est arrêté vous parlez aux images de conteneurs gérées à l’extérieur.
Les commandes sont les mêmes, elles fonctionnent toujours, sauf que vous ne gérez pas les mêmes conteneurs.)
Cela peut prêter à confusion. Mieux vaut être prévenu.
Maintenant, lisez la documentation.
La grande quantité de détails techniques est certainement intéressante, mais l’objectif ici est de comprendre comment faire les trois tâches suivantes (les variantes dépendent de votre version de Linux) :
- Configurer le dépôt de paquets Docker correspondant à la version de votre système Linux (nécessite les permissions root).
- Télécharger le paquet Docker Desktop, qui (surprenamment) est actuellement hors du dépôt de paquets et doit être téléchargé manuellement (les permissions root ne sont pas requises).
Sachez où votre navigateur a stocké le fichier téléchargé. - Lancer l’installation du paquet Docker Desktop téléchargé en utilisant la commande appropriée pour votre version de Linux (nécessite les permissions root).
Cela devrait aussi installer les dépendances nécessaires, par ex. les paquets Docker Engine, QEMU, KVM et autres.
Une fois fait, vous pouvez lancer Docker Desktop (recherchez dans le menu Applications).
Lisez la documentation.
La grande quantité de détails techniques est certainement intéressante, mais l’objectif est de comprendre comment :
- Récupérer l’installateur Docker Desktop correspondant à votre variante de Mac
- Le télécharger
- L’exécuter
Les curieux peuvent regarder comment faire sur d’autres systèmes…
3 — Expérimenter un conteneur
Maintenant que Docker est installé, utilisons-le.
Rappelez-vous, le but est d’exécuter certaines applications, même complexes, sans avoir à les installer nativement sur le système hôte, mais dans un conteneur.
Pour les besoins de cet exercice, vos enseignants ont choisi nginx, un serveur web.
Les étapes principales de l’expérience proposée :
- obtenir une image Docker pertinente
- préparer les éléments nécessaires pour mener l’expérience (dans notre cas, quelques pages web statiques)
- exécuter l’image sélectionnée, avec une configuration pour utiliser les éléments préparés
- profiter
Étapes non proposées par l’expérience :
- jouer avec les outils en ligne de commande
- construire une nouvelle image docker
- composer plusieurs images docker pour mettre en place une infrastructure informatique containerisée
- publier une nouvelle image docker
- exécuter des images situées sur un serveur distant
- etc.
3.1 — Récupérer une image
Démarrez Docker Desktop. En haut, il y a une barre de recherche ; tapez « nginx ».
Vous pouvez obtenir une centaine de réponses.
Il y a une build officielle Docker simplement nommée « nginx », plus beaucoup d’autres avec divers noms.
De nombreux membres courageux de la communauté ont créé des images incorporant cette application avec des variantes.
Certaines sont plutôt obsolètes, d’autres sont activement maintenues.
Donc, en haut de la liste vous verrez “nginx”.
C’est la build officielle Docker.
Cliquez sur ce nom pour obtenir des informations sur cette image et quelques indications sur son utilisation.
D’accord, vous êtes convaincu, cliquez sur Pull
(bouton en haut à droite).
(Vous la lancerez plus tard.)
3.2 — Préparer les éléments
nginx est un serveur web très polyvalent. Pour un test simple, une page HTML statique suffit.
Préparez un sous-répertoire quelque part dans votre espace de travail sur votre PC.
Choisissez un emplacement cohérent pour organiser votre travail tout au long des sessions de formation…
Retenez le chemin complet de ce sous-répertoire. Appelons-le my_website
pour la suite.
(Choisissez un autre nom si vous préférez, mais gardez-le en tête et ajustez la suite en conséquence.)
Ouvrez votre éditeur de texte préféré et créez le fichier my_website/index.html
avec ce morceau de html.
(c’est-à-dire le fichier nommé index.html
, que vous placez dans votre sous-répertoire nommé my_website
)
<html>
<body>
<p>Hello world!</p>
</body>
</html>
Merci de ne pas perdre de temps à coder du HTML sophistiqué ! … Ou plus tard…
3.3 — Configurer et lancer le conteneur
Sur le côté gauche de la fenêtre Docker Desktop, sélectionnez Images
dans le menu.
(N’hésitez pas à explorer d’autres options de menu. Mais continuons avec les Images.)
Pour l’instant, il n’y a qu’une seule image : nginx
.
Cliquez sur le symbole triangle associé à droite (appelé Run
).
Une fenêtre pop-up demande des Optional settings
.
Déployez ce menu. Nous nous intéressons principalement aux ports réseau et aux volumes.
(D’autres options pourront être explorées une autre fois.)
-
L’image nginx expose le port TCP numéro 80.
C’est le port standardisé pour le bon vieux service HTTP.
(Ne pas confondre avec HTTPS, port 443, qui nécessite une configuration et des certificats pour fournir une couche de sécurité. Hors du cadre de cette session, malgré son intérêt.)Vous devez choisir quel port TCP de votre PC doit être mappé vers le port TCP 80 du conteneur.
Vous pouvez garder 80, le numéro officiel.
Cependant, puisque vous faites une expérience et non un déploiement réel de serveur web, il est probablement plus sûr de choisir un port non officiel. (Honnêtement, il n’y a pas de vrai risque ici.)
Pourquoi pas8888
.
Notez aussi que vous ne pouvez pas utiliser un port déjà utilisé par une autre application en même temps.Remplissez le formulaire avec le port choisi. (Gardez-le en tête !)
-
L’application nginx offre différents points de configuration.
Cela prend la forme de fichiers ou répertoires auxquels l’application accède à l’intérieur du conteneur.
Pour gérer cela, Docker peut être demandé d’exporter les fichiers de l’hôte vers l’espace de fichiers du conteneur.
Ce sont ce que nous appelons des volumes dans le vocabulaire Docker.
Pour notre expérience, nous voulons exporter le sous-répertoire avec les pages html que nous avons préparées, afin qu’elles puissent être servies par le serveur nginx.Donc, configurez un volume exportant
my_website
vers/usr/share/nginx/html
(l’espace de fichiers où nginx est configuré pour trouver ses pages html).
Puis cliquez sur Run
Maintenant, vous obtenez un nouveau Container. C’est probablement le seul de la liste (voir Containers
dans le menu de la fenêtre Docker Desktop).
Un container est une instance d’une image.
Cela signifie que vous pouvez avoir plusieurs conteneurs basés sur la même image, éventuellement avec des configurations différentes.
Vous pouvez Start / Stop / Delete un conteneur.
Pour l’instant, vous devriez avoir un conteneur nginx en cours d’exécution.
Au cas où vous auriez manqué une étape, vous pouvez supprimer un conteneur et recommencer.
Notez qu’une image est en lecture seule, alors qu’un conteneur ne l’est pas (sauf si Docker est configuré pour le faire).
Les fichiers sont organisés en couches empilées.
Un conteneur a une couche en lecture seule qui est l’image, plus des couches en lecture-écriture où l’application en cours d’exécution peut stocker ses fichiers.
Chaque fois que vous relancez un conteneur, une nouvelle couche est créée.
3.4 — Profitez de votre conteneur
À ce stade, vous devriez avoir un conteneur en cours d’exécution contenant le serveur web nginx, servant la page HTML que vous avez écrite.
Testez-le donc avec votre navigateur web préféré, à l’url http://localhost:8888/
Hourra !
Note : Lorsque vous avez fini de l’utiliser, n’oubliez pas de fermer Docker, car il consomme des ressources.
Pour aller plus loin
4 — Outils en ligne de commande
Docker Desktop offre une belle interface graphique.
Cependant, il est assez classique d’utiliser Docker depuis la ligne de commande.
Donc, ouvrez votre outil shell préféré (Powershell, shell Unix, etc.) et devinez ce que font les commandes suivantes :
$ docker pull ngnix
$ docker images
$ docker run -d --name my_nginx -p 8888:80 -v my_website:/usr/share/nginx/html nginx
$ docker container ls
$ docker stop my_nginx
5 — Construire une nouvelle image docker
Construire sa propre image docker personnalisée consiste généralement à :
- sélectionner une image existante proche de ce que vous voulez faire
- installer quelques applications supplémentaires dedans, si besoin
- exécuter certaines commandes dedans, si besoin
- copier ou éditer certains fichiers dedans, si besoin
- indiquer à docker les ports réseau exposés, si besoin
- indiquer à docker le point d’entrée ou la commande à lancer lors de l’exécution du conteneur
Cela prend la forme d’un « Dockerfile », c’est-à-dire un fichier nommé Dockerfile
(sans extension), avec les commandes correspondantes.
Jetez un œil à la documentation pour la liste des mots-clés.
Vous pouvez aussi regarder le Dockerfile nginx utilisé dans cette session.
-
Donc, créons un « Dockerfile » avec :
FROM nginx COPY my_website/index.html /usr/share/nginx/html/index.html
Devinez ce que fait chaque ligne.
Devinez pourquoi il n’y a pas de EXPOSE ni ENTRYPOINT. -
Puis, lancez la commande suivante dans votre shell. (Désolé, l’interface graphique Docker Desktop ne peut pas vous aider.)
$ docker build -t webserver .
Maintenant, Docker Desktop propose une nouvelle image nommée « webserver », qui embarque ses propres pages html, et qui n’a besoin que d’un port à configurer pour tourner.
(Essayez aussi docker images
.)
Si vous avez un compte Docker, vous pouvez partager votre création sur Docker Hub.
(Voir docker login
; docker tag
; docker push
.)
Sinon, vous pouvez distribuer le fichier image vous-même. (Voir docker save
/ docker load
.)
Pour aller encore plus loin
On dirait que cette section est vide !
Y a-t-il quelque chose que vous auriez aimé voir ici ?
Faites-le nous savoir sur le serveur Discord !
Peut-être pouvons-nous l’ajouter rapidement.
Sinon, cela nous aidera à améliorer le cours pour l’année prochaine !