Pourquoi utilisons-nous une image de base du système d'exploitation avec Docker si les conteneurs n'ont pas de système d'exploitation invité?

84

Je viens juste de commencer à étudier Docker et il y a quelque chose qui me semble assez déroutant. Comme je l'ai lu sur le site Web de Docker, un conteneur est différent d'une machine virtuelle. Si j'ai bien compris, un conteneur est simplement un bac à sable à l'intérieur duquel est exécuté un système de fichiers isolé complet.

J'ai également lu qu'un conteneur n'a pas de système d'exploitation invité installé. Au lieu de cela, il s'appuie sur le noyau du système d'exploitation sous-jacent.

Tout ça va bien. Ce qui me rend confus, c'est qu'il existe des images Docker nommées d'après des systèmes d'exploitation. Nous voyons des images comme Ubuntu, Debian, Fedora, CentOS, etc.

Mon point est: quelles sont ces images, vraiment? En quoi la création d'un conteneur basé sur l'image Debian diffère-t-elle de la création d'une machine virtuelle et de l'installation de Debian?

Je pensais que les conteneurs n'avaient pas de système d'exploitation invité, mais lorsque nous créons des images, nous les basons sur une image nommée d'après un système d'exploitation.

De plus, dans les exemples que j'ai vus lorsque nous le faisons docker run ubuntu echo "hello world", il semble que nous allumons une machine virtuelle avec Ubuntu et la forçons à exécuter la commande echo "hello world".

De la même manière, lorsque nous le faisons docker run -it ubuntu /bin/bash, il semble que nous allumons une machine virtuelle avec Ubuntu et que nous y accédions via une ligne de commande.

Quoi qu'il en soit, quelles sont les images nommées d'après les systèmes d'exploitation? Quelle différence y a-t-il entre exécuter un conteneur avec l'une de ces images et créer une machine virtuelle avec le système d'exploitation invité correspondant?

C’est l’idée que nous partageons simplement le noyau avec le système d’exploitation hôte (et que nous avons par conséquent accès aux ressources matérielles sous-jacentes de la machine, sans avoir à virtualiser le matériel), tout en utilisant les fichiers et les fichiers binaires de chaque système sur les conteneurs afin soutenir n'importe quelle application que nous voulons exécuter?

utilisateur1620696
la source
2
À mon avis, vos objectifs en matière de virtualisation sont la clé. Si vous avez besoin de bibliothèques, de langues, etc. sur un système d'exploitation, les conteneurs de système d'exploitation sont adaptés à vos besoins. Mais si votre besoin concerne uniquement l'application en tant que composants, il n'est pas nécessaire d'utiliser OS comme image de base. Je pense que cet article pourrait l'expliquer clairement blog.risingstack.com/…
metamorph

Réponses:

68

Étant donné que toutes les distributions Linux utilisent le même noyau (et oui, c'est un peu simplifié) et ne diffèrent que par les logiciels utilisateur, il est assez facile de simuler un environnement de distribution différent - en installant simplement ce logiciel et en prétendant qu'il s'agit d'une autre distribution. Étant spécifique, installer le conteneur CentOS dans le système d’exploitation Ubuntu signifie que vous obtiendrez le domaine utilisateur de CentOS, tout en exécutant le même noyau, pas même une autre instance du noyau.

Ainsi, la virtualisation légère revient à avoir des compartiments isolés dans le même système d'exploitation. Au contraire, la virtualisation réelle consiste à avoir un autre système d'exploitation complet à l'intérieur du système d'exploitation hôte. C'est pourquoi docker ne peut pas exécuter FreeBSD ou Windows sous Linux.

Si cela vous est plus facile, vous pouvez penser que Docker est en quelque sorte un environnement chroot très sophistiqué et avancé.

drookie
la source
3
C'est pourquoi je peux héberger mon code golang compilé dans le conteneur Scratch vide - car le code compilé n'a besoin que du noyau?
Francis Norton
Alors, comment le système d'exploitation invité sait-il utiliser le noyau du système d'exploitation hôte (et comment le faire)? Autant que je sache, les bases d'images du menu fixe utilisent des images de système d'exploitation standard. Dans votre exemple, ce n’est pas comme s’il existe une version personnalisée de CentOS qui sait utiliser le noyau du parent? Ou est-ce aussi simple qu'une astuce de système de fichiers (aufs) où Docker redirige les lectures des invités (CentOS) de / boot vers l'hôte (Ubuntu)? Dans ce cas, l'invité (CentOS) installerait sa propre copie de / boot, mais ne serait-il jamais lu?
James S
J'aime votre explication, mais comment expliquez-vous l'exécution de conteneurs Linux sous Windows? Server 2016 et Windows 10 contiennent-ils un noyau Linux pour permettre l'utilisation de Docker? Est-ce pour cela que ces versions sont nécessaires?
duct_tape_coder le
C'est simple: ils s'exécutent sous une pile de virtualisation complète d'Hyper-V, au sein d'une machine virtuelle Linux native: docs.microsoft.com/en-us/virtualization/windowscontainers/… .
drookie
1

Les conteneurs fonctionnent sur un seul noyau. En d'autres termes, tous les conteneurs ont un seul noyau (OS hôte). Par ailleurs, les hyperviseurs ont plusieurs noyaux. Chaque machine virtuelle s'exécute sur un noyau différent.

Et "docker run ubuntu" revient à créer un environnement chroot.

Shiv Sandhu
la source