Vous manquez de concepts Docker de base. C'est une chose complètement différente.
La première chose que vous devez savoir est la philosophie de Docker: exécuter un processus isolé dans un conteneur. Vous n'exécuterez pas un OS dans un conteneur Docker, vous exécuterez 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.
Maintenant, vous devriez vous demander comment est-il possible d'obtenir un processus s'exécutant à l'intérieur d'une image de base linux différente de la distribution linux avec laquelle votre hôte s'exécute. Pour qu'un OS fonctionne, vous avez essentiellement besoin de:
- Un système de fichiers de démarrage: contient le chargeur de démarrage et le noyau qui résideront en mémoire une fois chargés. Nous ne nous en soucions pas dans le cas des conteneurs Docker parce que 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'à la fin de la séquence de démarrage.
Docker utilise UnionFS pour gérer des couches de blocs de disques à l'intérieur d'un conteneur afin que vous puissiez les empiler.
Dans les coulisses, il utilise un montage union qui permet de monter plusieurs systèmes de fichiers en même temps, apparaissant comme un système virtuel entier. En fait, il supprime la couche d'image de base en mode lecture-écriture au-dessus du système de fichiers racine de base en mode lecture seule.
Ici, vous avez une pile de blocs de disques superposés de manière à ce que la distribution linux dont provient l'image de base contienne le même système de fichiers une fois installé 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 gérer cette chose isolée?
La réponse est: les espaces de noms. Je n'entrerai pas dans les détails ici car cela s'écarterait un peu de la question d'origine. Mais ce que vous devez savoir, c'est que depuis le noyau 2.4.19, des espaces de noms de différents types sont apparus au fil des ans. Actuellement, les espaces de noms suivants sont disponibles:
- IPC: espace de noms IPC (communications interprocessus)
- MNT: monter l'espace de noms
- NET: espace de noms réseau
- PID: espace de noms pid
- USER: espace de noms 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 avec un environnement particulier. Par exemple, l'espace de noms MNT sera la fonctionnalité clé pour lancer un processus 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 un conteneur d'avoir des 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 facilement de votre environnement local à la production avec à 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.