137 votes

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

Je viens de commencer à étudier Docker et il y a quelque chose qui me perturbe beaucoup. Comme je l'ai lu sur le site web de Docker, un conteneur est différent d'une machine virtuelle. D'après ce que j'ai compris, un conteneur est simplement un bac à sable à l'intérieur duquel un système de fichiers isolé complet est exécuté.

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

Tout ça va bien. Ce qui me perturbe c'est qu'il y a des images Docker nommées d'après des systèmes d'exploitation. On voit des images comme Ubuntu, Debian, Fedora, CentOS, etc.

Maintenant, ma question est la suivante : que sont vraiment ces images? En quoi est-ce différent de créer un conteneur basé sur l'image Debian et de créer une machine virtuelle et d'installer Debian?

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

De même, dans les exemples que j'ai vus, lorsque nous faisons docker run ubuntu echo "bonjour le monde", il semble que nous démarrons une machine virtuelle avec Ubuntu et lui faisons exécuter la commande echo "bonjour le monde".

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

Quoi qu'il en soit, que signifient ces images nommées d'après des systèmes d'exploitation? En quoi est-ce différent de faire fonctionner un conteneur avec l'une de ces images et de démarrer une machine virtuelle avec le système d'exploitation invité correspondant?

L'idée est-elle que nous partagions juste le noyau avec le système d'exploitation hôte (et par conséquent nous avons accès aux ressources matérielles de la machine sous-jacente, sans avoir besoin de virtualiser le matériel), mais nous utilisons quand même les fichiers et les binaires de chaque système différent sur les conteneurs pour prendre en charge l'application que nous voulons exécuter?

2 votes

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

96voto

drookie Points 7850

Étant donné que toutes les distributions Linux exécutent le même noyau Linux (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 utilisateur et en prétendant qu'il s'agit d'une autre distribution. En étant spécifique, installer un conteneur CentOS à l'intérieur du système d'exploitation Ubuntu signifiera que vous obtiendrez le logiciel utilisateur de CentOS, tout en exécutant le même noyau, pas même une autre instance de noyau.

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

Si cela était plus facile, vous pouvez penser à docker comme une sorte d'environnement chroot très sophistiqué et avancé.

3 votes

Donc c'est pourquoi je peux héberger mon code Golang compilé dans le conteneur Scratch vide - car le code compilé a seulement besoin du noyau?

1 votes

Alors comment le système d'exploitation invité sait-il utiliser le noyau du système d'exploitation hôte (et comment le fait-il)? À ma connaissance, les bases d'images Docker utilisent des images standard de système d'exploitation. Dans votre exemple, ce n'est pas comme s'il y avait une construction personnalisée de CentOS qui sait utiliser le noyau du parent? Ou est-ce aussi simple qu'un tour de passe-passe du 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 elle ne serait tout simplement jamais lue?

0 votes

J'aime votre explication mais comment expliquez-vous l'exécution de conteneurs Linux sur Windows alors ? Est-ce que Server 2016 et Windows 10 contiennent un noyau Linux pour permettre l'utilisation de Docker ? Est-ce la raison pour laquelle ces versions sont nécessaires ?

3voto

J'avais du mal avec la même question que vous posez, et voici ce que j'ai compris.

Les conteneurs n'ont pas de système d'exploitation invité, vous avez raison à ce sujet.

Alors pourquoi baser le conteneur sur une image OS ?

Parce que vous voudriez utiliser certaines commandes comme (apt, ls, cd, pwd). Ces commandes sont des appels à des fichiers binaires qui pourraient vous être disponibles dans votre OS hôte sans avoir à installer quoi que ce soit. Pour pouvoir exécuter ces commandes à l'intérieur de votre image docker, vous devez avoir les binaires pour eux à l'intérieur de votre image, en raison de l'isolation vous n'exécutez pas simplement les binaires de l'OS hôte.

Consultez cette réponse pour mieux comprendre pourquoi nous avons même besoin d'une image de base: https://stackoverflow.com/a/62384611

1voto

Faisal Arshed Points 151

Les conteneurs s'exécutent sur un noyau unique. En d'autres termes, tous les conteneurs ont un seul noyau (système d'exploitation hôte). Alors que les hyperviseurs ont plusieurs noyaux. Chaque machine virtuelle s'exécute sur un noyau différent.

Et "docker run ubuntu" est tout simplement similaire à la création d'un environnement chroot.

-1voto

Limozilla Points 21

Pour donner plus de clarté à la réponse de @drookie :

  • Donc, lorsque vous installez Docker Desktop, généralement il installe une machine virtuelle Linux sur laquelle exécuter les conteneurs.

    • ce qui se passe, c'est qu'après l'installation de docker desktop sur macOS/windowsOS, il a installé la machine virtuelle Linux exécutant Docker Engine.

    • Pour ajouter plus de clarté en profondeur : Certaines des magies dont Docker Desktop s'occupe pour les développeurs incluent :

      • Une machine virtuelle Linux sécurisée et optimisée qui exécute des outils Linux et des conteneurs
      • Intégration transparente dans le système hôte offrant aux conteneurs un accès au système de fichiers et au réseau
      • Outils de conteneur regroupés comprenant Kubernetes, Docker Compose, buildkit, scanning
      • Tableau de bord Docker pour gérer visuellement tout votre contenu de conteneur
      • Un installateur en un clic simple pour Mac et Windows
      • Des paramètres par défaut sains et sécurisés préconfigurés
      • Mises à jour automatiques incrémentielles pour maintenir votre système en sécurité

dans le cas où vous installez directement docker-engine sur un OS, il utilisera le même noyau Linux HÔTE.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X