Work on tuto 2

This commit is contained in:
nemunaire 2022-09-20 06:02:53 +02:00
commit bc179806db
19 changed files with 545 additions and 145 deletions

View file

@ -59,18 +59,86 @@ avec la commande `commit` :
<div lang="en-US">
```bash
docker container commit CONTAINER my_nano
42sh$ docker ps
CONTAINER ID IMAGE COMMAND STATUS NAMES
91d17871d730 ubuntu "bash" Exited (0) musing_tu
docker container commit 91d17871d730 my_nano
```
</div>
en remplaçant `CONTAINER` par le nom ou l'identifiant du container qui
en remplaçant `91d17871d730` par le nom ou l'identifiant du container qui
doit servir de modèle. `my_nano` est le nom que vous voudrez utiliser
à la place d'`ubuntu`.
L'action de *commit*, malgré le fait qu'elle crée une nouvelle image est très
rapide : il se trouve que seules les différences avec l'image parente sont
packagées. Les images sont en fait composées de couches : empilant les
différences depuis le système de base !
Cette action va figer la couche la plus haute de systèmes de fichiers, qui
était jusqu'alors en lecture-écriture pour le conteneur ; afin d'en faire la
dernière couche de notre nouvelle image.
### À propos des couches
Revenons quelque-peu en arrière : lorsque nous avons fait notre premier `docker
run hello-world`, rappelez-vous, Docker a téléchargé l'image en nous affichant
la progression, juste avant de lancer le conteneur.
Analysons ensemble ces quelques lignes pour mieux comprendre de quoi les images
se composent. Nous allons pour cela utiliser la commande `pull` pour récupérer
une nouvelle image :
<div lang="en-US">
```bash
42sh$ docker image pull python:3
3: Pulling from library/python
23858da423a6: Pull complete
326f452ade5c: Pull complete
a42821cd14fb: Pull complete
8471b75885ef: Pull complete
8ffa7aaef404: Pull complete
15132af73342: Pull complete
aaf3b07565c2: Pull complete
736f7bc16867: Pull complete
94da21e53a5b: Pull complete
Digest: sha256:e9c35537103a2801a30b15a77d4a56b35532c964489b125ec1ff24f3d5b53409
Status: Downloaded newer image for python:3
docker.io/library/python:3
```
</div>
On remarque que plusieurs téléchargement ont lieu, chacun associé à un
identifiant particulier. Une image est généralement découpée en plusieurs
éléments. On parle en fait de *couches* puisqu'on les empile, dans un ordre
précis.
Les couches sont une astuce formidable pour optimiser tant le téléchargement,
l'espace de stockage nécessaire au cache d'images, que la création des
conteneurs. De nombreux conteneurs vont utiliser les mêmes images de base :
`debian`, `ubuntu`, `alpine`, ... il serait futile de systématiquement
récupérer et stocker autant de systèmes de fichiers de base que d'images. Avec
les couches, si deux images partagent la même version du système de fichiers de
base, il ne sera téléchargé qu'une seule fois. On pourait le schématiser ainsi :
![L'héritage des principales images officielles](image-inheritance.png)
Dans les faits, cela va même encore plus loin car Docker crée de nombreuses
couches intermédiaires, chacune peut être l'occasion d'une bifurcation.\
Chaque couche est en fait un différentiel des dossiers et fichiers qui sont
ajoutés, modifiés ou supprimés par rapport à la couche précédente.
::::: {.question}
#### Comment supprimer les couches d'images que je n'utilise plus ? {-}
Docker gère lui-même les couches, vous n'avez pas à vous en préoccuper. Si une
image est mise à jour ou supprimée, toutes les couches rendues inutiles seront
automatiquement supprimées.
:::::
Revenons au *commit* que nous avons fait précédemment. Nous avons ajouté `nano`
par-dessus une image `ubuntu`. Naturellement, voici ce qu'il s'est passé :
![`docker commit`](commit.png)
@ -82,8 +150,13 @@ docker container run -it my_nano /bin/bash
```
</div>
Vous constatez cette fois que vous pouvez lancer `nano`, alors que vous ne
pouvez toujours pas le faire dans un conteneur issu d'une image `ubuntu` !
Vous constatez cette fois que vous pouvez lancer `nano` !
Nous avons donc créé une couche, elle contient juste le différentiel des
fichiers ajoutés, à savoir le binaire `nano` et sa configuration par défaut
(mais aussi le cache du gestionnaire de paquets `apt`).
Voyons maintenant comment automatiser cela.
### Scripté ?