Containers 101: principes de base de Docker

Docker a débuté en 2012 en tant que projet open source, initialement nommé dotcloud, pour créer des conteneurs Linux à application unique. Depuis lors, Docker est devenu un outil de développement extrêmement populaire, de plus en plus utilisé comme environnement d'exécution. Peu de technologies, voire aucune, ont convaincu les développeurs aussi rapidement que Docker.

L'une des raisons pour lesquelles Docker est si populaire est qu'il offre la promesse de «développer une fois, exécuter n'importe où». Docker offre un moyen simple de regrouper une application et ses dépendances d'exécution dans un seul conteneur; il fournit également une abstraction d'exécution qui permet au conteneur de s'exécuter sur différentes versions du noyau Linux.

À l'aide de Docker, un développeur peut créer une application conteneurisée sur son poste de travail, puis déployer facilement le conteneur sur n'importe quel serveur compatible Docker. Il n'est pas nécessaire de retester ou de réajuster le conteneur pour l'environnement serveur, que ce soit dans le cloud ou sur site.

En outre, Docker fournit un mécanisme de partage et de distribution de logiciels qui permet aux développeurs et aux équipes opérationnelles de partager et de réutiliser facilement le contenu des conteneurs. Ce mécanisme de distribution, associé à la portabilité entre les machines, permet de rendre compte de la popularité de Docker auprès des équipes opérationnelles et des développeurs.  

Composants Docker

Docker est à la fois un outil de développement et un environnement d'exécution. Pour comprendre Docker, nous devons d'abord comprendre le concept d'une image de conteneur Docker. Un conteneur commence toujours par une image et est considéré comme une instanciation de cette image. Une image est une spécification statique de ce que le conteneur doit être au moment de l'exécution, y compris le code d'application à l'intérieur du conteneur et les paramètres de configuration d'exécution. Les images Docker contiennent des couches en lecture seule, ce qui signifie qu'une fois qu'une image est créée, elle n'est jamais modifiée.

La figure 1 montre un exemple d'image de conteneur. Cette image représente une image Ubuntu avec une installation Apache. L'image est une composition de trois couches Ubuntu de base plus une couche de mise à jour, avec une couche Apache et une couche de fichier personnalisée sur le dessus.

Un conteneur Docker en cours d'exécution est une instanciation d'une image. Les conteneurs dérivés de la même image sont identiques les uns aux autres en termes de code d'application et de dépendances d'exécution. Mais contrairement aux images, qui sont en lecture seule, les conteneurs en cours d'exécution incluent une couche inscriptible (la couche conteneur) au-dessus du contenu en lecture seule. Les modifications d'exécution, y compris les écritures et les mises à jour des données et des fichiers, sont enregistrées dans la couche de conteneur. Ainsi, plusieurs conteneurs en cours d'exécution simultanés qui partagent la même image sous-jacente peuvent avoir des couches de conteneur qui diffèrent sensiblement.

Lorsqu'un conteneur en cours d'exécution est supprimé, la couche de conteneur inscriptible est également supprimée et ne persistera pas. La seule façon de conserver les modifications consiste à exécuter une docker commitcommande explicite avant de supprimer le conteneur. Lorsque vous effectuez une docker commit, le contenu du conteneur en cours d'exécution, y compris la couche inscriptible, est écrit dans une nouvelle image de conteneur et stocké sur le disque. Cela devient une nouvelle image distincte de l'image par laquelle le conteneur a été instancié.

En utilisant cette docker commitcommande explicite , on peut créer un ensemble successif et discret d'images Docker, chacune construite au-dessus de l'image précédente. De plus, Docker utilise une stratégie de copie sur écriture pour minimiser l'empreinte de stockage des conteneurs et des images qui partagent les mêmes composants de base. Cela permet d'optimiser l'espace de stockage et de minimiser l'heure de démarrage du conteneur.

La figure 2 illustre la différence entre une image et un conteneur en cours d'exécution. Notez que chaque conteneur en cours d'exécution peut avoir une couche inscriptible différente.

