mardi , 23 juillet 2019
Home » Articles » Qu’est-ce que Docker ? Explication sur les conteneurs Docker

Qu’est-ce que Docker ? Explication sur les conteneurs Docker

Docker aide les développeurs à créer des conteneurs logiciels légers et portables qui permettent de simplifier le développement, les tests et le déploiement des applications.

Docker est une plate-forme logicielle qui permet de créer des applications basées sur des conteneurs, des environnements d’exécution petits et légers qui utilisent le noyau du système d’exploitation en partage mais qui, par contre, s’exécutent indépendamment les uns des autres. Bien que le concept des conteneurs existe depuis un certain temps déjà, Docker est un projet open source lancé en 2013.

Il a contribué à populariser la technologie et à stimuler la tendance à la conteneurisation et aux microservices dans le développement de logiciels, désormais connue sous le nom de développement cloud-native.

Quels sont les conteneurs ?

L’un des objectifs du développement logiciel moderne est de garder les applications sur le même hébergeur ou le même cluster. Les applications doivent être isolées les unes des autres afin qu’elles ne nuisent pas indûment à leur fonctionnement ou à leur maintenance. Cela peut être difficile, à cause des packages, des bibliothèques et autres composants logiciels nécessaires à leur exécution.

Toutefois, il existe une solution qui consiste à utiliser des machines virtuelles, qui maintiennent les applications sur le même matériel mais entièrement séparées, et réduisent au minimum les conflits entre les composants logiciels et la concurrence pour les ressources matérielles. Cependant, les machines virtuelles sont encombrantes. Chacune nécessitant son propre système d’exploitation, elle a donc généralement une taille en gigaoctets. Elle est, ainsi,  difficile à maintenir et à mettre à niveau.

Les conteneurs, en revanche, isolent les environnements d’exécution des applications, mais partagent le noyau du système d’exploitation sous-jacent. Ils sont généralement mesurés en Mégaoctets, utilisent beaucoup moins de ressources que les ordinateurs virtuels et démarrent presque immédiatement.

Ils peuvent être emballés de manière beaucoup plus dense sur le même matériel et tournés en masse avec beaucoup moins d’effort et de frais. Les conteneurs constituent un mécanisme extrêmement efficace et extrêmement granulaire permettant de combiner des composants logiciels dans les types d’applications et de piles de services nécessaires dans une entreprise moderne, et de garder ces composants logiciels mis à jour et maintenus.

Voyez comment s’empilent les piles de virtualisation et d’infrastructure de conteneur.

Qu’est-ce que Docker ?

Docker est un projet open source qui facilite la création de conteneurs et d’applications basées sur les conteneurs. Construit à l’origine pour Linux, Docker fonctionne désormais aussi sur Windows et MacOS. Pour comprendre le fonctionnement de Docker, nous allons voir certains des composants que vous utiliseriez pour créer des applications conteneurisées par Docker.

Dockerfile

Chaque conteneur Docker commence par un fichier Docker ou Dockerfile. Ce dernier est un fichier texte écrit dans une syntaxe facile à comprendre. Il contient les instructions pour créer une image Docker. Un fichier Dockerfile spécifie le système d’exploitation sous-jacent au conteneur, ainsi que les langages, les variables d’environnement, les emplacements de fichiers, les ports réseau et les autres composants dont il a besoin – et, bien sûr, ce que le conteneur fera réellement une fois exécuté.

Paige Niedringhaus à ITNext a une bonne répartition de la syntaxe d’un fichier Docker ou Dockerfile.

Docker image

Une fois votre fichier Docker écrit, vous appelez l’utilitaire de constructeur Docker pour créer une image basée sur ce fichier Docker. Le fichier Docker est l’ensemble d’instructions qui demande au constructeur comment créer l’image. De l’autre coté, Docker image est un fichier portable contenant les spécifications pour les composants logiciels pour lesquels le conteneur sera exécuté et comment il sera exécuté.

Puisqu’un fichier Docker contiendra probablement des instructions sur comment récupérer certains logiciels dans des référentiels en ligne, vous devez veiller à spécifier explicitement les versions appropriées ; sans cela, votre fichier Docker pourrait créer des images incohérentes selon le moment où il est appelé. Mais une fois l’image créée, elle est statique. Codefresh offre un aperçu détaillé sur comment créer une image.

Docker run

