Comprendre Docker

J'utilise Docker depuis plusieurs mois maintenant pour structurer le processus de développement/livraison de projets web. Je propose aux lecteurs de Habrakhabr une traduction de l'article d'introduction sur Docker - "Comprendre Docker".

Qu’est-ce que Docker ?

Docker est une plateforme ouverte pour développer, fournir et exploiter des applications. Docker est conçu pour fournir vos applications plus rapidement. Avec Docker, vous pouvez découpler votre application de votre infrastructure et traiter l'infrastructure comme une application gérée. Docker vous aide à expédier votre code plus rapidement, à tester plus rapidement, à expédier vos applications plus rapidement et à réduire le temps entre l'écriture du code et son exécution. Docker le fait via une plate-forme légère de virtualisation de conteneurs, en utilisant des processus et des utilitaires qui vous aident à gérer et à fournir vos applications.

À la base, Docker vous permet d’exécuter presque toutes les applications, isolées en toute sécurité dans un conteneur. L'isolation sécurisée vous permet d'exécuter plusieurs conteneurs sur le même hôte en même temps. La nature légère du conteneur, qui fonctionne sans la charge supplémentaire d'un hyperviseur, vous permet de tirer le meilleur parti de votre matériel.

La plateforme et les outils de virtualisation de conteneurs peuvent être utiles dans les cas suivants :

  • conditionner votre application (et les composants que vous utilisez) dans des conteneurs Docker ;
  • distribution et livraison de ces conteneurs à vos équipes pour développement et tests ;
  • disposer ces conteneurs sur vos sites de production, aussi bien dans les datacenters que dans les cloud.

À quoi puis-je utiliser Docker ?

Publiez rapidement vos candidatures

Docker est idéal pour organiser le cycle de développement. Docker permet aux développeurs d'exécuter des conteneurs locaux avec des applications et des services. Ce qui vous permet par la suite de vous intégrer au processus d’intégration continue et au workflow de déploiement.

