Depuis plusieurs mois, j'utilise Docker pour structurer le processus de dĂ©veloppement / dĂ©ploiement de projets web. Je propose aux lecteurs de « HabrHabr » la traduction d'un article d'introduction sur Docker â .
Qu'est-ce que Docker ?
Docker est une plateforme ouverte pour développer, livrer et faire fonctionner des applications. Docker est conçu pour un déploiement plus rapide de vos applications. Avec Docker, vous pouvez dissocier votre application de votre infrastructure et traiter l'infrastructure comme une application gérée. Docker permet de déployer votre code plus rapidement, de le tester plus rapidement, de déployer des applications plus rapidement et de réduire le temps entre l'écriture et l'exécution du code. Docker réalise cela grùce à une plateforme légÚre de virtualisation par conteneurs, utilisant des processus et des outils qui aident à gérer et déployer vos applications.
Au sein de son cĆur, Docker permet de faire fonctionner pratiquement n'importe quelle application, isolĂ©e en toute sĂ©curitĂ© dans un conteneur. Cette isolation sĂ©curisĂ©e vous permet de faire fonctionner plusieurs conteneurs simultanĂ©ment sur un seul hĂŽte. La nature lĂ©gĂšre du conteneur, qui fonctionne sans la surcharge supplĂ©mentaire d'un hyperviseur, vous permet d'exploiter davantage votre matĂ©riel.
La plateforme et les outils de virtualisation de conteneurs peuvent ĂȘtre utiles dans les cas suivants :
- emballer votre application (ainsi que ses composants utilisés) dans des conteneurs Docker ;
- distribuer et livrer ces conteneurs à vos équipes pour le développement et les tests ;
- déployer ces conteneurs sur vos environnements de production, que ce soit dans des centres de données ou dans le cloud.
Ă quoi puis-je utiliser Docker ?
Déploiement rapide de vos applications
Docker est idéal pour organiser le cycle de développement. Docker permet aux développeurs d'utiliser des conteneurs locaux avec des applications et des services. Cela permet ensuite de s'intégrer dans le processus d'intégration et de déploiement continus (continuous integration and deployment workflow).
Par exemple, vos dĂ©veloppeurs Ă©crivent du code localement et partagent leur pile de dĂ©veloppement (ensemble d'images Docker) avec leurs collĂšgues. Lorsqu'ils sont prĂȘts, ils envoient le code et les conteneurs vers un environnement de test et lancent tous les tests nĂ©cessaires. Depuis l'environnement de test, ils peuvent envoyer le code et les images en production.
Déploiement et déploiement simplifiés
La plateforme basée sur des conteneurs Docker permet de porter facilement votre charge utile. Les conteneurs Docker peuvent fonctionner sur votre machine locale, à la fois sur une machine physique et sur une machine virtuelle dans un Data Center, ainsi que dans le cloud.
La portabilité et la légÚreté de Docker permettent de gérer dynamiquement votre charge utile. Vous pouvez utiliser Docker pour déployer ou éteindre votre application ou vos services. La rapidité de Docker permet de faire cela presque en temps réel.
Charges élevées et plus de charges utiles
Docker est léger et rapide. Il offre une alternative stable et rentable aux machines virtuelles basées sur hyperviseur. Il est particuliÚrement utile dans des conditions de 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 petites et moyennes, lorsque vous souhaitez tirer davantage de vos ressources existantes.
Composants principaux de Docker
Docker se compose de deux composants principaux :
- Docker : plateforme de virtualisation open source ;
- Docker Hub : notre plateforme en tant que service pour la distribution et la gestion des conteneurs Docker.
Remarque ! Docker est distribué sous la licence Apache 2.0.
Architecture de Docker
Docker utilise une architecture client-serveur. Le client Docker communique avec le dĂ©mon Docker, qui prend en charge la crĂ©ation, le dĂ©marrage et la distribution de vos conteneurs. Les deux, client et serveur peuvent fonctionner sur un mĂȘme systĂšme, vous pouvez connecter le client Ă un dĂ©mon Docker distant. Le client et le serveur communiquent via un socket ou via une API RESTful.

Démon Docker
Comme montré sur le schéma, le démon s'exécute sur la machine hÎte. L'utilisateur n'interagit pas directement avec le serveur, mais utilise le client pour cela.
Client Docker
Le client Docker, le programme docker, est l'interface principale avec Docker. Il reçoit des commandes de l'utilisateur et interagit avec le démon Docker.
à l'intérieur de Docker
Pour comprendre de quoi se compose Docker, vous devez connaĂźtre trois composants :
- images
- répertoires
- conteneurs
Images
Une image Docker est un modÚle en lecture seule. Par exemple, une image peut contenir le systÚme d'exploitation Ubuntu avec Apache et une application. Les images sont utilisées pour créer des conteneurs. Docker facilite la création de nouvelles images, la mise à jour des images existantes, ou vous pouvez télécharger des images créées par d'autres. Les images constituent une composante de la construction de Docker.
Registre
Le registre Docker stocke des images. Il existe des registres publics et privĂ©s, Ă partir desquels vous pouvez tĂ©lĂ©charger ou tĂ©lĂ©charger des images. Le registre Docker public est . Il contient une vaste collection d'images. Comme vous le savez, les images peuvent ĂȘtre créées par vous ou vous pouvez utiliser des images créées par d'autres. Les registres constituent une composante de la distribution.
Conteneurs
Les conteneurs ressemblent Ă des rĂ©pertoires. Les conteneurs contiennent tout ce dont une application a besoin pour fonctionner. Chaque conteneur est créé Ă partir d'une image. Les conteneurs peuvent ĂȘtre créés, dĂ©marrĂ©s, arrĂȘtĂ©s, dĂ©placĂ©s ou supprimĂ©s. Chaque conteneur est isolĂ© et constitue une plateforme sĂ©curisĂ©e pour l'application. Les conteneurs reprĂ©sentent une composante opĂ©rationnelle.
Comment fonctionne Docker ?
Pour l'instant, nous savons que :
- nous pouvons créer des images contenant 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.
Examinons comment ces composants s'assemblent.
Comment fonctionne une image ?
Nous savons dĂ©jĂ qu'une image est un modĂšle en lecture seule Ă partir duquel un conteneur est créé. Chaque image est composĂ©e d'un ensemble de niveaux. Docker utilise pour combiner ces niveaux en une seule image. Le systĂšme de fichiers union permet Ă des fichiers et des rĂ©pertoires issus de diffĂ©rents systĂšmes de fichiers (diffĂ©rentes branches) d'ĂȘtre superposĂ©s de maniĂšre transparente, crĂ©ant ainsi un systĂšme de fichiers cohĂ©rent.
Une des raisons pour lesquelles Docker est lĂ©ger est l'utilisation de ces niveaux. Lorsque vous modifiez une image, par exemple, en mettant Ă jour une application, un nouveau niveau est créé. Ainsi, sans remplacer l'ensemble de l'image ou la reconstruire, comme vous pourriez ĂȘtre amenĂ© Ă le faire avec une machine virtuelle, seul le niveau est ajoutĂ© ou mis Ă jour. Et vous n'avez pas besoin de distribuer toute la nouvelle image, seulement la mise Ă jour, ce qui facilite et accĂ©lĂšre la distribution des images.
Chaque image est basée sur 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 avez une image apache, vous pouvez l'utiliser comme image de base pour vos applications web.
Remarque ! Docker récupÚre généralement les images depuis le registre Docker Hub.
Les images Docker peuvent ĂȘtre créées Ă partir de ces images de base, les Ă©tapes de crĂ©ation de ces images sont appelĂ©es instructions. Chaque instruction crĂ©e une nouvelle image ou un niveau. Les instructions seront les actions suivantes :
- exécution d'une commande
- ajout d'un fichier ou d'un répertoire
- création d'une variable d'environnement
- indication de ce qui doit ĂȘtre exĂ©cutĂ© lors du lancement du conteneur de cette image
Ces instructions sont stockées dans un fichier Dockerfile. Docker lit cela, Dockerfilelorsque vous assemblez l'image, exécute ces instructions et retourne l'image finale.
Comment fonctionne le registre Docker ?
Un registre est un stockage d'images Docker. AprÚs avoir créé une image, vous pouvez la publier sur un registre public Docker Hub ou sur votre propre registre.
Avec le client Docker, vous pouvez rechercher des images déjà publiées et les télécharger sur votre machine avec Docker pour créer des conteneurs.
Docker Hub fournit des dépÎts d'images publics et privés. La recherche et le téléchargement d'images à partir de dépÎts publics sont accessibles à tous. Le contenu des dépÎts privés n'apparaßt pas dans les résultats de recherche. Seuls vous et vos utilisateurs pouvez accéder à ces images et créer des conteneurs à partir d'elles.
Comment fonctionne un conteneur ?
Un conteneur se compose du systĂšme d'exploitation, des fichiers d'utilisateur et des 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 lorsque le conteneur est lancĂ© et d'autres donnĂ©es de configuration. L'image Docker est en lecture seule. Lorsque Docker lance un conteneur, il crĂ©e un niveau en lecture/Ă©criture au-dessus de l'image (en utilisant un systĂšme de fichiers union, comme mentionnĂ© prĂ©cĂ©demment), oĂč une application peut ĂȘtre exĂ©cutĂ©e.
Que se passe-t-il lorsqu'un conteneur est lancé ?
Soit via un programme docker, soit par le biais de l'API RESTful, le client Docker indique au démon Docker de lancer le conteneur.
$ sudo docker run -i -t ubuntu /bin/bash
Décomposons cette commande. Le client est lancé avec la commande docker, avec l'option run, qui indique qu'un nouveau conteneur sera lancé. Les exigences minimales pour démarrer un conteneur sont les suivantes :
- quelle image utiliser pour créer le conteneur. Dans notre cas,
ubuntu - la commande que vous souhaitez exécuter lorsque le conteneur est lancé. Dans notre cas,
/bin/bash
Que se passe-t-il sous le capot lorsque nous exécutons cette commande ?
Docker, dans l'ordre, fait ce qui suit :
- télécharge l'image ubuntu : Docker vérifie la présence de l'image
ubuntusur la machine locale, et si elle n'est pas présente, il la télécharge depuis . Si l'image est présente, il l'utilise pour créer le conteneur ; - crée le conteneur : une fois l'image obtenue, Docker l'utilise pour créer le conteneur ;
- initialise le systÚme de fichiers et monte un niveau en lecture seule : le conteneur est créé dans le systÚme de fichiers et un niveau en lecture seule est ajouté à l'image ;
- initialise le réseau / pont : crée une interface réseau qui permet à Docker de communiquer avec l'hÎte ;
- Assignation d'une adresse IP : trouve et attribue une adresse ;
- Lance le processus spécifié : lance votre application ;
- Traite et émet la sortie de votre application : se connecte et enregistre l'entrée standard, la sortie et le flux d'erreurs de votre application, afin que vous puissiez suivre le fonctionnement de votre application.
Vous avez maintenant un conteneur opĂ©rationnel. Vous pouvez gĂ©rer votre conteneur et 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 réaliser la fonctionnalité décrite ci-dessus.
Espaces de noms (namespaces)
Docker utilise la technologie namespaces pour organiser des espaces de travail isolés, que nous appelons des conteneurs. Lorsque nous lançons un conteneur, Docker crée un ensemble d'espaces de noms pour ce conteneur.
Cela crée un niveau d'isolation, chaque aspect du conteneur est exécuté dans son propre espace de noms et n'a pas accÚs au systÚme externe.
Voici une liste de certains espaces de noms utilisés par Docker :
- pid : pour l'isolation des processus ;
- net : pour gérer les interfaces réseau ;
- ipc : pour gérer les ressources IPC (IPC : InterProcess Communication) ;
- mnt : pour gérer les points de montage ;
- utc : pour isoler le noyau et contrÎler la génération de versions (UTC : systÚme d'allocation de temps Unix).
Groupes de contrĂŽle (control groups)
Docker utilise également la technologie cgroups ou les groupes de contrÎle. La clé du fonctionnement de l'application en isolation est de fournir à l'application uniquement les ressources que vous souhaitez lui attribuer. Cela garantit que les conteneurs seront de bons voisins. Les groupes de contrÎle permettent de diviser les ressources disponibles du matériel et, si nécessaire, d'imposer des limites et des restrictions. Par exemple, limiter la quantité de mémoire qu'un conteneur peut utiliser.
SystĂšme de fichiers Union
Le SystÚme de fichiers Union 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 de UnionFS, y compris : AUFS, btrfs, vfs et DeviceMapper.
Formats de conteneurs
Docker combine ces composants dans un emballage que nous appelons le format de conteneur. Le format utilisé par défaut s'appelle libcontainer. Docker prend également en charge le format traditionnel des conteneurs sous Linux grùce à . à l'avenir, Docker pourrait prendre en charge d'autres formats de conteneurs, par exemple en s'intégrant avec les BSD Jails ou les Solaris Zones.
Source : habr.com
