GNU/Linux >> Tutoriels Linux >  >> Panels >> Docker

Qu'est-ce que Docker ? Comment ça marche?

Dans ce guide complet, j'ai expliqué ce qu'est Docker, son évolution, les concepts sous-jacents de Linux et son fonctionnement.

Docker est devenu la norme de facto en matière d'implémentations basées sur des conteneurs. Docker est la base de l'orchestration basée sur des conteneurs, des implémentations à petite échelle aux applications d'entreprise à grande échelle.

Docker a rapidement gagné en popularité et en adoption dans la communauté DevOps, car il est développé pour la portabilité et conçu pour une architecture de microservices moderne.

Dans ce blog, vous apprendrez,

  1. Qu'est-ce que Docker ?
  2. Découvrez Docker et découvrez pourquoi Docker est avantageux et différent des autres technologies de conteneurs.
  3. Architecture principale de Docker et ses composants clés
  4. Évolution des conteneurs et concept sous-jacent des conteneurs Linux
  5. Qu'est-ce qu'un conteneur et quelles fonctionnalités Linux le font fonctionner ?
  6. La différence entre un processus, un conteneur et une VM

Ici, l'idée est de maîtriser les bases pour comprendre ce qu'est réellement Docker et comment il fonctionne.

Qu'est-ce que Docker ?

Docker est un projet open source populaire écrit en Go et développé par Dotcloud (une société PaaS).

Il s'agit d'un moteur de conteneur qui utilise les fonctionnalités du noyau Linux comme les espaces de noms et les groupes de contrôle pour créer des conteneurs au-dessus d'un système d'exploitation. Vous pouvez donc l'appeler virtualisation au niveau du système d'exploitation.

Docker a été initialement construit sur des conteneurs Linux (LXC) . Plus tard, Docker a remplacé LXC par son conteneur d'exécution libcontainer (qui fait maintenant partie de runc). J'ai expliqué les concepts de base de LXC et de conteneur vers la fin de l'article.

Vous vous demandez peut-être en quoi Docker est différent d'un conteneur Linux (LXC), car tous les concepts et l'implémentation se ressemblent ?

En plus d'être simplement une technologie de conteneur, Docker possède des composants d'emballage bien définis qui facilitent les applications d'emballage . Avant Docker, il n'était pas facile d'exécuter des conteneurs. Cela signifie qu'il fait tout le travail pour dissocier votre application de l'infrastructure en regroupant toutes les exigences du système d'application dans un conteneur.

Par exemple, si vous avez un fichier jar Java, vous pouvez l'exécuter sur n'importe quel serveur sur lequel Java est installé. De la même manière, une fois que vous avez empaqueté un conteneur avec les applications requises à l'aide de Docker, vous pouvez l'exécuter sur n'importe quel autre hôte sur lequel Docker est installé.

Nous aurons des conteneurs opérationnels en exécutant quelques commandes et paramètres Docker.

Différence entre Docker et conteneur

Docker est une technologie ou un outil développé pour gérer efficacement les conteneurs.

Alors, puis-je exécuter un conteneur sans Docker ?

Oui! bien sûr. Vous pouvez utiliser la technologie LXC pour exécuter des conteneurs sur des serveurs Linux. De plus, les derniers outils comme Podman offrent des flux de travail similaires à Docker.

Ce que vous devez savoir sur Docker :

  1. Docker n'est pas LXC
  2. Docker n'est pas une solution de machine virtuelle.
  3. Docker n'est pas un système de gestion de configuration et ne remplace pas Chef, Puppet, Ansible, etc.
  4. Docker n'est pas une plate-forme en tant que technologie de service.
  5. Docker n'est pas un conteneur.

Qu'est-ce qui rend Docker si génial ?

Docker dispose d'un flux de travail efficace pour déplacer l'application de l'ordinateur portable du développeur vers l'environnement de test jusqu'à la production. Vous en comprendrez plus en regardant un exemple pratique d'empaquetage d'une application dans une image Docker.

