L’écosystème Docker: un aperçu de la conteneurisation

introduction

Il existe souvent de nombreux obstacles qui empêchent votre application de passer facilement du cycle de développement à la production. Outre le travail de développement de votre application pour répondre de manière appropriée à chaque environnement, vous pouvez également rencontrer des problèmes de suivi des dépendances, de mise à l'échelle de votre application et de mise à jour de composants individuels sans affecter l'ensemble de l'application.

La conteneurisation Docker et la conception orientée services tentent de résoudre nombre de ces problèmes. Les applications peuvent être divisées en composants fonctionnels gérables, conditionnées individuellement avec toutes leurs dépendances et déployées facilement sur une architecture irrégulière. La mise à l'échelle et la mise à jour des composants sont également simplifiées.

Dans ce guide, nous discuterons des avantages de la conteneurisation et de la façon dont Docker aide à résoudre bon nombre des problèmes mentionnés ci-dessus. Docker est le composant principal des déploiements de conteneurs distribués qui permet une évolutivité et une gestion faciles.

Une brève histoire de la conteneurisation de Linux

La conteneurisation et l'isolation ne sont pas des concepts nouveaux dans le monde informatique. Certains systèmes d'exploitation de type Unix s'appuient sur des technologies de conteneurisation éprouvées depuis plus de dix ans.

Sous Linux, LXC, le bloc constitutif à la base des technologies de conteneurisation ultérieures a été ajouté au noyau en 2008. LXC a combiné l'utilisation des groupes de contrôle du noyau (permet d'isoler et de suivre l'utilisation des ressources) et des espaces de noms (permet de séparer les groupes afin qu'ils ne puissent pas se «voir») afin d'implémenter une isolation légère des processus.

Plus tard, Docker a été introduit pour simplifier l’outillage nécessaire à la création et à la gestion des conteneurs. Il utilisait initialement LXC comme pilote d'exécution par défaut (il a depuis développé une bibliothèque appeléelibcontainer à cet effet). Docker, tout en introduisant peu d'idées nouvelles, les a rendues accessibles au développeur et à l'administrateur système en simplifiant le processus et en normalisant l'interface. Cela a suscité un regain d'intérêt pour la conteneurisation dans le monde Linux chez les développeurs.

Bien que certains des sujets abordés dans cet article soient plus généraux, nous nous concentrerons principalement sur la conteneurisation de Docker en raison de son immense popularité et de son adoption standard.

Ce que la conteneurisation apporte à l'image

Les conteneurs offrent de nombreux avantages très intéressants pour les développeurs et les administrateurs système / équipes d’exploitation.

Certains des principaux avantages sont énumérés ci-dessous.

Abstraction du système hôte loin de l'application conteneurisée

Les conteneurs sont destinés à être complètement normalisés. Cela signifie que le conteneur se connecte à l'hôte et à tout élément extérieur au conteneur à l'aide d'interfaces définies. Une application conteneurisée ne doit pas s’appuyer sur des informations concernant les ressources ou l’architecture de l’hôte sous-jacent, ni se préoccuper de ces informations. Cela simplifie les hypothèses de développement relatives à l'environnement d'exploitation. De même, pour l'hôte, chaque conteneur est une boîte noire. Peu importe les détails de l'application à l'intérieur.

Evolutivité facile

L'un des avantages de l'abstraction entre le système hôte et les conteneurs est que, si la conception de l'application est correcte, la mise à l'échelle peut être simple et directe. La conception orientée service (décrite plus loin) associée à des applications conteneurisées fournit les bases d'une évolutivité aisée.

Un développeur peut exécuter quelques conteneurs sur son poste de travail, tandis que ce système peut être mis à l'échelle horizontalement dans une zone de transfert ou de test. Lorsque les conteneurs entrent en production, ils peuvent à nouveau évoluer.

Gestion simple des dépendances et gestion des versions des applications

Les conteneurs permettent à un développeur de regrouper une application ou un composant d'application avec toutes ses dépendances sous forme d'unité. Le système hôte ne doit pas nécessairement se préoccuper des dépendances nécessaires pour exécuter une application spécifique. Tant qu'il peut exécuter Docker, il devrait pouvoir exécuter tous les conteneurs Docker.

Cela facilite la gestion des dépendances et simplifie également la gestion des versions des applications. Les systèmes hôtes et les équipes d'exploitation ne sont plus responsables de la gestion des besoins de dépendance d'une application car, mis à part le recours à des conteneurs associés, ils doivent tous être contenus dans le conteneur lui-même.

Environnements d'exécution isolés extrêmement légers

Bien que les conteneurs n'offrent pas le même niveau d'isolation et de gestion des ressources que les technologies de virtualisation, ils en retirent un environnement d'exécution extrêmement léger. Les conteneurs sont isolés au niveau du processus et partagent le noyau de l’hôte. Cela signifie que le conteneur lui-même n'inclut pas un système d'exploitation complet, ce qui entraîne des temps de démarrage presque instantanés. Les développeurs peuvent facilement exécuter des centaines de conteneurs à partir de leur poste de travail sans problème.

Superposition partagée

Les conteneurs sont légers dans un sens différent en ce sens qu'ils sont engagés dans des «couches». Si plusieurs conteneurs sont basés sur la même couche, ils peuvent partager la couche sous-jacente sans duplication, ce qui réduit considérablement l'utilisation de l'espace disque pour les images ultérieures.

Composabilité et prévisibilité