Au-delà du concept d'image, Docker possède quelques composants spécifiques qui sont différents de ceux des conteneurs Linux traditionnels.

  • Démon Docker. Également connu sous le nom de moteur Docker, le démon Docker est une fine couche entre les conteneurs et le noyau Linux. Le démon Docker est l'environnement d'exécution persistant qui gère les conteneurs d'applications. Tout conteneur Docker peut s'exécuter sur n'importe quel serveur sur lequel Docker-daemon est activé, quel que soit le système d'exploitation sous-jacent.
  • Dockerfile. Les développeurs utilisent Dockerfiles pour créer des images de conteneurs, qui deviennent ensuite la base de l'exécution de conteneurs. Un Dockerfile est un document texte qui contient toutes les informations de configuration et les commandes nécessaires pour assembler une image de conteneur. Avec un Dockerfile, le démon Docker peut créer automatiquement une image de conteneur. Ce processus simplifie considérablement les étapes de création de conteneurs.

Plus spécifiquement, dans un Dockerfile, vous spécifiez d'abord une image de base à partir de laquelle le processus de construction démarre. Vous spécifiez ensuite une succession de commandes, après quoi une nouvelle image de conteneur peut être créée.

  • Outils d'interface de ligne de commande Docker. Docker fournit un ensemble de commandes CLI pour gérer le cycle de vie des conteneurs basés sur des images. Les commandes Docker couvrent les fonctions de développement telles que la construction, l'exportation et le balisage, ainsi que les fonctions d'exécution telles que l'exécution, la suppression, le démarrage et l'arrêt d'un conteneur, etc.

Vous pouvez exécuter des commandes Docker sur un démon Docker ou un registre particulier. Par exemple, si vous exécutez la docker -pscommande, Docker renverra une liste de conteneurs exécutés sur le démon.

Distribution de contenu avec Docker

En plus de l'environnement d'exécution et des formats de conteneur, Docker fournit un mécanisme de distribution de logiciels, communément appelé registre, qui facilite la découverte et la distribution de contenu de conteneur.

Le concept de registre est essentiel au succès de Docker, car il fournit un ensemble d'utilitaires pour emballer, expédier, stocker, découvrir et réutiliser le contenu des conteneurs. Docker, la société gère un registre public et gratuit appelé Docker Hub.

  • Enregistrement. Un registre Docker est un endroit où les images de conteneurs sont publiées et stockées. Un registre peut être distant ou sur site. Il peut être public, donc tout le monde peut l'utiliser, ou privé, limité à une organisation ou à un ensemble d'utilisateurs. Un registre Docker est fourni avec un ensemble d'API communes qui permettent aux utilisateurs de créer, publier, rechercher, télécharger et gérer des images de conteneurs.
  • Docker Hub. Docker Hub est un registre de conteneurs public basé sur le cloud géré par Docker. Docker Hub fournit la découverte d'images, la distribution et la prise en charge des flux de travail de collaboration. De plus, Docker Hub dispose d'un ensemble d'images officielles certifiées par Docker. Il s'agit d'images d'éditeurs de logiciels connus tels que Canonical, Red Hat et MongoDB. Vous pouvez utiliser ces images officielles comme base pour créer vos propres images ou applications.

La figure 3 illustre un flux de travail dans lequel un utilisateur construit une image et la télécharge dans le registre. Les autres utilisateurs peuvent extraire l'image du registre pour créer des conteneurs de production et les déployer sur des hôtes Docker, où qu'ils se trouvent.

L'immuabilité des conteneurs Docker

L'une des propriétés les plus intéressantes des conteneurs Docker est leur immuabilité et l'apatridie des conteneurs qui en résulte.

Comme nous l'avons décrit dans la section précédente, une image Docker, une fois créée, ne change pas. Un conteneur en cours d'exécution dérivé de l'image possède une couche inscriptible qui peut stocker temporairement les modifications d'exécution. Si le conteneur est validé avant la suppression avec docker commit, les modifications du calque inscriptible seront enregistrées dans une nouvelle image distincte de la précédente.