Savez-vous que le démarrage d'un conteneur docker prend moins d'une seconde ?

Il est incroyablement rapide et peut fonctionner sur n'importe quel hôte avec un noyau Linux compatible. (Prend également en charge Windows)

Remarque : vous ne pouvez pas exécuter un conteneur Windows sur un hôte Linux car il n'y a pas de prise en charge du noyau Linux pour Windows. Vous pouvez en savoir plus sur les conteneurs Windows ici

Docker utilise un système de fichiers union Copy-on-write pour son stockage d'images. Par conséquent, lorsque des modifications sont apportées à un conteneur, seules les modifications seront écrites sur le disque à l'aide d'une copie sur le modèle d'écriture.

Avec Copy on write, vous disposerez de couches de stockage partagées optimisées pour tous vos conteneurs.

Statistiques d'adoption de Docker

Voici les données des tendances google sur Docker. Vous pouvez voir que ce sujet a explosé au cours des cinq dernières années.

Voici un résultat d'enquête de Datadog, qui montre l'augmentation de l'adoption de Docker.

Architecture principale Docker

Les sections suivantes examineront l'architecture Docker et ses composants associés. Nous verrons également comment chaque composant fonctionne ensemble pour faire fonctionner Docker.

L'architecture Docker a changé plusieurs fois depuis sa création. Lorsque j'ai publié la première version de cet article, Docker était basé sur LXC

Voici quelques changements architecturaux notables qui se sont produits pour le Docker

  1. Docker est passé de LXC à libcontainer en 2014
  2. runc – une CLI pour faire tourner des conteneurs qui respectent toutes les spécifications OCI.
  3. containrd :Docker a séparé son composant de gestion des conteneurs de conteneurd en 2016

OCI :Open Container Initiative est une norme ouverte de l'industrie pour l'exécution et les spécifications des conteneurs.

Lorsque Docker a été initialement lancé, il avait une architecture monolithique. Maintenant, il est séparé en trois composants différents suivants.

  1. Moteur Docker (dockerd)
  2. docker-container (container)
  3. docker-runc (runc)

Docker et d'autres grandes organisations ont contribué à un runtime de conteneur standard et à des couches de gestion. D'où containerd et runc font désormais partie de la Cloud Native Foundation avec des contributeurs de toutes les organisations.

Remarque : Lors de l'installation de Docker, tous ces composants sont installés. Vous n'avez pas à l'installer séparément. Pour plus d'explications, nous l'affichons sous la forme de différents composants.

Examinons maintenant chaque composant Docker.

Moteur Docker

Le moteur Docker comprend le démon Docker, une interface API et Docker CLI. Le démon Docker (dockerd) s'exécute en continu en tant que dockerd service systemd. Il est responsable de la construction des images Docker.

Pour gérer les images et exécuter les conteneurs, dockerd appelle le docker-containerd API.

docker-containerd (containerd)

containerd est un autre service de démon système qui est responsable du téléchargement des images Docker et de leur exécution en tant que conteneur. Il expose son API pour recevoir des instructions du dockerd services

docker-runc

runc est l'environnement d'exécution du conteneur responsable de la création des espaces de noms et des groupes de contrôle requis pour un conteneur. Il exécute ensuite les commandes de conteneur à l'intérieur de ces espaces de noms. runc runtime est implémenté conformément à la spécification OCI.

Lisez cette excellente série d'articles de blog en 3 parties pour en savoir plus sur les runtimes de conteneurs.

Comment fonctionne Docker ?

Nous avons vu les éléments de base de Docker.

Comprenons maintenant le flux de travail Docker à l'aide des composants Docker.

Composants Docker

L'architecture docker de haut niveau officielle suivante Le diagramme montre le flux de travail Docker commun.

L'écosystème Docker est composé des quatre composants suivants

  1. Démon Docker (dockerd)
  2. Client Docker
  3. Images Docker
  4. Registres Docker
  5. Conteneurs Docker

