Qu'est-ce que Docker? L'étincelle de la révolution des conteneurs

Docker est une plate-forme logicielle permettant de créer des applications basées sur des conteneurs - des environnements d'exécution petits et légers qui utilisent en commun le noyau du système d'exploitation, mais s'exécutent par ailleurs indépendamment les uns des autres. Alors que les conteneurs en tant que concept existent depuis un certain temps, Docker, un projet open source lancé en 2013, a contribué à vulgariser la technologie et a contribué à stimuler la tendance à la conteneurisation et aux microservices  dans le développement de logiciels qui est devenu connu sous le nom de cloud-native développement.

Que sont les conteneurs?

L'un des objectifs du développement logiciel moderne est de garder les applications sur le même hôte ou cluster isolées les unes des autres afin qu'elles n'interfèrent pas indûment avec le fonctionnement ou la maintenance de l'autre. Cela peut être difficile, grâce aux packages, bibliothèques et autres composants logiciels nécessaires à leur exécution. Une solution à ce problème a été les machines virtuelles, qui maintiennent les applications sur le même matériel entièrement séparées et réduisent au minimum les conflits entre les composants logiciels et la concurrence pour les ressources matérielles. Mais les machines virtuelles sont volumineuses - chacune nécessite son propre système d'exploitation, donc généralement des gigaoctets - et difficiles à maintenir et à mettre à niveau.

Les conteneurs , en revanche, isolent les environnements d'exécution des applications les uns des autres, 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 machines virtuelles et démarrent presque immédiatement. Ils peuvent être emballés beaucoup plus densément sur le même matériel et tournés de haut en bas en masse avec beaucoup moins d'efforts et de frais généraux. Les conteneurs fournissent un mécanisme hautement efficace et très granulaire pour combiner des composants logiciels dans les types de piles d'applications et de services nécessaires dans une entreprise moderne, et pour maintenir ces composants logiciels à jour et maintenus.

Docker

Qu'est-ce que Docker?

Docker est un projet open source qui facilite la création de conteneurs et d'applications basées sur des conteneurs. Initialement conçu pour Linux, Docker fonctionne désormais également sur Windows et MacOS. Pour comprendre le fonctionnement de Docker, examinons certains des composants que vous utiliseriez pour créer des applications conteneurisées Docker.

Dockerfile

Chaque conteneur Docker commence par un Dockerfile . Un Dockerfile est un fichier texte écrit dans une syntaxe facile à comprendre qui comprend les instructions pour créer une image Docker (plus à ce sujet dans un instant). Un Dockerfile spécifie le système d'exploitation qui sous-tendra le conteneur, ainsi que les langages, les variables d'environnement, les emplacements des 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 que nous l'exécuterons.

Paige Niedringhaus chez ITNext a une bonne ventilation de la syntaxe d'un Dockerfile.

Image Docker

Une fois votre Dockerfile écrit, vous appelez l' buildutilitaire Docker pour créer une image basée sur ce Dockerfile. Alors que le Dockerfile est l'ensemble des instructions qui indiquent buildcomment créer l'image, une image Docker est un fichier portable contenant les spécifications pour les composants logiciels que le conteneur va exécuter et comment. Étant donné qu'un fichier Dockerfile inclura probablement des instructions sur la récupération de certains packages logiciels à partir de référentiels en ligne, vous devez prendre soin de spécifier explicitement les versions appropriées, sinon votre Dockerfile peut produire des images incohérentes en fonction du moment où il est appelé. Mais une fois qu'une image est créée, elle est statique. Codefresh offre un aperçu de la façon de créer une image plus en détail.

Course de Docker

L' runutilitaire Docker est la commande qui lance réellement 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 ait un nom unique). La révision du code présente une bonne répartition des différentes options de la runcommande, pour vous donner une idée de son fonctionnement.

Docker Hub