L’utilitaire d’exécution de Docker (Docker run) est la commande qui lance un conteneur. Chaque conteneur est une instance d’une image. Les conteneurs sont conçus pour être transitoires et temporaires, mais ils peuvent être arrêtés et redémarrés, ce qui lance le conteneur dans le même état que lors de son arrêt.

En outre, plusieurs instances de conteneur de la même image peuvent être exécutées simultanément (à condition que chaque conteneur porte un nom unique). La révision du code présente une grande diversité des différentes options pour la commande d’exécution, afin de vous donner une idée de son fonctionnement.

Docker Hub

Bien que la création de conteneurs soit simple, vous n’imaginez pas que vous aurez besoin de créer chacune de vos images à partir de rien. Docker Hub est un référentiel SaaS pour le partage et la gestion de conteneurs. Vous y trouverez des images officielles de Docker issues de projets open source, des fournisseurs de logiciels et des images non officielles du grand public.

Vous pouvez télécharger des images de conteneur contenant du code utile, ou télécharger vos propres images, les partager au public ou les rendre privées. Vous pouvez également créer un registre Docker local si vous préférez. (Docker Hub a eu des problèmes avec des images téléchargées avec des portes dérobées intégrées.)

Docker Engine

Docker Engine est le cœur de Docker. C’est la technologie client-serveur sous-jacente qui crée et exécute les conteneurs. En général, lorsque quelqu’un dit Docker de manière générique et ne parle pas de la société ou du projet dans son ensemble, ils parlent de Docker Engine. Deux versions différentes de Docker Engine sont proposées : Docker Engine Enterprise et Docker Engine Community.

Docker Community Edition

Docker a publié son édition Entreprise en 2017, mais son offre originale, renommée Docker Community Edition, reste open source et gratuite, sans perdre aucune fonctionnalité. Par contre, Enterprise Edition, qui coûte 1 500 dollars par nœud et par an, a ajouté des fonctionnalités de gestion avancées, notamment des contrôles pour la gestion des grappes et des images, ainsi que la surveillance des vulnérabilités. Le blog BoxBoat présente une synthèse des différences entre les éditions.

Comment Docker a conquis le monde des conteneurs ?

L’idée qu’un processus donné puisse être exécuté avec un certain degré d’isolation par rapport au reste de son environnement d’exploitation est intégrée aux systèmes d’exploitation Unix tels que BSD et Solaris depuis des décennies. La technologie de conteneur Linux d’origine, LXC, est une méthode de virtualisation au niveau du système d’exploitation permettant d’exécuter plusieurs systèmes Linux isolés sur un seul hébergeur.

LXC a été rendu possible par deux fonctionnalités Linux : les espaces de noms, qui réunissent un ensemble de ressources système et les présentent à un processus pour donner l’impression qu’ils sont dédiés à ce processus ; et les groupes de contrôle, qui régissent l’isolation et l’utilisation des ressources système, telles que le processeur et la mémoire, pour un groupe de processus.

Les conteneurs séparent les applications des systèmes d’exploitation, ce qui signifie que les utilisateurs peuvent disposer d’un système d’exploitation Linux propre et minimal, et exécuter tout le reste dans un ou plusieurs conteneurs isolés. De plus, comme le système d’exploitation est extrait des conteneurs, vous pouvez déplacer un conteneur sur n’importe quel serveur Linux prenant en charge l’environnement d’exécution du conteneur.

Docker a introduit plusieurs modifications importantes dans LXC qui rendent les conteneurs plus portables et plus faciles à utiliser. Avec les conteneurs Docker, vous pouvez déployer, répliquer, déplacer et sauvegarder une charge de travail encore plus rapidement et plus facilement qu’avec des machines virtuelles. Docker apporte une flexibilité de type cloud à toute infrastructure capable de gérer des conteneurs.

Les outils d’image de conteneur de Docker constituaient également une avancée par rapport à LXC, permettant aux développeurs de créer des bibliothèques d’images, de composer des applications à partir de plusieurs images et de lancer ces conteneurs et applications sur une infrastructure locale ou distante.

Docker Compose, Docker Swarm et Kubernetes

Docker facilite également la coordination des comportements entre les conteneurs et permet ainsi de créer des piles d’applications en attachant ensemble les conteneurs. Docker Compose a été créé par Docker pour simplifier le processus de développement et de test d’applications multi-conteneurs.

