Vous n'avez pas les notions de base de Docker. C'est une chose complètement différente.
La première chose que vous devez savoir est la philosophie de Docker : run un processus isolé dans un conteneur. Vous ne ferez pas tourner un système d'exploitation dans un conteneur Docker, vous ferez tourner un processus à l'intérieur d'un conteneur avec un contenu de système de fichiers racine basé sur une distribution linux de votre choix. Ubuntu est un choix parmi d'autres.
Vous devez maintenant vous demander comment il est possible de faire tourner un processus dans une image de base linux différente de la distribution linux utilisée par votre hôte. Pour qu'un système d'exploitation fonctionne, il faut essentiellement :
- Un système de fichiers de démarrage : contient le chargeur de démarrage et le noyau qui résidera en mémoire une fois chargé. Nous ne nous en soucions pas dans le cas des conteneurs Docker car le noyau est partagé avec l'hôte et est la partie commune entre toutes les distributions linux.
- Un système de fichiers racine : contient la structure du système de fichiers. Il peut être différent d'une distribution linux à l'autre. Il est en lecture seule jusqu'à ce que la séquence de démarrage soit terminée.
Docker utilise UnionFS pour gérer les couches de blocs de disque à l'intérieur d'un conteneur afin que vous puissiez les empiler.
En coulisse, il utilise un montage d'union qui permet à plusieurs systèmes de fichiers d'être montés en même temps, apparaissant comme un système virtuel entier. En fait, il dépose la couche d'image de base en mode lecture-écriture par-dessus le système de fichiers racine de base en mode lecture seule.
Ici, vous avez une pile de blocs de disques superposés de telle sorte que la distribution linux dont provient l'image de base contiendrait le même système de fichiers une fois installée sur un hôte réel, mais cette fois-ci à l'intérieur d'un conteneur.
La dernière chose qui manque maintenant est : comment faire fonctionner cette chose de manière isolée ?
La réponse est : les espaces de noms. Je ne vais pas entrer dans les détails ici car cela s'écarterait un peu de la question initiale. Mais ce que vous devez savoir, c'est que depuis le noyau 2.4.19, des espaces de noms de différentes sortes sont apparus au fil des ans. Actuellement, les espaces de noms suivants sont disponibles :
- IPC : espace de nom IPC (communications interprocessus)
- MNT : espace de noms de montage
- NET : espace de nom du réseau
- PID : espace de nom pid
- USER : espace de nom de l'utilisateur (uid)
- UTS : Espace de noms UTS (noms d'hôtes)
Les espaces de noms sont des structures isolées à l'intérieur du noyau qui permettent aux processus de s'exécuter dans un environnement particulier. Par exemple, l'espace de noms MNT sera la caractéristique clé pour qu'un processus fonctionne dans les spécificités du système de fichiers racine de l'image de base. L'espace de noms NET sera une autre caractéristique clé pour qu'un conteneur dispose d'interfaces réseau spécifiques afin de communiquer avec le pont docker, etc.
Donc, oui, le but principal de tout cela est d'exécuter une application isolée, de l'expédier de votre environnement local à la production facilement à l'intérieur d'une boîte appelée conteneur.
Ce serait une bonne idée de lire la documentation de docker avant de creuser davantage.