Par exemple, vos développeurs écrivent du code localement et partagent leur pile de développement (un ensemble d'images Docker) avec des collègues. Lorsqu'ils sont prêts, ils envoient le code et les conteneurs vers le site de test et exécutent tous les tests nécessaires. Depuis le site de test, ils peuvent envoyer du code et des images en production.

Mise en place et dépliage plus faciles

La plate-forme basée sur des conteneurs Docker facilite le portage de votre charge utile. Les conteneurs Docker peuvent s'exécuter sur votre machine locale, réelle ou virtuelle dans un centre de données, ou dans le cloud.

La portabilité et la légèreté de Docker facilitent la gestion dynamique de votre charge de travail. Vous pouvez utiliser Docker pour déployer ou arrêter votre application ou vos services. La vitesse de Docker permet de le faire en temps quasi réel.

Des charges plus élevées et plus de charges utiles

Docker est léger et rapide. Il constitue une alternative résiliente et rentable aux machines virtuelles basées sur un hyperviseur. Il est particulièrement utile dans les environnements à forte charge, par exemple lors de la création de votre propre cloud ou plateforme en tant que service. Mais il est également utile pour les applications de petite et moyenne taille lorsque vous souhaitez tirer le meilleur parti des ressources dont vous disposez.

Principaux composants Docker

Docker se compose de deux composants principaux :

  • Docker : une plateforme de virtualisation open source ;
  • Docker Hub : notre plateforme en tant que service pour la distribution et la gestion des conteneurs Docker.

Note! Docker est distribué sous la licence Apache 2.0.

Architecture Docker

Docker utilise une architecture client-serveur. Le client Docker communique avec le démon Docker, qui se charge de créer, d'exécuter et de distribuer vos conteneurs. Le client et le serveur peuvent fonctionner sur le même système, vous pouvez connecter le client à un démon Docker distant. Le client et le serveur communiquent via un socket ou une API RESTful.

Comprendre Docker

Démon Docker

Comme le montre le diagramme, le démon s'exécute sur la machine hôte. L'utilisateur n'interagit pas directement avec le serveur, mais utilise pour cela le client.

Client Docker

Le client Docker, le programme Docker, est l'interface principale de Docker. Il reçoit les commandes de l'utilisateur et interagit avec le démon Docker.

Docker intérieur

Pour comprendre en quoi consiste Docker, vous devez connaître trois composants :

  • images
  • enregistrement
  • conteneurs

Des images

L'image Docker est un modèle en lecture seule. Par exemple, l'image peut contenir le système d'exploitation Ubuntu avec Apache et une application dessus. Les images sont utilisées pour créer des conteneurs. Docker facilite la création de nouvelles images, la mise à jour d'images existantes ou la possibilité de télécharger des images créées par d'autres personnes. Les images sont des composants d’une version Docker.

Enregistrer

Le registre Docker stocke les images. Il existe des registres publics et privés à partir desquels vous pouvez télécharger ou télécharger des images. Un registre Docker public est Docker Hub. Une énorme collection d’images y est stockée. Comme vous le savez, vous pouvez créer des images ou utiliser des images créées par d’autres. Les registres sont un composant de distribution.

Containers

Les conteneurs sont similaires aux répertoires. Les conteneurs contiennent tout ce dont l'application a besoin pour s'exécuter. Chaque conteneur est créé à partir d'une image. Les conteneurs peuvent être créés, démarrés, arrêtés, migrés ou supprimés. Chaque conteneur est isolé et fournit une plateforme sécurisée pour l'application. Les conteneurs sont des éléments de l'œuvre.

Alors, comment fonctionne Docker ?

Jusqu'à présent, nous savons que :

  • nous pouvons créer des images dans lesquelles se trouvent nos applications ;
  • nous pouvons créer des conteneurs à partir d'images pour exécuter des applications ;
  • Nous pouvons distribuer des images via Docker Hub ou un autre registre d'images.

Voyons comment ces composants s'emboîtent.

Comment fonctionne l'image ?

Nous savons déjà qu'une image est un modèle en lecture seule à partir duquel un conteneur est créé. Chaque image se compose d'un ensemble de niveaux. Docker utilise système de fichiers d'union pour combiner ces niveaux en une seule image. Le système de fichiers Union permet aux fichiers et répertoires de différents systèmes de fichiers (différentes branches) de se chevaucher de manière transparente, créant ainsi un système de fichiers cohérent.

L'une des raisons pour lesquelles Docker est léger est qu'il utilise des couches comme celle-ci. Lorsque vous modifiez l'image, par exemple lors de la mise à jour d'une application, un nouveau calque est créé. Ainsi, sans remplacer l’intégralité de l’image ni la reconstruire, comme vous pourriez avoir à le faire avec une machine virtuelle, seule la couche est ajoutée ou mise à jour. Et vous n'êtes pas obligé de distribuer l'intégralité de la nouvelle image, seule la mise à jour est distribuée, ce qui rend la distribution des images plus facile et plus rapide.

Au cœur de chaque image se trouve une image de base. Par exemple, Ubuntu, l'image de base d'Ubuntu, ou Fedora, l'image de base de la distribution Fedora. Vous pouvez également utiliser des images comme base pour créer de nouvelles images. Par exemple, si vous disposez d'une image Apache, vous pouvez l'utiliser comme image de base pour vos applications Web.

Note! Docker extrait généralement les images du registre Docker Hub.

Des images Docker peuvent être créées à partir de ces images de base ; nous appelons les étapes de création de ces images instructions. Chaque instruction crée une nouvelle image ou un nouveau niveau. Les instructions seront les suivantes :

  • exécuter la commande
  • ajouter un fichier ou un répertoire
  • créer une variable d'environnement
  • instructions sur ce qu'il faut exécuter lorsque le conteneur de cette image est lancé

Ces instructions sont stockées dans un fichier Dockerfile. Docker lit ceci Dockerfile, lorsque vous créez l'image, exécute ces instructions et renvoie l'image finale.

Comment fonctionne le registre Docker ?

Le registre est un référentiel pour les images Docker. Une fois l'image créée, vous pouvez la publier dans le registre public Docker Hub ou dans votre registre personnel.

Avec le client Docker, vous pouvez rechercher des images déjà publiées et les télécharger sur votre machine Docker pour créer des conteneurs.

Docker Hub fournit des référentiels d'images publics et privés. La recherche et le téléchargement d'images à partir de référentiels publics sont accessibles à tous. Le contenu des stockages privés n'est pas inclus dans les résultats de la recherche. Et seuls vous et vos utilisateurs pouvez recevoir ces images et créer des conteneurs à partir d'elles.

Comment fonctionne un conteneur ?

Un conteneur se compose d'un système d'exploitation, de fichiers utilisateur et de métadonnées. Comme nous le savons, chaque conteneur est créé à partir d'une image. Cette image indique à Docker ce qu'il y a dans le conteneur, quel processus démarrer, quand le conteneur démarre et d'autres données de configuration. L'image Docker est en lecture seule. Lorsque Docker démarre un conteneur, il crée une couche de lecture/écriture au-dessus de l'image (en utilisant le système de fichiers Union comme indiqué précédemment) dans laquelle l'application peut être exécutée.

Que se passe-t-il lorsque le conteneur démarre ?

Ou en utilisant le programme docker, ou à l'aide de l'API RESTful, le client Docker demande au démon Docker de démarrer le conteneur.

$ sudo docker run -i -t ubuntu /bin/bash

Jetons un coup d'œil à cette commande. Le client est lancé à l'aide de la commande docker, avec option run, qui indique qu'un nouveau conteneur sera lancé. Les exigences minimales pour exécuter un conteneur sont les attributs suivants :

  • quelle image utiliser pour créer le conteneur. Dans notre cas ubuntu
  • la commande que vous souhaitez exécuter au démarrage du conteneur. Dans notre cas /bin/bash

Que se passe-t-il sous le capot lorsque nous exécutons cette commande ?

Docker, dans l'ordre, effectue les opérations suivantes :

  • télécharge l'image Ubuntu : Docker vérifie la disponibilité des images ubuntu sur la machine locale, et s'il n'y est pas, téléchargez-le depuis Docker Hub. S'il existe une image, il l'utilise pour créer un conteneur ;
  • crée un conteneur : lorsque l'image est reçue, docker l'utilise pour créer un conteneur ;
  • initialise le système de fichiers et monte le niveau en lecture seule : le conteneur est créé dans le système de fichiers et l'image est ajoutée au niveau lecture seule ;
  • initialise le réseau/pont : crée une interface réseau qui permet à Docker de communiquer avec la machine hôte ;
  • Définition de l'adresse IP : trouve et définit l'adresse ;
  • Démarre le processus spécifié : lance votre application ;
  • Traite et produit le résultat de votre application : connecte et enregistre les entrées, sorties et flux d'erreurs standard de votre application afin que vous puissiez suivre les performances de votre application.

Vous disposez maintenant d'un conteneur fonctionnel. Vous pouvez gérer votre conteneur, interagir avec votre application. Lorsque vous décidez d'arrêter l'application, supprimez le conteneur.

Technologies utilisées

Docker est écrit en Go et utilise certaines fonctionnalités du noyau Linux pour implémenter les fonctionnalités ci-dessus.

Espaces de noms

Docker utilise la technologie namespaces pour organiser des espaces de travail isolés, que nous appelons des conteneurs. Lorsque nous démarrons un conteneur, Docker crée un ensemble d'espaces de noms pour ce conteneur.

Cela crée une couche isolée, chaque aspect du conteneur s'exécutant dans son propre espace de noms et n'ayant pas accès au système externe.

Liste de certains espaces de noms utilisés par Docker :

  • pid : isoler le processus ;
  • net: pour gérer les interfaces réseau ;
  • CIP : pour gérer les ressources IPC. (ICP : Communication InterProcessus) ;
  • mois : pour gérer les points de montage ;
  • UTC: pour isoler le noyau et contrôler la génération des versions (UTC : système de partage de temps Unix).

Groupes de contrôle

Docker utilise également la technologie cgroups ou des groupes de contrôle. La clé pour exécuter une application de manière isolée est de fournir à l’application uniquement les ressources que vous souhaitez fournir. Cela garantit que les conteneurs seront de bons voisins. Les groupes de contrôle vous permettent de partager les ressources matérielles disponibles et, si nécessaire, de définir des limites et des restrictions. Par exemple, limitez la quantité de mémoire possible pour le conteneur.

Système de fichiers de l'Union

Union File Sysem ou UnionFS est un système de fichiers qui fonctionne en créant des couches, ce qui le rend très léger et rapide. Docker utilise UnionFS pour créer les blocs à partir desquels le conteneur est construit. Docker peut utiliser plusieurs variantes d'UnionFS, notamment : AUFS, btrfs, vfs et DeviceMapper.

Formats de conteneurs

Docker combine ces composants dans un wrapper que nous appelons le format de conteneur. Le format par défaut s'appelle libcontainer. Docker prend également en charge le format de conteneur traditionnel sous Linux en utilisant LXC. À l’avenir, Docker pourrait prendre en charge d’autres formats de conteneurs. Par exemple, l'intégration avec BSD Jails ou Solaris Zones.

Source: habr.com

Ajouter un commentaire