Bien que la création de conteneurs soit facile, ne pensez pas que vous aurez besoin de créer chacune de vos images à partir de zéro. Docker Hub est un référentiel SaaS pour le partage et la gestion de conteneurs, où vous trouverez des images Docker officielles de projets open source et de fournisseurs de logiciels et des images non officielles du grand public. Vous pouvez télécharger des images de conteneurs contenant du code utile, ou télécharger les vôtres, les partager ouvertement ou les rendre privées à la place. Vous pouvez également créer un registre Docker local si vous préférez. (Docker Hub a rencontré des problèmes dans le passé avec des images téléchargées avec des portes dérobées intégrées.)

Moteur Docker

Docker Engine est le cœur de Docker, la technologie client-serveur sous-jacente qui crée et exécute les conteneurs. De manière générale, lorsque quelqu'un dit Docker de manière générique et ne parle pas de l'entreprise ou du projet global, il parle de Docker Engine. Il existe deux versions différentes de Docker Engine: Docker Engine Enterprise et Docker Engine Community.

Édition communautaire Docker

Docker a sorti son édition Enterprise en 2017, mais son offre d'origine, renommée Docker Community Edition, reste open source et gratuite, et n'a perdu aucune fonctionnalité dans le processus. Au lieu de cela, Enterprise Edition, qui coûte 1 500 USD par nœud et par an, a ajouté des fonctionnalités de gestion avancées, notamment des contrôles pour la gestion des clusters et des images, et la surveillance des vulnérabilités. Le blog BoxBoat présente un aperçu des différences entre les éditions.

Comment Docker a conquis le monde des conteneurs

L'idée qu'un processus donné peut être exécuté avec un certain degré d'isolement du reste de son environnement d'exploitation a été intégrée dans les systèmes d'exploitation Unix tels que BSD et Solaris pendant des décennies. La technologie de conteneur Linux d'origine, LXC, est une méthode de virtualisation au niveau du système d'exploitation pour exécuter plusieurs systèmes Linux isolés sur un seul hôte. LXC a été rendu possible par deux fonctionnalités Linux: les espaces de noms, qui enveloppent 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 dissocient les applications des systèmes d'exploitation, ce qui signifie que les utilisateurs peuvent avoir un système d'exploitation Linux propre et minimal et exécuter tout le reste dans un ou plusieurs conteneurs isolés. Et 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 changements importants dans LXC qui rendent les conteneurs plus portables et plus flexibles à utiliser. À l'aide de conteneurs Docker, vous pouvez déployer, répliquer, déplacer et sauvegarder une charge de travail encore plus rapidement et facilement que vous ne pouvez le faire à l'aide de machines virtuelles. Docker apporte une flexibilité de type cloud à toute infrastructure capable d'exécuter des conteneurs. Les outils d'image de conteneur de Docker constituaient également une avancée par rapport à LXC, permettant à un développeur 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 les conteneurs entre eux. 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 prend un fichier descripteur spécialement formaté pour assembler des applications à partir de plusieurs conteneurs et les exécuter de concert sur un seul hôte. (Consultez le didacticiel Docker Compose pour en savoir plus.)

Des versions plus avancées de ces comportements, ce que l'on appelle l' orchestration de conteneurs, sont proposées par d'autres produits, tels que Docker Swarm et Kubernetes. Mais Docker fournit les bases. Même si Swarm est né du projet Docker, Kubernetes est devenu de facto la plate-forme d'orchestration Docker de choix.

Avantages Docker

Les conteneurs Docker offrent un moyen de créer des applications d'entreprise et de secteur d'activité plus faciles à assembler, à entretenir et à déplacer que leurs homologues conventionnels. 

Les conteneurs Docker permettent l'isolation et la limitation

