VM ou Docker?

Comment savoir si vous avez besoin de Docker plutôt que d'une VM ? Il faut déterminer ce que vous voulez isoler. Si vous devez isoler un système avec des ressources garanties et un matériel virtuel, alors le choix doit se porter sur une VM. Si vous devez isoler des applications en cours d'exécution comme des processus distincts du système, vous aurez besoin de Docker.

Quelle est donc la différence entre les conteneurs Docker et les VM ?

Une machine virtuelle (VM) — est un ordinateur virtuel avec tous les dispositifs virtuels et un disque dur virtuel, sur lequel une nouvelle OS indépendante est installée avec des pilotes virtuels de dispositifs, la gestion de la mémoire et d'autres composants. Autrement dit, nous obtenons une abstraction du matériel physique permettant d'exécuter plusieurs ordinateurs virtuels sur un seul ordinateur.
Une VM installée peut occuper différentes quantités d'espace sur le disque de l'ordinateur :

  • espace fixe sur le disque dur, ce qui permet un accès plus rapide au disque dur virtuel et évite la fragmentation du fichier ;
  • allocation dynamique de la mémoire. Lors de l'installation d'applications supplémentaires, la mémoire sera allouée dynamiquement jusqu'à atteindre le volume maximal qui lui est consacré.

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

Docker est un logiciel pour créer des applications basées sur des conteneurs. Les conteneurs et machines virtuelles ont des avantages similaires mais fonctionnent différemment. Les conteneurs prennent moins de place car ils réutilisent un plus grand nombre de ressources communes du système hôte que les VM, car contrairement aux VM, cela fournit une virtualisation au niveau du système d'exploitation, et non du matériel. Cette approche permet une réduction de l'espace occupé, un déploiement rapide et une mise à l'échelle plus simple.

Le conteneur offre un mécanisme d'encapsulation des applications plus efficace, en fournissant les interfaces nécessaires du système hôte. Cette fonctionnalité permet aux conteneurs de partager le noyau du système, chaque conteneur fonctionnant comme un processus distinct du système d'exploitation principal, ayant son propre ensemble d'espaces mémoire (son propre espace d'adresses virtuelles). Puisque l'espace d'adresses virtuelles de chaque conteneur est propre, les données appartenant à différents espaces mémoire ne peuvent pas être altérées.
Le système d'exploitation natif pour Docker est Linux (Docker peut également être utilisé sur Windows et MacOS), il tire parti de ses principaux avantages qui lui permettent d'organiser la séparation du noyau. L'exécution de conteneurs Docker sur Windows se fera à l'intérieur d'une machine virtuelle avec le système d'exploitation Linux, car les conteneurs partagent le système d'exploitation du système hôte et le système principal pour eux est Linux.

Conteneur — comment cela fonctionne ?

Conteneur — c'est une abstraction au niveau de l'application, combinant le code et les dépendances. Les conteneurs sont toujours créés à partir d'images, en ajoutant une couche accessible en écriture et en initialisant divers paramètres. Étant donné qu'un conteneur possède sa propre couche d'écriture et que toutes les modifications sont conservées dans cette couche, plusieurs conteneurs peuvent partager l'accès à une 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. Des paramètres variés peuvent y être spécifiés, tels que le nom du conteneur, les ports, les identifiants, les limites de ressources, et les dépendances entre différents conteneurs. Si aucun nom n'est spécifié dans la configuration, Docker créera à chaque fois un nouveau conteneur en lui attribuant un nom aléatoire.

Lorsqu'un conteneur est démarré à partir d'une image, Docker monte le système de fichiers en lecture et écriture au-dessus de toutes les couches inférieures. C'est ici que tous les processus que nous souhaitons exécuter dans notre conteneur Docker seront réalisés.

Lorsque Docker démarre un conteneur pour la première fois, la couche initiale de lecture-écriture est vide. Lorsque des modifications se produisent, elles sont appliquées à cette couche ; par exemple, si vous souhaitez modifier un fichier, ce fichier sera copié de la couche de lecture seule en dessous vers la couche de lecture et écriture.
La version du fichier, disponible en lecture seule, continuera d'exister, mais elle sera désormais masquée sous une copie. Des volumes sont utilisés pour stocker les données, indépendamment du cycle de vie du conteneur. Les volumes sont initialisés lors de la création du conteneur.