C’est un outil de ligne de commande, rappelant le client Docker, qui intègre un fichier de descripteur spécialement formaté pour assembler des applications à partir de plusieurs conteneurs et les exécuter ensemble sur un seul hébergeur.

Des versions plus avancées de ces comportements (appelée orchestration de conteneur) sont proposées par d’autres produits, tels que Docker Swarm et Kubernetes. Mais, Docker fournit les bases. Bien que Swarm soit né du projet Docker, Kubernetes est devenu la plate-forme d’orchestration de facto de Docker.

Les avantages de Docker

Les conteneurs Docker permettent de créer des applications d’entreprise dans tous les secteurs d’activité. Elles sont plus faciles à assembler, à gérer et à déplacer que leurs homologues classiques.

Les conteneurs Docker permettent l’isolation et la régulation

Les conteneurs Docker maintiennent les applications isolées non seulement les unes des autres, mais également du système sous-jacent. Cela crée non seulement une pile logicielle plus propre, mais permet également de mieux déterminer la manière dont une application conteneurisée donnée utilise les ressources du système (processeur, processeur graphique, mémoire, E/S, réseau, etc.). Cela facilite également la séparation des données et du code.

Les conteneurs Docker permettent la portabilité

Un conteneur Docker s’exécute sur n’importe quel ordinateur prenant en charge l’environnement d’exécution du conteneur. Il n’est pas nécessaire de lier les applications au système d’exploitation de l’hébergeur, à l’environnement d’application et à l’environnement d’exploitation sous-jacent. Elles peuvent être maintenues propres et minimisées.

Par exemple, un conteneur MySQL pour Linux sera exécuté sur la plupart des systèmes Linux prenant en charge les conteneurs. Toutes les dépendances de l’application sont généralement livrées dans le même conteneur.

Les applications basées sur des conteneurs peuvent facilement être déplacées de systèmes sur site vers des environnements cloud ou des ordinateurs portables de développeurs aux serveurs, à condition que le système cible prenne en charge Docker et les outils tiers éventuellement utilisés, tels que Kubernetes.

Normalement, les images de conteneur Docker doivent être créées pour une plate-forme spécifique. Un conteneur Windows, par exemple, ne fonctionnera pas sous Linux et inversement. Auparavant, l’un des moyens de contourner cette limitation consistait à lancer une machine virtuelle qui exécutait une instance du système d’exploitation requis et à exécuter le conteneur dans la machine virtuelle.

Cependant, l’équipe Docker a depuis mis au point une solution plus élégante, appelée manifestes. Ces derniers permettent aux images de plusieurs systèmes d’exploitation d’être regroupées côte à côte dans la même image. Les manifestes sont toujours considérés comme expérimentaux. Mais, ils indiquent comment les conteneurs pourraient devenir une solution applicative multi-plateforme ainsi que multi-environnement.

Les conteneurs Docker permettent la composabilité

La plupart des applications d’entreprise sont constituées de plusieurs composants distincts organisés en une pile : un serveur Web, une base de données et un cache en mémoire. Les conteneurs permettent de composer ces pièces dans une unité fonctionnelle avec des pièces facilement interchangeables. Chaque pièce est fournie par un conteneur différent et peut être maintenue, mise à jour, remplacée et modifiée indépendamment des autres.

Il s’agit essentiellement du modèle de microservices de conception d’applications. En divisant les fonctionnalités des applications en services distincts et autonomes, le modèle microservices constitue un antidote pour ralentir les processus de développement traditionnels et les applications monolithiques inflexibles. Des conteneurs légers et portables facilitent la création et la maintenance d’applications basées sur les microservices.

Les conteneurs Docker facilitent l’orchestration et la mise à l’échelle

Avec des conteneurs légers et un faible coût, il est possible d’en exécuter beaucoup plus sur un système donné. Puis, les conteneurs peuvent également être utilisés pour la mise à l’échelle d’une application sur plusieurs grappes de systèmes et pour augmenter ou réduire les services afin de répondre aux pointes de la demande ou de préserver les ressources.

Les versions les plus professionnelles des outils de déploiement, de gestion et de mise à l’échelle des conteneurs sont fournies par le biais de projets tiers. Parmi eux, il y a Kubernetes de Google. C’est un système qui permet d’automatiser la manière dont les conteneurs sont déployés et mis à l’échelle, mais également la manière dont ils sont connectés, équilibrés et gérés. Kubernetes permet également de créer et de réutiliser les applications multi-conteneurs ou « diagrammes de Helm », de sorte que des piles d’applications complexes puissent être créées et gérées à la demande.