Les conteneurs Docker gardent les applications isolées non seulement les unes des autres, mais également du système sous-jacent. Cela permet non seulement une pile logicielle plus propre, mais facilite également la détermination de la manière dont une application conteneurisée donnée utilise les ressources système: CPU, GPU, mémoire, E / S, réseau, etc. Cela permet également de garantir plus facilement que les données et le code sont séparés. (Voir «Les conteneurs Docker sont sans état et immuables» ci-dessous.)

Les conteneurs Docker permettent la portabilité

Un conteneur Docker s'exécute sur n'importe quelle machine prenant en charge l'environnement d'exécution du conteneur. Les applications n'ont pas besoin d'être liées au système d'exploitation hôte, de sorte que l'environnement d'application et l'environnement d'exploitation sous-jacent peuvent être maintenus propres et minimaux.

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

Les applications basées sur des conteneurs peuvent être facilement déplacées des systèmes sur site vers les environnements cloud ou des ordinateurs portables des développeurs vers les serveurs, à condition que le système cible prenne en charge Docker et l'un des outils tiers qui pourraient être utilisés avec lui, tels que Kubernetes (voir «Les conteneurs Docker facilitent l'orchestration et la mise à l'échelle» ci-dessous).

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 vice versa. Auparavant, une façon 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 conçu une solution plus élégante, appelée  manifestes , qui permet 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 suggèrent comment les conteneurs pourraient devenir une solution d'application multiplateforme ainsi qu'une solution multi-environnement. 

Les conteneurs Docker permettent la composabilité

La plupart des applications métier se composent de plusieurs composants séparés organisés en pile: un serveur Web, une base de données, un cache en mémoire. Les conteneurs permettent de composer ces pièces en 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, échangé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 séparés et autonomes, le modèle de microservices offre un antidote pour ralentir les processus de développement traditionnels et les applications monolithiques inflexibles. Les conteneurs légers et portables facilitent la création et la maintenance des applications basées sur des microservices.

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

Parce que les conteneurs sont légers et imposent peu de frais généraux, il est possible d'en lancer beaucoup plus sur un système donné. Mais les conteneurs peuvent également être utilisés pour faire évoluer une application sur des clusters de systèmes et pour augmenter ou diminuer les services pour répondre aux pics de demande ou pour conserver 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. Le principal d'entre eux est Kubernetes de Google, un système permettant d'automatiser la façon dont les conteneurs sont déployés et mis à l'échelle, mais aussi comment ils sont connectés, équilibrés et gérés. Kubernetes fournit également des moyens de créer et de réutiliser des définitions d'applications multi-conteneurs ou des «graphiques Helm», afin 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 un choix par défaut; en fait, Kubernetes est fourni avec Docker Enterprise Edition.

Mises en garde Docker

Les conteneurs résolvent un grand nombre de problèmes, mais ils ne sont pas une panacée. Certains de leurs défauts sont de conception, tandis que d'autres sont des sous-produits de leur conception.

Les conteneurs Docker ne sont pas des machines virtuelles

L'erreur conceptuelle la plus courante que les gens commettent avec les conteneurs est de les assimiler à des machines virtuelles. Cependant, comme les conteneurs et les machines virtuelles utilisent des mécanismes d'isolation différents, ils présentent des avantages et des inconvénients nettement différents.

Les machines virtuelles offrent un degré élevé d'isolation pour les processus, car elles s'exécutent dans leur propre instance d'un système d'exploitation. Ce système d'exploitation ne doit pas non plus être le même que celui exécuté sur l'hôte. Une machine virtuelle Windows peut s'exécuter sur un hyperviseur Linux et vice versa.

Les conteneurs, en revanche, utilisent des parties contrôlées des ressources du système d'exploitation hôte; de nombreuses applications partagent le même noyau OS, de manière hautement gérée. Par conséquent, les applications conteneurisées ne sont pas aussi complètement isolées que les machines virtuelles, mais elles fournissent une isolation suffisante pour la grande majorité des charges de travail.

Les conteneurs Docker ne fournissent pas de vitesse sans système d'exploitation