Conteneur Docker OS: quelle est la différence avec une VM alors?

10

Quel est l'intérêt d'utiliser un OS dans un conteneur Docker?

Dans le référentiel docker, vous trouverez une image de docker Ubuntu: https://registry.hub.docker.com/_/ubuntu/ Je pensais que Docker était plus au niveau "application".

Quelles sont alors les différences entre un conteneur docker Ubuntu et une machine virtuelle Ubuntu? Si vous avez un système d'exploitation complet dans un conteneur Docker, n'est-il pas inutile d'utiliser Docker alors?

Merci

Michael
la source

Réponses:

11

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.

Xavier Lucas
la source
Merci, cela signifie-t-il qu'une image "Ubuntu" comme celle-ci: registry.hub.docker.com/_/ubuntu n'a aucun sens en soi et sert de base à un conteneur plus défini comme un "conteneur nginx"? Je ne sais pas si j'ai du sens?
Michael
Oui. C'est exactement à cela qu'il sert. Et généralement, vous entendrez des gens les appeler des images de base pour cette raison.
Xavier Lucas
J'ai parcouru la documentation et il y a une chose dont je ne suis pas sûr. Disons que la taille de l'image ubuntu est de 140 Mo. Ensuite, une autre image basée sur cette image ajoute 10 Mb supplémentaires. Si j'exécute 2 conteneurs à partir de cette image, chaque conteneur fera-t-il 150 Mo et j'ai besoin de 300 Mo d'espace disque OU la taille totale restera 150 Mo? Merci
Michael
Wow, je viens de télécharger l'image officielle de python et la taille virtuelle est de 802,4 Mo. Le téléchargement a pris du temps. Si j'en gère 10 conteneurs, combien d'espace les conteneurs prendront-ils? Merci
Michael
2
@YAmikep Certaines images peuvent être grandes en raison de dépendances mal nettoyées. Si vous démarrez 10 conteneurs avec la même image, cela ne signifie pas que l'espace disque utilisé sera 10 fois la taille de l'image. Vous téléchargez une image une fois mais vous l'exécutez à partir de plusieurs conteneurs. Docker utilise la copie sur écriture lors de l'exécution de plusieurs conteneurs à partir de la même image, ce qui signifie essentiellement qu'il partagera l'image entre les conteneurs et créera une copie privée d'un fichier à l'intérieur d'une image uniquement si le conteneur l'ajoute / la modifie. La taille réelle utilisée est donc liée à l'activité à l'intérieur des conteneurs, et non au nombre d'exécutions.
Xavier Lucas