Qu'est-ce qu'un démon Docker ?

Docker a une architecture client-serveur. Démon Docker (dockerd ) ou le serveur est responsable de toutes les actions liées aux conteneurs.

Le démon reçoit les commandes du client Docker via CLI ou API REST. Le client Docker peut se trouver sur le même hôte qu'un démon ou être présent sur n'importe quel autre hôte.

Par défaut, le démon docker écoute le docker.sock Prise UNIX. Si vous avez un cas d'utilisation pour accéder à distance à l'API Docker, vous devez l'exposer sur un port hôte. L'un de ces cas d'utilisation consiste à exécuter Docker en tant qu'agents Jenkins.

Si vous souhaitez exécuter Docker dans Docker, vous pouvez utiliser le docker.sock depuis la machine hôte.

Qu'est-ce qu'une image Docker ?

Les images sont les éléments de base de Docker. Il contient les bibliothèques, les dépendances et les outils du système d'exploitation pour exécuter une application.

Les images peuvent être prédéfinies avec des dépendances d'application pour créer des conteneurs. Par exemple, si vous souhaitez exécuter un serveur Web Nginx en tant que conteneur Ubuntu, vous devez créer une image Docker avec le binaire Nginx et toutes les bibliothèques du système d'exploitation requises pour exécuter Nginx.

Qu'est-ce qu'un Dockerfile ?

Docker a un concept de Dockerfile qui est utilisé pour construire l'image. Un Dockerfile un fichier texte qui contient une commande (instructions) par ligne.

Voici un exemple de Dockerfile.

Une image docker est organisée en couches. Chaque instruction sur un Dockerfile est ajouté un calque dans une image. La couche inscriptible la plus haute de l'image est un conteneur.

Chaque image est créée à partir d'une image de base.

Par exemple, si vous pouvez utiliser une image de base d'Ubuntu et créer une autre image avec l'application Nginx. Une image de base peut être une image parente ou une image construite à partir d'une image parente. Consultez son article docker pour en savoir plus.

Vous vous demandez peut-être d'où vient cette image de base (image parent) ? Il existe des utilitaires Docker pour créer l'image de base parent initiale. Il prend les bibliothèques de système d'exploitation requises et les intègre dans une image de base. Vous n'avez pas à le faire car vous obtiendrez les images de base officielles pour les distributions Linux.

La couche supérieure d'une image est accessible en écriture et utilisée par le conteneur en cours d'exécution. Les autres calques de l'image sont en lecture seule.

Qu'est-ce qu'un registre Docker ?

Il s'agit d'un référentiel (stockage) pour les images Docker.

Un registre peut être public ou privé. Par exemple, Docker Inc fournit un service de registre hébergé appelé Docker Hub. Il vous permet de charger et de télécharger des images à partir d'un emplacement central.

Remarque : Par défaut, lorsque vous installez Docker, il recherche des images à partir du hub Docker public, sauf si vous spécifiez un registre personnalisé dans les paramètres Docker.

Les autres utilisateurs du hub Docker peuvent accéder à toutes vos images si votre référentiel est public. Vous pouvez également créer un registre privé dans Docker Hub.

Le hub Docker agit comme git, où vous pouvez créer vos images localement sur votre ordinateur portable, les valider, puis les transférer vers le hub Docker.

Astuce : Lorsque vous utilisez Docker dans des réseaux/projets d'entreprise, configurez vos propres registres Docker au lieu d'utiliser le hub Docker public. Tous les fournisseurs de cloud ont leurs propres services de registre de conteneurs.

Qu'est-ce qu'un conteneur Docker ?

Les conteneurs Docker sont créés à partir d'images existantes. C'est une couche inscriptible de l'image.

Si vous essayez de relier des calques d'image et un conteneur, voici à quoi cela ressemble pour une image basée sur Ubuntu.

Vous pouvez empaqueter vos applications dans un conteneur, le valider et en faire une image idéale pour créer d'autres conteneurs à partir de celui-ci.