Pourquoi l'immuabilité est-elle bonne? Des images et des conteneurs immuables conduisent à une infrastructure immuable, et une infrastructure immuable présente de nombreux avantages intéressants qui ne sont pas réalisables avec les systèmes traditionnels. Ces avantages comprennent les suivants:

  • Contrôle de version. En exigeant des validations explicites qui génèrent de nouvelles images, Docker vous oblige à effectuer un contrôle de version. Vous pouvez suivre les versions successives d'une image; revenir à une image précédente (donc à un composant système précédent) est tout à fait possible, car les images précédentes sont conservées et jamais modifiées.
  • Mises à jour plus propres et changements d'état plus faciles à gérer. Avec une infrastructure immuable, vous n'avez plus besoin de mettre à niveau votre infrastructure de serveur, ce qui signifie qu'il n'est pas nécessaire de modifier les fichiers de configuration, pas de mises à jour logicielles, pas de mises à niveau du système d'exploitation, etc. Lorsque des modifications sont nécessaires, il vous suffit de créer de nouveaux conteneurs et de les pousser pour remplacer les anciens. Il s'agit d'une méthode beaucoup plus discrète et gérable pour le changement d'état.
  • Dérive minimisée. Pour éviter toute dérive, vous pouvez actualiser périodiquement et de manière proactive tous les composants de votre système pour vous assurer qu'il s'agit des dernières versions. Cette pratique est beaucoup plus facile avec des conteneurs qui encapsulent des composants plus petits du système qu'avec des logiciels traditionnels et encombrants.

La différence Docker

Le format d'image de Docker, les API étendues pour la gestion des conteneurs et le mécanisme de distribution de logiciels innovant en ont fait une plate-forme populaire pour les équipes de développement et d'exploitation. Docker apporte ces avantages notables à une organisation.

  • Systèmes déclaratifs minimaux. Les conteneurs Docker sont à leur meilleur s'ils sont de petites applications à usage unique. Cela donne lieu à des conteneurs de taille minimale, qui à leur tour prennent en charge une livraison rapide, une intégration continue et un déploiement continu.
  • Opérations prévisibles. Le plus gros casse-tête des opérations système a toujours été le comportement apparemment aléatoire de l'infrastructure ou des applications. En vous obligeant à effectuer des mises à jour plus petites et plus faciles à gérer et en fournissant un mécanisme pour minimiser la dérive du système, Docker vous aide à créer des systèmes plus prévisibles. Lorsque les dérives sont éliminées, vous avez l'assurance que le logiciel se comportera toujours de la même manière, quel que soit le nombre de fois que vous le déployez.
  • Réutilisation étendue de logiciels. Les conteneurs Docker réutilisent les couches d'autres images, ce qui favorise naturellement la réutilisation des logiciels. Le partage d'images Docker via des registres est un autre excellent exemple de réutilisation de composants à grande échelle.
  • Véritable portabilité multicloud. Docker permet une véritable indépendance de la plate-forme, en permettant aux conteneurs de migrer librement entre différentes plates-formes cloud, infrastructures sur site et postes de travail de développement.

Docker est déjà en train de changer la façon dont les organisations créent des systèmes et fournissent des services. Cela commence à remodeler notre façon de penser la conception de logiciels et l'économie de la livraison de logiciels. Avant que ces changements ne prennent véritablement racine, les organisations doivent mieux comprendre comment gérer la sécurité et les politiques de l'environnement Docker. Mais c'est un sujet pour un autre article.

Chenxi Wang est directeur de la stratégie de la société de sécurité des conteneurs Twistlock.

Le New Tech Forum offre un lieu pour explorer et discuter des technologies d'entreprise émergentes avec une profondeur et une ampleur sans précédent. La sélection est subjective, basée sur notre choix des technologies que nous pensons importantes et qui intéressent le plus les lecteurs. n'accepte pas les supports marketing pour la publication et se réserve le droit de modifier tout le contenu fourni. Envoyez toutes vos demandes à [email protected]