Docker comprend également son propre système d’orchestration intégré, le mode Swarm, qui est toujours utilisé pour les cas moins exigeants. Cela dit, Kubernetes est devenu le choix par défaut. En fait, Kubernetes est fourni avec Docker Enterprise Edition.

Les points faibles de Docker

Les conteneurs résolvent un grand nombre de problèmes, mais ils ne sont pas une panacée. Un de leurs points faibles est le design, alors que d’autres sont des sous-produits de leur design.

Les conteneurs Docker ne sont pas des machines virtuelles

L’erreur conceptuelle la plus courante avec les conteneurs est de les considérer comme des machines virtuelles. Toutefois, les conteneurs et les machines virtuelles utilisant différents mécanismes d’isolation, ils présentent des avantages et des inconvénients nettement différents.

Les machines virtuelles fournissent un degré élevé d’isolation des processus, car elles s’exécutent dans leur propre instance d’un système d’exploitation. Ce dernier ne doit pas nécessairement être le même que celui exécuté sur l’hébergeur. Une machine virtuelle Windows peut fonctionner sur un hyperviseur Linux et inversement.

Par contre, les conteneurs utilisent des parties contrôlées des ressources du système d’exploitation de l’hébergeur. De nombreuses applications partagent le même noyau de système d’exploitation, de manière hautement gérée. Par conséquent, les applications conteneurisées ne sont pas aussi complètement isolées que celles dans les machines virtuelles, mais elles fournissent suffisamment d’isolement pour la grande majorité des charges de travail.

Les conteneurs Docker n’offrent pas une vitesse sans faille

Les conteneurs engendrent moins de frais que les machines virtuelles, mais leur impact sur les performances est toujours mesurable. Si votre charge de travail a besoin d’une vitesse sans faille, un conteneur pourra peut-être vous en fournir presque (beaucoup plus qu’une machine virtuelle), mais vous allez tout de même constater des frais généraux.

Les conteneurs Docker sont sans état et immuables

Les conteneurs démarrent et s’exécutent à partir d’une image décrivant leur contenu. Cette image est immuable par défaut. Une fois créée, elle ne change pas.

Par conséquent, les conteneurs ne sont pas persistants. Si vous démarrez une instance de conteneur, puis la supprimez et redémarrez, la nouvelle instance de conteneur ne comportera aucune des informations d’état associées à l’ancienne.

C’est une autre différence entre les conteneurs et les machines virtuelles. Une machine virtuelle a une persistance entre les sessions par défaut, car elle possède son propre système de fichiers. Avec un conteneur, la seule chose qui persiste est l’image utilisée pour démarrer le logiciel qui s’exécute dans le conteneur ; le seul moyen de la changer consiste à créer une nouvelle image de conteneur révisée.

Du côté positif, l’état des conteneurs rend le contenu des conteneurs plus cohérent et plus facile à composer de manière prévisible en piles d’applications. Cela oblige également les développeurs à séparer les données d’application du code de l’application.

Si vous souhaitez qu’un conteneur ait un type d’état persistant, vous devez le placer ailleurs. Cela peut être une base de données ou un volume de données autonome connecté au conteneur au moment du démarrage.

Les conteneurs Docker ne sont pas des microservices

J’ai déjà parlé de la manière dont les conteneurs se prêtent à créer des applications microservices. Cela ne signifie pas que prendre une application donnée et la coller dans un conteneur créera automatiquement un microservice. Une application de microservices doit être créée en fonction du modèle de design de microservice, qu’elle soit déployée dans des conteneurs ou non. Il est possible de conteneuriser une application dans le cadre du processus de conversion en microservice, mais ce n’est qu’une étape parmi d’autres.

Lorsque les machines virtuelles sont arrivées, elles ont permis de découpler les applications des systèmes sur lesquels elles étaient exécutées. A ce sujet, les conteneurs Docker vont plus loin : non seulement ils sont plus légers, plus portables et plus rapides à tourner que les machines virtuelles, mais ils offrent également des fonctionnalités de mise à l’échelle, de composition et de gestion que les machines virtuelles n’en disposent pas.

À lire aussi

Quels sont les microservices ? Le développement de logiciel léger

Utilisez l’architecture de microservices pour diviser les applications volumineuses en applications légères pouvant être mises …