Comment une image est-elle liée à un conteneur ?

Image — l'élément principal de chaque conteneur. Une image est créée à partir d'un Dockerfile ajouté au projet et représente un ensemble de systèmes de fichiers (couches) empilés les uns sur les autres et regroupés, accessibles en lecture seule ; le nombre maximal de couches est de 127.

À la base de chaque image se trouve une image de base, qui est spécifiée par la commande FROM — point d'entrée lors de la formation de l'image Dockerfile. Chaque couche est une couche en lecture seule et est représentée par une commande modifiant le système de fichiers inscrit dans le Dockerfile.
Pour combiner ces couches en une seule image, Docker utilise le système de fichiers Union à couches avancées (AuFS basé sur UnionFS), permettant à différents fichiers et répertoires de différentes couches de fichiers de se superposer de manière transparente, créant un système de fichiers lié.

Les couches contiennent des métadonnées qui permettent de conserver des informations connexes sur chaque couche pendant l'exécution et la construction. Chaque couche contient un lien vers la couche suivante ; si une couche n'a pas de lien, cela signifie qu'elle est la couche supérieure dans l'image.

Un Dockerfile peut contenir des commandes telles que :

  • FROM — point d'entrée lors de la formation de l'image ;
  • MAINTAINER — nom du propriétaire de l'image ;
  • RUN — exécute une commande lors de la construction de l'image ;
  • ADD — copie un fichier de l'hôte dans la nouvelle image, si un URL est spécifié, Docker le téléchargera dans le répertoire donné ;
  • ENV — variables d'environnement ;
  • CMD — lance la création d'un nouveau conteneur basé sur l'image ;
  • ENTRYPOINT — commande exécutée lors du lancement du conteneur.
  • WORKDIR — répertoire de travail pour l'exécution de la commande CMD.
  • USER — définit l'UID pour le conteneur créé à partir de l'image.
  • VOLUME — monte un répertoire de l'hôte dans le conteneur.
  • EXPOSE — ensemble de ports écoutés dans le conteneur.

Comment fonctionne UnionFS ?

UnionFS — un système de fichiers de superposition (FS) pour Linux et FreeBSD. Ce système de fichiers implémente un mécanisme de copie sur écriture (Copy-On-Write, COW). L'unité de travail de UnionFS est la couche, chaque couche devant être considérée comme un système de fichiers complet avec une hiérarchie de répertoires depuis la racine. UnionFS crée un montage agrégé pour d'autres systèmes de fichiers et permet aux utilisateurs de combiner de manière transparente des fichiers et des répertoires provenant de différents systèmes de fichiers (appelés branches) en un seul système de fichiers connecté.

Le contenu des répertoires ayant des chemins identiques sera affiché ensemble dans un répertoire agrégé (dans un espace de noms unique) du système de fichiers résultant.

UnionFS combine les couches selon les principes suivants :

  • une des couches devient la couche supérieure, les deuxième et suivantes deviennent des couches inférieures ;
  • les objets des couches sont accessibles à l'utilisateur « de haut en bas », c'est-à-dire que si l'objet demandé se trouve dans la couche « supérieure », c'est celui-ci qui est retourné, indépendamment de l'existence d'un objet portant le même nom dans la couche « inférieure » ; sinon, l'objet de la couche « inférieure » est retourné ; si l'objet demandé n'est présent ni ici ni là, une erreur « Aucun fichier ou répertoire de ce type » est renvoyée ;
  • la couche de travail est la « supérieure », donc toutes les actions de l'utilisateur concernant les données n'affectent que le contenu de la couche supérieure, sans impacter celui des couches inférieures.

Docker est la technologie la plus répandue pour l'utilisation de conteneurs dans le fonctionnement des applications. Il est devenu la norme dans ce domaine, s'appuyant sur les cgroups et l'espace de noms fournis par le noyau Linux.

Docker nous permet de déployer rapidement des applications et d'utiliser de manière optimale le système de fichiers en partageant le noyau du système d'exploitation entre tous les conteneurs, fonctionnant comme des processus séparés du système d'exploitation.

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster