From 9587e183c844f818f127a2064ed5dd247b09ad98 Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Mercier Date: Tue, 13 Sep 2022 23:44:20 +0200 Subject: [PATCH] Rewrite some TP1 parts --- tutorial/docker-basis/first.md | 189 ++++++++++++++++++++++++++------- tutorial/docker-basis/what.md | 3 +- 2 files changed, 153 insertions(+), 39 deletions(-) diff --git a/tutorial/docker-basis/first.md b/tutorial/docker-basis/first.md index 320620d..d4eb722 100644 --- a/tutorial/docker-basis/first.md +++ b/tutorial/docker-basis/first.md @@ -13,15 +13,38 @@ docker container run hello-world Cette commande va automatiquement exécuter une série d'actions pour nous, comme indiqué dans le message affiché en retour : -D'abord, le daemon va rechercher s'il possède localement l'image -*hello-world*. Si ce n'est pas le cas, il va aller récupérer les différentes -couches de l'image sur le registre par défaut (celui de Docker). Il assemble -ensuite les images en ajoutant une couche en lecture/écriture, propre au -conteneur. Enfin, il lance la commande par défaut, telle que définie dans les -métadonnées de l'image. +D'abord, le daemon va rechercher s'il possède localement l'image hello-world. +Si ce n'est pas le cas, il va commencer par demander au registre les différents +composants de l'image. On aperçoit la récupération de l'image dans les +premières lignes : -Nous pouvons directement utiliser le client pour rechercher une image sur le -registre, en utilisant la commande `search` : +
+``` +42sh$ docker container run hello-world +Unable to find image 'hello-world:latest' locally +latest: Pulling from library/hello-world +2db29710123e: Already exists +Digest: sha256:7d246653d0511db2a6b2e0436cfd0e52ac8c066000264b3ce63331ac66dca625 +Status: Downloaded newer image for hello-world:latest +``` +
+ +Le daemon assemble ensuite l'image et met en place les différents éléments +d'isolation pour préparer l'exécution de notre conteneur. + +Enfin, il lance la commande qui sera le premier processus du conteneur. Cette +commande fait parti des métadonnées de l'image. Le processus ainsi lancé est un +peu particulier : il obtient les mêmes caractéristiques que le PID 1 de notre +système ('init'). + + +### Recherche d'images + +Docker est donc allé récupérer une image existante. Par défaut, il va +rechercher sur le Docker Hub, un registre d'images géré par les équipes de +Docker. + +Nous pouvons explorer les images existantes en utilisant la commande suivante :
```bash @@ -29,21 +52,22 @@ docker search mariadb ```
-Il est possible de mettre à jour les images locales, ou télécharger les couches -d'images qui nous intéressent, en utilisant la commande `pull` : +Cette commande atteint rapidement ses limites en raison de la difficulté à +afficher beaucoup de contenu pour faire son choix. Aussi, il est souvent plus +pratique d'aller explorer les registres en passant directement par leur interface +web. -
-```bash -docker image pull ubuntu -``` -
+Vous trouverez forcément votre bonheur parmi les images proposées par les deux +principaux registres : +- +- ::::: {.warning} Les registres publics tels quel le Docker Hub mettent à disposition des images officielles, mais aussi des images créées par la communauté. Chaque utilisateur -est libre d'envoyer une image qu'il a lui-même créée : soit car l'éditeur ne +est libre d'envoyer une image qu'il a lui-même créée : soit, car l'éditeur ne proposait pas d'image et que quelqu'un s'est dévoué pour la faire, soit parce qu'il avait des besoins plus spécifiques qui n'étaient pas couverts par l'image originale. Il est important de garder en tête que vous téléchargez des @@ -56,6 +80,117 @@ assurez-vous d'avoir confiance dans la personne affiliée à l'image.** ::::: + +### Exécuter des images d'autres registres + +Il existe une multitude de registres d'images. Le Docker Hub et Quay.io sont +sans aucun doute les registres publics les plus utilisés. Mais il y en a +d'autres : GitHub, Gitlab et Gitea proposent un service de registre afin de +centraliser la récupération du code et des produits de compilation (comme les +binaires ou les images de conteneur). + +On a dit que Docker utilisait le Docker Hub comme registre par défaut. Cela +signifie que sans cette facilité, nous aurions dû écrire : + +
+```bash +docker container run docker.io/library/hello-world +``` +
+ +Vous pouvez l'essayer, c'est une commande valide. En fait, pour utiliser une +image d'un registre, on va simplement utiliser le nom de domaine du registre en +question. + +Il y a encore bien d'autres registres existant. En fait, les spécifications +sont ouvertes, chacun peut implémenter un registre dans ses logiciels, ou même +déployer un conteneur de registre (tels que `registry` ou `harbor`). + + +### Registres et images privés + +Il y a certaines images que l'on désire garder privées : il peut s'agir d'un +travail que l'on ne souhaite pas partager ou, dans le cas d'une entreprise, +celle-ci peut préférer que son code source ou ses binaires ne soient pas +distribués. + +Certains registres intègrent des fonctionnalités d'authentification, afin de ne +permettre la découverte et l'accès qu'aux seuls utilisateurs autorisés. + +Nous n'en aurons pas besoin durant notre présente découverte, mais notons que l'on +utiliserait la commande suivante : + +
+```bash +docker login registry.container.io +``` +
+ + +Il convient de remplacer le dernier paramètre par le nom de domaine du registre +(ou rien si l'on veut s'authentifier sur le registre par défaut). + +On ne s'authentifie pas pour une image en particulier, mais pour un domaine. + +::::: {.warning} + +Les informations d'authentification, une fois la commande validée, sont +stockées dans un fichier sur le disque de la machine. + +::::: + +::::: {.question} + +Notez que le Docker Hub a mis en place des limites sur le nombre de requêtes qui +lui sont faites. Avoir un compte sur le Docker Hub vous permet d'avoir des +limites plus élevées. + +::::: + + +### Images vs. conteneurs + +Exécutons sans plus attendre une nouvelle image, cette fois-ci issue d'un +registre tiers : + +
+```bash +docker container un registry.nemunai.ie/hello-world +``` +
+ +De la même manière que pour le `hello-world` du Docker Hub, il est d'abord +nécessaire de récupérer l'image. Elle est ensuite exécutée. Vous devriez donc +obtenir un résultat en deux parties, similaire à la sortie suivante : + +
+```bash +Unable to find image 'registry.nemunai.re/hello-world:latest' locally +latest: Pulling from library/hello-world +2db29710123e: Already exists +Digest: sha256:7d246653d0511db2a6b2e0436cfd0e52ac8c066000264b3ce63331ac66dca625 +Status: Downloaded newer image for registry.nemunai.re/hello-world:latest + +Hello World! +============ + +This is a container running the image hello-world. +My name is: 32df94d25823 + +Feel free to run this image again to see if the name changes or not, +denoting a new container or not. +``` +
+ +Le conteneur affiche son nom, celui-ci sera nécessairement différent pour vous +et il sera différent pour chaque nouveau conteneur exécuté. + +Chaque conteneur `hello-world` est créé à partir de la même image, mais on +arrive toujours dans un nouvel environnement. Docker assigne un nom d'hôte +aléatoire à chaque nouveau conteneur créé. L'idée est de visualiser ici que +chaque exécution donne naissance à un nouveau conteneur. + + ### Arguments de la ligne de commande Remarquez comment on interagit avec chaque *objet Docker* : dans la ligne de @@ -157,28 +292,6 @@ docker container run alpine /sbin/apk stats -### Images vs. conteneurs - -À chaque fois que nous lançons un `run`, un nouveau conteneur est créé. -L'image fournie comme argument est utilisée comme un modèle de base pour le -conteneur et est recopiée grâce à un mécanisme de *Copy-On-Write*: c'est donc -très rapide et ne consomme pas beaucoup d'espace disque. - -Étant donné que chaque conteneur est créé à partir d'un modèle, cela signifie -que lorsque nous exécutons une commande modifiant les fichiers d'un conteneur, -cela ne modifie pas l'image de base. La modification reste contenue dans la -couche propre au conteneur dans l'UnionFS. - -Dans le schéma ci-après, on considère les images comme étant la partie figée de -Docker à partir desquelles on peut créer des conteneurs. - -Si l'on souhaite qu'une modification faite dans un conteneur (par exemple -l'installation d'un paquet) s'applique à d'autres conteneurs, il va falloir -créer une nouvelle image à partir de ce conteneur. - -![Images vs. conteneurs](img-vs-cntr.png "Images vs. conteneurs"){ width=85% } - - ### Programme par défaut Chaque image vient avec un certain nombre de métadonnées, notamment le diff --git a/tutorial/docker-basis/what.md b/tutorial/docker-basis/what.md index 1c16055..d020452 100644 --- a/tutorial/docker-basis/what.md +++ b/tutorial/docker-basis/what.md @@ -60,7 +60,8 @@ Il y a deux méthodes pour obtenir des images Docker : soit les construire ave les outils fournis, soit les récupérer depuis un registre. Lorsque vous ne précisez pas l'adresse d'un registre, Docker va aller chercher -sur le [Docker Hub](https://hub.docker.com/). C'est son registre par défaut, chaque +sur le [Docker Hub](https://hub.docker.com/). C'est le registre utilisé par +défaut. ### Les plugins Docker