Premiers pas dans un conteneur
Notre premier conteneur
Maintenant que Docker est installé, nous allons pouvoir appréhender par la pratique les conteneurs.
Pour commencer nous allons simplement lancer un conteneur Debian, sur une ancienne version (ici Bullseye)
docker run -it debian:bullseye bash
On ne s'attarde pas trop sur tout les détails de la commande ici, la plupart seront expliqués par la suite. Mais brièvement :
docker run
est la commande Docker pour démarrer un conteneurdebian:bullseye
indique que l'on souhaite démarrer un conteneur à partir de l'image Debian en version Bullseyebash
est le processus que l'on souhaite lancer dans le conteneur. Ici Bash nous permet simplement d'avoir un shell dans le conteneur, pour y lancer des commandes
Une fois que la commande est lancée, on se retrouve à l'intérieur de notre conteneur. Nous allons faire quelques manipulations pour constater l'isolation apportée par le conteneur vis à vis de la machine hôte.
Système de fichiers
On peut, dans le conteneur, regarder le contenu du fichier /etc/debian_version
, qui indique simplement la version de Debian du système. Son contenu devrait être 11.XX
.
Si on regarde le même fichier sur la machine, le résultat devrait être différent (12.XX
si vous êtes sous Debian Bookworm). Le système de fichiers du conteneur est donc bien celui d'une distribution Debian Bullseye, différent de celui de l'hôte.
De plus, en parcourant l'arborescence dans le conteneur, on ne retrouve pas les fichiers du système hôte, et inversement. Le conteneur a son système de fichiers propre et indépendant de l'hôte.
Kernel
Si le système de fichiers est différent entre le conteneur et l'hôte, les processus de notre conteneur s'exécutent bien sur la machine hôte.
Question
Qu'est ce que l'on constate lorsque l'on lance uname -r
dans le conteneur et sur le serveur ? Que cela signifie ?
Indice
La commande uname -r
retourne la version du noyau (ici du noyau Linux) du système.
Solution
La valeur retournée dans le conteneur et sur le serveur est la même car les processus dans le conteneur utilisent le noyau de l'hôte.
Processus
Une autre différence majeure avec les machines virtuelles est que l'on ne fait pas s’exécuter tout un système d'exploitation dans le conteneur.
Question
Combien de processus s’exécutent dans le conteneur ? Lesquels ?
Indice
On utilise la commande ps aux
pour lister les processus d'une machine.
Indice
Les images docker ayant pour philosophie d'être les plus légères possible, ps n'est pas encore installé. Il faudra donc mettre les mirroirs à jour et installer le paquet procps depuis l'intérieur du container.
Solution
Dans le conteneur, seul le processus bash
s’exécute (il est aussi possible que l'on voit le processus associé à la commande ps
que l'on a lancé) et il a comme PID 1.
Si on le souhaite on peut lancer d'autres processus dans le conteneur, ils seront eux aussi isolés et ne verront pas les processus du système hôte.
Namespaces
Si les processus sont isolés, cela ne veut pas dire pour autant qu'il ne s’exécutent pas sur le système hôte.
Ils s’exécutent dans ce que l'on appelle un namespace. On ne rentrera pas dans le détail, mais un namespace est un des mécanismes utilisé par Docker pour mettre en place des conteneurs. Les processus d'un namespace ne verront pas les processus des autres namespaces. Par contre tous utilisent le même noyau système : celui de l'hôte.
Une seconde manipulation permet de valider cela : dans le conteneur, on va lancer un processus. Pour l'exemple on va simplement lancer sleep 60
, un processus qui ne va rien faire pendant 60 secondes. En parallèle, on va lister les processus sur le système hôte.
Question
Quelle commande utiliser sur le système hôte pour vérifier que le processus sleep
du conteneur est bien visible dans la liste des processus du système ? Qu'est ce que l'on observe ?
Indice
La commande grep
permet de filtrer du texte.
Solution
On utilise ps aux | grep sleep
. C'est à dire que l'on liste tout les processus et on redirige la sortie de la commande sur une seconde commande (avec le pipe |
) qui va faire le filtre sur le mot sleep. On constate que notre processus sleep
, qui s’exécute dans le conteneur, est bien visible au niveau du système d'exploitation hôte.
Conclusion
À l'issue de cette première expérimentation avec Docker, on a vu ce que signifie l'isolation lorsque l'on utilise des conteneurs. Bien que ces expérimentations soient très basiques, il est important de les comprendre, et surtout de bien intégrer leurs conclusions (système de fichiers différent, processus isolés). Sans cela, il sera difficile de comprendre les concepts de Docker qui seront introduits dans la suite du cours.