Les conteneurs peuvent être démarrés, arrêtés, validés et terminés. Si vous résiliez un conteneur sans le valider, toutes les modifications apportées au conteneur seront perdues.

Idéalement, les conteneurs sont traités comme des objets immuables et il n'est pas recommandé d'apporter des modifications à un conteneur en cours d'exécution. Au lieu de cela, apportez des modifications à un conteneur en cours d'exécution uniquement à des fins de test.

Deux ou plusieurs conteneurs peuvent être liés ensemble pour former une architecture d'application à plusieurs niveaux. Cependant, l'hébergement d'applications hautement évolutives avec Docker a été simplifié grâce à l'avènement d'outils d'orchestration de conteneurs tels que kubernetes.

Évolution des conteneurs

Si vous pensez que la conteneurisation est une nouvelle technologie, ce n'est pas le cas. Google utilise sa technologie de conteneurs dans son infrastructure depuis des années.

Le concept de conteneurs est né dans les années 2000. En fait, les racines remontent à 1979 lorsque nous avions chroot, un concept de changement du répertoire racine d'un processus.

Voici une liste de projets basés sur des conteneurs qui ont débuté en 2000.

Année Technologie
2 000 Les prisons FreeBSD ont introduit le concept de conteneur.
2003 Projet de serveur Linux-V publié avec le concept de virtualisation au niveau du système d'exploitation
2005 Solaris Zones :lancement du projet de virtualisation au niveau du système d'exploitation
2007 Google a publié un article sur les conteneurs de processus génériques
2008 La version initiale des conteneurs LXC
2011 cloudfoundry a annoncé le directeur
2013 lcmcty– Open source par Google
2013 Le projet Docker a été annoncé par DotCloud
2014 Fusée. (rkt) annoncé par CoreOS
2016 Aperçu du conteneur Windows tel que publié dans le cadre de Windows Server 2016

Qu'est-ce qu'un conteneur Linux (LXC) ?

Voyons maintenant ce qu'est un conteneur Linux.

Dans un environnement virtualisé typique, une ou plusieurs machines virtuelles s'exécutent sur un serveur physique à l'aide d'un hyperviseur tel que Xen, Hyper-V, etc.

D'autre part, les conteneurs s'exécutent au-dessus du noyau du système d'exploitation. Vous pouvez l'appeler virtualisation au niveau du système d'exploitation. Avant d'aborder les concepts de conteneur sous-jacents, vous devez comprendre deux concepts clés de Linux.

  1. Espace utilisateur : Tout le code requis pour exécuter des programmes utilisateur (applications, processus) est appelé espace utilisateur. Lorsque vous lancez une action de programme, par exemple, pour créer un fichier, le processus dans l'espace utilisateur effectue un appel système à l'espace Kernal.
  2. Espace noyau :C'est le cœur du système d'exploitation, où vous avez le code du noyau, qui interagit avec le matériel du système, le stockage, etc.

Un conteneur est un processus.

Vous démarrez un processus lorsque vous démarrez une application, par exemple un serveur Web Nginx. Un processus lui-même est une instruction autonome avec un isolement limité.

Et si nous pouvions isoler le processus avec uniquement les fichiers et la configuration nécessaires pour s'exécuter et fonctionner. C'est ce que fait un conteneur.

Un conteneur est un processus avec une isolation suffisante des composants de l'espace utilisateur pour donner l'impression d'un système d'exploitation séparé.

Le processus conteneur parent peut avoir un processus enfant. Vous pouvez donc dire qu'un conteneur est également un groupe de processus .

Par exemple, lorsque vous démarrez un service Nginx, il démarre un processus Nginx parent. Le processus parent couvre ses processus enfants comme le gestionnaire de cache, le chargeur de cache et les travailleurs.

Ainsi, lorsque vous démarrez un conteneur Nginx, vous démarrez un processus Nginx maître dans son environnement isolé.

Je vais vous montrer cela pratiquement dans les sections ci-dessous.