Les fichiers Docker permettent aux utilisateurs de définir les actions exactes nécessaires pour créer une nouvelle image de conteneur. Cela vous permet d'écrire votre environnement d'exécution comme s'il s'agissait d'un code, en le stockant éventuellement dans le contrôle de version. Le même fichier Docker créé dans le même environnement produira toujours une image de conteneur identique.

Utilisation de Dockerfiles pour des constructions répétables et cohérentes

Bien qu'il soit possible de créer des images de conteneur à l'aide d'un processus interactif, il est souvent préférable de placer les étapes de configuration dans un fichier Dockerfile une fois que les étapes nécessaires sont connues. Les fichiers Dockerfiles sont de simples fichiers de construction qui décrivent comment créer une image de conteneur à partir d'un point de départ connu.

Les Dockerfiles sont incroyablement utiles et assez faciles à maîtriser. Certains des avantages qu'ils fournissent sont:

  • Easy versioning: Les Dockerfiles eux-mêmes peuvent être validés dans le contrôle de version pour suivre les modifications et annuler les erreurs

  • Predicatability: la création d'images à partir d'un Dockerfile permet de supprimer l'erreur humaine du processus de création d'image.

  • Accountability: Si vous prévoyez de partager vos images, il est souvent judicieux de fournir le Dockerfile qui a créé l'image pour permettre aux autres utilisateurs d'auditer le processus. Fondamentalement, il fournit un historique des commandes des étapes réalisées pour créer l'image.

  • Flexibility: la création d'images à partir d'un Dockerfile vous permet de remplacer les valeurs par défaut des builds interactifs. Cela signifie qu'il n'est pas nécessaire de fournir autant d'options d'exécution pour que l'image fonctionne comme prévu.

Dockerfiles est un excellent outil pour automatiser la création d’images de conteneur afin d’établir un processus reproductible.

L'architecture des applications conteneurisées

Lors de la conception d'applications devant être déployées dans des conteneurs, l'un des premiers domaines de préoccupation est l'architecture réelle de l'application. En règle générale, les applications conteneurisées fonctionnent mieux lors de la mise en œuvre d'une conception orientée service.

Les applications orientées services divisent la fonctionnalité d'un système en composants distincts qui communiquent entre eux via des interfaces bien définies. La technologie de conteneur elle-même encourage ce type de conception, car elle permet à chaque composant de s’étendre ou de se mettre à niveau indépendamment.

Les applications mettant en œuvre ce type de conception doivent présenter les qualités suivantes:

  • Ils ne doivent pas s’intéresser aux détails du système hôte ni compter sur ceux-ci.

  • Chaque composant doit fournir des API cohérentes que les consommateurs peuvent utiliser pour accéder au service.

  • Chaque service doit prendre en compte les variables d'environnement lors de la configuration initiale.

  • Les données d'application doivent être stockées à l'extérieur du conteneur sur des volumes montés ou dans des conteneurs de données.

Ces stratégies permettent à chaque composant d'être indépendamment échangé ou mis à niveau tant que l'API est maintenue. Ils se prêtent également à une extensibilité horizontale ciblée car chaque composant peut être mis à l'échelle en fonction du goulot d'étranglement rencontré.

Plutôt que de coder en dur des valeurs spécifiques, chaque composant peut généralement définir des valeurs par défaut raisonnables. Le composant peut les utiliser comme valeurs de secours, mais doit préférer les valeurs qu'il peut rassembler à partir de son environnement. Ceci est souvent réalisé à l'aide d'outils de découverte de service, que le composant peut interroger lors de sa procédure de démarrage.

Supprimer la configuration du conteneur réel et le placer dans l'environnement permet de modifier facilement le comportement de l'application sans reconstruire l'image du conteneur. Cela permet également à un seul paramètre d'influencer plusieurs instances d'un composant. En règle générale, la conception orientée services s’harmonise bien avec les stratégies de configuration environnementale, car elles permettent des déploiements plus flexibles et une mise à l’échelle plus simple.

Utilisation d'un registre Docker pour la gestion des conteneurs

Une fois que votre application est scindée en composants fonctionnels et configurée pour répondre de manière appropriée aux autres conteneurs et indicateurs de configuration de l'environnement, l'étape suivante consiste généralement à rendre vos images de conteneur disponibles via un registre. Le téléchargement d’images de conteneur dans un registre permet aux hôtes Docker d’extraire l’image et de créer des instances de conteneur en connaissant simplement le nom de l’image.

Il existe différents registres Docker disponibles à cet effet. Certains sont des registres publics où tout le monde peut voir et utiliser les images validées, tandis que d'autres sont privés. Les images peuvent être étiquetées de manière à pouvoir facilement les cibler pour des téléchargements ou des mises à jour.

Conclusion

Docker fournit le bloc de construction fondamental nécessaire aux déploiements de conteneurs distribués. En regroupant les composants de l'application dans leurs propres conteneurs, la mise à l'échelle horizontale devient un processus simple consistant à créer ou à arrêter plusieurs instances de chaque composant. Docker fournit les outils nécessaires pour non seulement construire des conteneurs, mais également les gérer et les partager avec de nouveaux utilisateurs ou hôtes.

Bien que les applications conteneurisées fournissent l'isolation et le conditionnement nécessaires au processus pour faciliter le déploiement, de nombreux autres composants sont nécessaires pour gérer et mettre à l'échelle de manière appropriée les conteneurs sur un cluster d'hôtes distribué. Dans nosnext guide, nous discuterons de la manière dont la découverte de services et les magasins de configuration distribués à l'échelle mondiale contribuent aux déploiements de conteneurs en cluster.