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)

1
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 conteneur

  • debian:bullseye indique que l'on souhaite démarrer un conteneur à partir de l'image Debian en version Bullseye

  • bash 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.