Chaque conteneur a son espace utilisateur isolé et vous pouvez exécuter plusieurs conteneurs sur un seul hôte.

Cela signifie-t-il qu'un conteneur contient tout le système d'exploitation ? ?

Non. Contrairement à une machine virtuelle avec son noyau, un conteneur contient les fichiers requis liés à une distribution spécifique et utilise le noyau de l'hôte partagé.

Plus intéressant encore, vous pouvez exécuter différents conteneurs basés sur des distributions Linux sur un seul hôte qui partage le même espace noyau.

Par exemple, vous pouvez exécuter un RHEL, CentOS, un conteneur basé sur SUSE sur un serveur Ubuntu. C'est possible car seul l'espace utilisateur est différent pour toutes les distributions Linux, et l'espace du noyau est le même.

Concept sous-jacent des conteneurs Linux

L'image suivante vous donne une représentation visuelle des conteneurs Linux.

Les conteneurs sont isolés à l'aide des deux fonctionnalités du noyau Linux appelées espaces de noms et groupes de contrôle.

Une analogie du monde réel serait un immeuble d'appartements. Même s'il s'agit d'un seul grand bâtiment, chaque condo / appartement est isolé pour les ménages individuels ayant leur propre identité avec des compteurs d'eau, de gaz et d'électricité. Nous utilisons du béton, des structures en acier et d'autres matériaux de construction pour établir cette isolation. Vous n'avez pas de visibilité sur les autres maisons à moins qu'elles ne vous autorisent à entrer.

De même, vous pouvez associer cela à un seul hôte contenant plusieurs conteneurs. Pour isoler les conteneurs avec leur CPU, mémoire, adresse IP, points de montage, processus, vous avez besoin de deux fonctionnalités du noyau Linux appelés espaces de noms et groupes de contrôle.

Espaces de noms Linux

Un conteneur consiste à disposer d'un environnement bien isolé pour exécuter un service (processus). Pour atteindre ce niveau d'isolation, un conteneur doit avoir son système de fichiers, son adresse IP, ses points de montage, ses ID de processus, etc. Vous pouvez y parvenir en utilisant les espaces de noms Linux.

Les espaces de noms sont responsables des points de montage des conteneurs, de l'utilisateur, de l'adresse IP, de la gestion des processus, etc. Donc, essentiellement, ils définissent les limites des conteneurs.

Voici les espaces de noms clés dans Linux

  1. espace de noms pid :Responsable de l'isolement du processus (PID :Process ID).
  2. espace de noms net :Il gère les interfaces réseau (NET :Networking).
  3. espace de noms ipc :Il gère l'accès aux ressources IPC (IPC :InterProcess Communication).
  4. espace de noms mnt :Responsable de la gestion des points de montage du système de fichiers (MNT :Mount).
  5. espace de noms uts :isole les identifiants du noyau et de la version. (UTS :système de partage de temps Unix).
  6. espace de noms usr : Isole les ID utilisateur. En termes simples, il isole les ID utilisateur entre l'hôte et le conteneur.
  7. Espace de noms Cgroup : Il isole les informations du groupe de contrôle du processus de conteneur

En utilisant les espaces de noms ci-dessus, un conteneur peut avoir ses interfaces réseau, son adresse IP, etc. Chaque conteneur aura son espace de noms et les processus exécutés à l'intérieur de cet espace de noms n'auront aucun privilège en dehors de son espace de noms.

Fait intéressant, vous pouvez lister les espaces de noms dans une machine Linux en utilisant le lsns commande.

Groupes de contrôle Linux

Nous ne spécifions aucune limite de mémoire ou de processeur lors du démarrage d'un service. Au lieu de cela, nous laissons au noyau le soin de hiérarchiser et d'allouer les ressources aux services.

Cependant, vous pouvez explicitement définir des limites de mémoire CPU pour vos services à l'aide d'une fonctionnalité du noyau Linux appelée CGroups . Ce n'est pas une approche simple; vous devez effectuer des configurations et des ajustements supplémentaires pour que cela fonctionne.

