VM ou Docker ?

Comment comprendre que vous avez besoin de Docker et non d'une VM ? Vous devez déterminer exactement ce que vous voulez isoler. Si vous souhaitez isoler un système avec des ressources garanties et du matériel virtuel, le choix doit se porter sur la machine virtuelle. Si vous devez isoler les applications en cours d'exécution en tant que processus système distincts, vous aurez besoin de Docker.

Alors, quelle est la différence entre les conteneurs Docker et les VM ?

Machine virtuelle (VM) est un ordinateur virtuel avec tous les périphériques virtuels et un disque dur virtuel, sur lequel un nouveau système d'exploitation indépendant est installé avec les pilotes de périphériques virtuels, la gestion de la mémoire et d'autres composants. Autrement dit, nous obtenons une abstraction du matériel physique qui vous permet d'exécuter de nombreux ordinateurs virtuels sur un seul ordinateur.
Une VM installée peut occuper de l'espace disque de différentes manières :

  • espace disque fixe, qui permet un accès plus rapide au disque dur virtuel et évite la fragmentation des fichiers ;
  • allocation mémoire dynamique. Lors de l'installation d'applications supplémentaires, la mémoire leur sera allouée dynamiquement jusqu'à ce qu'elle atteigne la quantité maximale qui lui est allouée.

Plus il y a de machines virtuelles sur le serveur, plus elles occupent d'espace et nécessitent également le support constant de l'environnement nécessaire au fonctionnement de votre application.

Docker est un logiciel pour créer des applications basées sur des conteneurs. Les conteneurs et les machines virtuelles présentent des avantages similaires, mais fonctionnent différemment. Les conteneurs prennent moins de place, car abusent de plus de ressources partagées du système hôte que de la machine virtuelle, car contrairement à VM, fournit une virtualisation au niveau du système d'exploitation, pas du matériel. Cette approche offre moins d'empreinte mémoire, un déploiement plus rapide et une mise à l'échelle plus facile.

