Rewrite some TP1 parts

This commit is contained in:
nemunaire 2022-09-13 23:44:20 +02:00
parent 885a410b77
commit 9587e183c8
2 changed files with 153 additions and 39 deletions

View File

@ -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`:
<div lang="en-US">
```
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
```
</div>
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 :
<div lang="en-US">
```bash
@ -29,21 +52,22 @@ docker search mariadb
```
</div>
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.
<div lang="en-US">
```bash
docker image pull ubuntu
```
</div>
Vous trouverez forcément votre bonheur parmi les images proposées par les deux
principaux registres :
- <https://hub.docker.com/>
- <https://quay.io/>
::::: {.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 :
<div lang="en-US">
```bash
docker container run docker.io/library/hello-world
```
</div>
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 :
<div lang="en-US">
```bash
docker login registry.container.io
```
</div>
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 :
<div lang="en-US">
```bash
docker container un registry.nemunai.ie/hello-world
```
</div>
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 :
<div lang="en-US">
```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.
```
</div>
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
</div>
### 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

View File

@ -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