Étant donné que vous pouvez exécuter plusieurs conteneurs à l'intérieur d'un hôte, il devrait y avoir un mécanisme pour limiter l'utilisation des ressources, l'accès aux appareils, etc. C'est là que les groupes de contrôle entrent en jeu.

Les groupes de contrôle Linux gèrent les ressources utilisées par un conteneur. Vous pouvez limiter les ressources CPU, mémoire, réseau et E/S d'un groupe de contrôle Linux de conteneur.

Que se passe-t-il si je ne limite pas les ressources CPU et mémoire d'un conteneur ?

Un seul conteneur peut utiliser toutes les ressources de l'hôte, laissant les autres conteneurs se bloquer en raison de l'indisponibilité des ressources.

Des outils comme Docker éliminent toutes les configurations backend complexes et vous permettent de spécifier ces limites de ressources avec des paramètres simples.

Pourquoi les conteneurs sont-ils meilleurs que les VM ?

Les conteneurs présentent certains avantages clés par rapport aux machines virtuelles. Jetons un coup d'œil à ceux-ci.

Utilisation et coût des ressources

  1. Vous pouvez utiliser des VM pour exécuter vos applications indépendamment, ce qui signifie un service par VM. Mais il peut encore être sous-utilisé. Et redimensionner une machine virtuelle n'est pas une tâche facile pour une application de production.
  2. D'un autre côté, les conteneurs peuvent fonctionner avec des exigences minimales en matière de processeur et de mémoire. En outre, vous pouvez même exécuter plusieurs conteneurs dans une machine virtuelle pour la ségrégation des applications. De plus, le redimensionnement d'un conteneur ne prend que quelques secondes.

Provisionnement et déploiement

  1. Le provisionnement d'une VM et le déploiement d'applications sur celle-ci peuvent prendre de quelques minutes à plusieurs heures, selon le flux de travail impliqué. Même la restauration prend du temps.
  2. Mais vous pouvez déployer un conteneur en quelques secondes et le restaurer également en quelques secondes.

Gestion de la dérive

  1. La gestion de la dérive dans les VM n'est pas facile. Vous devez disposer d'une automatisation et de processus complets pour vous assurer que tous les environnements sont similaires. Suivre des modèles de déploiement immuables évite la dérive dans les environnements de VM.
  2. Une fois l'image sauvegardée, elle sera la même dans tous les environnements de conteneurs. Donc, pour toute modification, vous devez commencer à apporter des modifications dans l'environnement de développement et recréer l'image du conteneur.

FAQ Docker

Quelle est la différence entre conteneurd et runc ?

containerd est responsable de la gestion du conteneur et runc est responsable de l'exécution des conteneurs (créer des espaces de noms, des groupes de contrôle et exécuter des commandes à l'intérieur du conteneur) avec les entrées de conteneurd

Quelle est la différence entre le moteur Docker et le démon Docker ?

Le moteur Docker est composé du démon docker, de l'interface de repos et de l'interface de ligne de commande docker. Le démon Docker est le service dockerd systemd responsable de la création des images docker et de l'envoi des instructions docker au runtime containerd.


Docker
  1. Qu'est-ce que NGINX ? Comment ça marche?

  2. Qu'est-ce qu'un serveur Web et comment fonctionne un serveur Web ?

  3. Comment se connecter en SSH à un conteneur Docker

  4. Comment installer Vim dans un conteneur Docker

  5. Qu'est-ce que le DNS et comment ça marche ?

Qu'est-ce que la VDI et comment ça marche ?

Apprendre Docker :comment créer un conteneur Docker

Comment exécuter PHPMyAdmin dans un conteneur Docker

Comment exécuter Grafana dans un conteneur Docker

Comment configurer un conteneur Apache Docker

Comment fonctionne un équilibreur de charge ? Qu'est-ce que l'équilibrage de charge ?