Le conteneur fournit un mécanisme plus efficace pour encapsuler les applications en fournissant les interfaces nécessaires au système hôte. Cette fonctionnalité permet aux conteneurs de partager le cœur du système, où chacun des conteneurs s'exécute comme un processus distinct du système d'exploitation principal, qui possède son propre ensemble de zones de mémoire (son propre espace d'adressage virtuel). Étant donné que l'espace d'adressage virtuel de chaque conteneur est le sien, les données appartenant à différentes zones de mémoire ne peuvent pas être modifiées.
L'OS natif de Docker est Linux (Docker peut également être utilisé sur Windows et MacOS), il utilise ses principaux avantages, qui lui permettent d'organiser un noyau divisé. Le lancement des conteneurs Docker sur Windows se fera à l'intérieur d'une machine virtuelle Linux, car les conteneurs partagent le système d'exploitation du système hôte et le système d'exploitation principal pour eux est Linux.

Conteneur - comment ça marche ?

récipient est une abstraction au niveau de l'application qui combine code et dépendances. Les conteneurs sont toujours créés à partir d'images, en ajoutant une couche supérieure inscriptible et en initialisant divers paramètres. Étant donné qu'un conteneur possède sa propre couche d'écriture et que toutes les modifications sont stockées dans cette couche, plusieurs conteneurs peuvent partager l'accès à la même image principale.

Chaque conteneur peut être configuré via un fichier dans le projet docker-compose inclus dans la solution principale, docker-compose.yml. Vous pouvez y définir divers paramètres tels que le nom du conteneur, les ports, les identifiants, les limites de ressources, les dépendances entre les autres conteneurs. Si vous ne spécifiez pas de nom de conteneur dans les paramètres, Docker créera un nouveau conteneur à chaque fois, en lui attribuant un nom au hasard.

Lorsqu'un conteneur est démarré à partir d'une image, Docker monte le système de fichiers en lecture/écriture au-dessus de toutes les couches ci-dessous. C'est là que s'exécuteront tous les processus que nous voulons que notre conteneur Docker exécute.

Lorsque Docker démarre un conteneur pour la première fois, la couche de lecture/écriture initiale est vide. Lorsque des modifications se produisent, elles sont appliquées à ce calque ; par exemple, si vous souhaitez modifier un fichier, ce fichier sera copié de la couche en lecture seule ci-dessous vers la couche en lecture-écriture.
La version en lecture seule du fichier existera toujours, mais est désormais masquée sous la copie. Les volumes sont utilisés pour stocker des données, quel que soit le cycle de vie du conteneur. Les volumes sont initialisés lors de la création d'un conteneur.

Comment l'image est-elle associée au conteneur ?

Image - l'élément principal pour chaque contenant. L'image est créée à partir d'un Dockerfile ajouté au projet et est un ensemble de systèmes de fichiers (couches) superposés et regroupés, disponibles en lecture uniquement ; le nombre maximum de couches est de 127.

Au cœur de chaque image se trouve une image de base, qui est spécifiée par la commande FROM - le point d'entrée lors de la génération d'une image Dockerfile. Chaque couche est une couche en lecture seule et est représentée par une seule commande qui modifie le système de fichiers, écrite dans un Dockerfile.
Pour combiner ces couches en une seule image, Docker utilise le système de fichiers Union multicouche avancé (AuFS est construit sur UnionFS), permettant à différents fichiers et répertoires de différentes couches de fichiers de se chevaucher de manière transparente, créant un système de fichiers associé.

Les couches contiennent des métadonnées qui vous permettent de stocker des informations connexes sur chaque couche au moment de l'exécution et de la génération. Chaque calque contient un lien vers le calque suivant, si le calque n'a pas de lien, il s'agit du calque le plus haut de l'image.

Dockerfile peut contenir des commandes telles que :

  • DE - point d'entrée dans la formation de l'image ;
  • MAINTAINER - le nom du propriétaire de l'image ;
  • RUN - exécution de la commande lors de l'assemblage de l'image ;
  • AJOUTER - en copiant le fichier hôte dans une nouvelle image, si vous spécifiez un fichier URL, Docker le téléchargera dans le répertoire spécifié ;
  • ENV - variables d'environnement ;
  • CMD - démarre la création d'un nouveau conteneur basé sur l'image ;
  • ENTRYPOINT - La commande est exécutée au démarrage du conteneur.
  • WORKDIR est le répertoire de travail pour l'exécution de la commande CMD.
  • USER - Définit l'UID du conteneur créé à partir de l'image.
  • VOLUME - Monte le répertoire hôte sur le conteneur.
  • EXPOSE est un ensemble de ports écoutés dans le conteneur.

Comment fonctionne UnionFS ?

UnionFS - système de fichiers de pile de services (FS) pour Linux et FreeBSD. Ce FS implémente le mécanisme de copie sur écriture (Copy-On-Write, COW). L'unité de travail d'UnionFS est une couche, chaque couche doit être considérée comme un système de fichiers à part entière distinct avec une hiérarchie de répertoires à partir de la racine elle-même. UnionFS crée un montage union pour d'autres systèmes de fichiers et vous permet de fusionner de manière transparente des fichiers et des répertoires de différents systèmes de fichiers (appelés branches) en un seul système de fichiers lié, de manière transparente pour l'utilisateur.

Le contenu des répertoires avec les mêmes chemins sera affiché ensemble dans un répertoire combiné (dans le même espace de noms) du système de fichiers résultant.

UnionFS combine des couches basées sur les principes suivants :

  • l'une des couches devient une couche de niveau supérieur, la deuxième couche et les suivantes deviennent des couches de niveau inférieur ;
  • les objets de calque sont accessibles à l'utilisateur "de haut en bas", c'est-à-dire si l'objet demandé est dans la couche "supérieure", il est renvoyé, indépendamment de la présence d'un objet de même nom dans la couche "inférieure" ; sinon, l'objet de calque "inférieur" est renvoyé ; si l'objet demandé n'est ni là ni là, l'erreur "No such file or directory" est renvoyée ;
  • la couche de travail est la couche "supérieure", c'est-à-dire que toutes les actions de l'utilisateur pour modifier les données sont reflétées uniquement sur la couche de niveau supérieur, sans affecter le contenu des couches de niveau inférieur.

Docker est la technologie la plus courante pour l'utilisation de conteneurs dans le travail d'application. Il est devenu la norme dans ce domaine, s'appuyant sur les cgroups et les espaces de noms fournis par le noyau Linux.

Docker nous permet de déployer rapidement des applications et de tirer le meilleur parti du système de fichiers en partageant le noyau du système d'exploitation entre tous les conteneurs, s'exécutant en tant que processus de système d'exploitation distincts.

Source: habr.com

Ajouter un commentaire