28 Octobre 2022
Docker est une plate-forme ouverte pour le développement, la livraison et l'exécution d'applications. Docker vous permet de séparer vos applications de votre infrastructure afin que vous puissiez livrer rapidement des logiciels. Avec Docker, vous pouvez gérer votre infrastructure de la même manière que vous gérez vos applications. En tirant parti des méthodologies de Docker pour expédier, tester et déployer rapidement le code, vous pouvez réduire considérablement le délai entre l'écriture du code et son exécution en production.
Docker offre la possibilité de conditionner et d'exécuter une application dans un environnement isolé appelé conteneur. L'isolation et la sécurité vous permettent d'exécuter plusieurs conteneurs simultanément sur un hôte (host, serveur) donné. Les conteneurs sont légers et contiennent tout le nécessaire pour exécuter l'application, vous n'avez donc pas besoin de vous fier à ce qui est actuellement installé sur l'hôte. Vous pouvez facilement partager des conteneurs pendant que vous travaillez et vous assurer que toutes les personnes avec lesquelles vous partagez reçoivent le même conteneur qui fonctionne de la même manière.
Développez votre application et ses composants de support à l'aide de conteneurs.
Le conteneur devient l'unité de distribution et de test de votre application.
Lorsque vous êtes prêt, déployez votre application dans votre environnement de production, en tant que conteneur ou service orchestré. Cela fonctionne de la même manière, que votre environnement de production soit un centre de données local, un fournisseur de cloud ou un hybride des deux.
Pour quoi utiliser docker
Docker utilise une architecture client-serveur. Le client Docker communique avec le démon Docker, qui effectue le gros du travail de création, d'exécution et de distribution de vos conteneurs Docker. Le client et le démon Docker peut s'exécuter sur le même système, ou vous pouvez connecter un client Docker à un démon Docker distant. Le client et le démon Docker communique à l'aide d'une API REST, via des sockets UNIX ou une interface réseau. Un autre client Docker est Docker Compose, qui vous permet de travailler avec des applications composées d'un ensemble de conteneurs.
Figure 1 - Architecture Docker et les démons
Le daemon Docker (dockerd) écoute les requêtes de l'API Docker et gère les objets Docker tels que les images, les conteneurs, les réseaux et les volumes. Un démon peut également communiquer avec d'autres démons pour gérer les services Docker.
Le client Docker (docker) est le principal moyen utilisé par de nombreux utilisateurs Docker pour interagir avec Docker. Lorsque vous utilisez des commandes telles que docker run, le client envoie ces commandes à dockerd, qui les exécute. La commande docker utilise l'API Docker. Le client Docker peut communiquer avec plusieurs démons.
Docker Desktop est une application facile à installer pour votre environnement Mac ou Windows qui vous permet de créer et de partager des applications et des micro-services conteneurisés. Docker Desktop inclut le daemon Docker (dockerd), le client Docker (docker), Docker Compose, Docker Content Trust, Kubernetes et Credential Helper.
Lorsque vous utilisez Docker, vous créez et utilisez des images, des conteneurs, des réseaux, des volumes, des plug-ins et d'autres objets. Cette section est un bref aperçu de certains de ces objets.
Une image est un modèle en lecture seule contenant des instructions pour créer un conteneur Docker. Souvent, une image est basée sur une autre image, avec quelques personnalisations supplémentaires. Par exemple, vous pouvez créer une image basée sur l'image ubuntu, mais installer le serveur Web Apache et votre application, ainsi que les détails de configuration nécessaires pour faire fonctionner votre application.
Vous pouvez créer vos propres images ou n'utiliser que celles créées par d'autres et publiées dans un registre. Pour construire votre propre image, vous créez un Dockerfile avec une syntaxe simple pour définir les étapes nécessaires pour créer l'image et l'exécuter. Chaque instruction d'un Dockerfile crée une couche dans l'image. Lorsque vous modifiez le Dockerfile et reconstruisez l'image, seuls les couches qui ont changé sont reconstruits. Cela fait partie de ce qui rend les images si légères, petites et rapides, par rapport aux autres technologies de virtualisation.
Un conteneur est une instance exécutable d'une image. Vous pouvez créer, démarrer, arrêter, déplacer ou supprimer un conteneur à l'aide de l'API ou de la CLI Docker. Vous pouvez connecter un conteneur à un ou plusieurs réseaux, y attacher un stockage ou même créer une nouvelle image en fonction de son état actuel.
Par défaut, un conteneur est relativement bien isolé des autres conteneurs et de sa machine hôte. Vous pouvez contrôler le degré d'isolement du réseau, du stockage ou d'autres sous-systèmes sous-jacents d'un conteneur par rapport aux autres conteneurs ou à la machine hôte.
Un conteneur est défini par son image ainsi que par les options de configuration que vous lui fournissez lorsque vous le créez ou le démarrez. Lorsqu'un conteneur est supprimé, toutes les modifications apportées à son état qui ne sont pas stockées dans le stockage persistant disparaissent.
La commande suivante exécute un conteneur ubuntu, se connecte de manière interactive à votre session de ligne de commande locale et exécute /bin/bash.
Lorsque vous exécutez cette commande, les événements suivants se produisent (en supposant que vous utilisez la configuration de registre par défaut) :
Pour rendre votre contexte de construction aussi petit que possible, ajoutez un fichier .dockerignore à votre dossier de projet et copiez-y ce qui suit.
Ouvrez une invite de commande et accédez au dossier de votre projet.
Utilisez les commandes suivantes pour créer et exécuter votre image Docker :
Accédez à localhost:8080 pour accéder à votre application dans un navigateur Web.
Pour exclure les fichiers non pertinents pour la construction utilisez un fichier .dockerignore. Ce fichier prend en charge les modèles d'exclusion similaires aux fichiers .gitignore.
Utiliser des builds en plusieurs étapesLes constructions en plusieurs étapes vous permettent de réduire considérablement la taille de votre image finale, sans lutter pour réduire le nombre de couches et de fichiers intermédiaires.
Étant donné qu'une image est créée au cours de la dernière étape du processus de génération, vous pouvez minimiser les couches d'image en tirant parti du cache de génération.
Par exemple, si votre build contient plusieurs couches, vous pouvez les trier des moins fréquemment modifiées (pour vous assurer que le cache de build est réutilisable) aux plus fréquemment modifiées :
Pour réduire la complexité, les dépendances, la taille des fichiers et les temps de construction, évitez d'installer des packages supplémentaires ou inutiles simplement parce qu'ils pourraient être "agréables à avoir".
Par exemple, vous n'avez pas besoin d'inclure un éditeur de texte dans une image de base de données.
Dans les anciennes versions de Docker, il était important de minimiser le nombre de calques dans vos images pour vous assurer qu'elles étaient performantes. Les fonctionnalités suivantes ont été ajoutées pour réduire cette limitation :
Seules les instructions RUN, COPY, ADD créent des calques. D'autres instructions créent des images intermédiaires temporaires et n'augmentent pas la taille de la construction.
Dans la mesure du possible, utilisez des versions en plusieurs étapes et copiez uniquement les artefacts dont vous avez besoin dans l'image finale. Cela vous permet d'inclure des outils et des informations de débogage dans vos étapes de construction intermédiaires sans augmenter la taille de l'image finale.
Tirer parti du cache de construction (build cache)Lors de la création d'une image, Docker parcourt les instructions de votre Dockerfile, en exécutant chacune dans l'ordre spécifié. Au fur et à mesure que chaque instruction est examinée, Docker recherche une image existante dans son cache qu'il peut réutiliser, plutôt que de créer une nouvelle image (dupliquée).
Si vous ne voulez pas du tout utiliser le cache, vous pouvez utiliser l'option --no-cache=true sur la commande docker build. Cependant, si vous laissez Docker utiliser son cache, il est important de comprendre quand il peut et ne peut pas trouver une image correspondante. Les règles de base suivies par Docker sont décrites ci-dessous :
En commençant par une image parente qui est déjà dans le cache, l'instruction suivante est comparée à toutes les images enfants dérivées de cette image de base pour voir si l'une d'entre elles a été construite en utilisant exactement la même instruction. Sinon, le cache est invalidé.
Dans la plupart des cas, il suffit de comparer l'instruction du Dockerfile avec l'une des images enfant. Cependant, certaines instructions nécessitent plus d'examen et d'explications.
Pour les instructions ADD et COPY, le contenu du ou des fichiers de l'image est examiné et une somme de contrôle est calculée pour chaque fichier. Les heures de dernière modification et de dernier accès du ou des fichiers ne sont pas prises en compte dans ces sommes de contrôle. Lors de la recherche dans le cache, la somme de contrôle est comparée à la somme de contrôle dans les images existantes. Si quelque chose a changé dans le ou les fichiers, tels que le contenu et les métadonnées, le cache est invalidé.
Hormis les commandes ADD et COPY, la vérification du cache ne regarde pas les fichiers dans le conteneur pour déterminer une correspondance de cache. Par exemple, lors du traitement d'une commande RUN apt-get -y update , les fichiers mis à jour dans le conteneur ne sont pas examinés pour déterminer si un accès au cache existe. Dans ce cas, seule la chaîne de commande elle-même est utilisée pour trouver une correspondance.
Une fois le cache invalidé, toutes les commandes Dockerfile suivantes génèrent de nouvelles images et le cache n'est pas utilisé.
Le registre est une application côté serveur sans état et hautement évolutive qui stocke et vous permet de distribuer des images Docker. Le Registre est open-source, sous la licence Apache permissive.
Pourquoi l'utiliserVous devez utiliser le registre si vous souhaitez :
Les utilisateurs à la recherche d'une solution sans entretien et prête à l'emploi sont encouragés à se diriger vers Docker Hub, qui fournit un registre hébergé gratuit, ainsi que des fonctionnalités supplémentaires (comptes d'organisation, versions automatisées, etc.).
À propos des registres, des référentiels et des artefactsFigure 2 - Le registre Docker distribue les images
Un registre de conteneurs est un service qui stocke et distribue des images conteneur et des artefacts associés. Docker Hub est un exemple de registre de conteneurs public qui sert de catalogue général d’images conteneur Docker. Azure Container Registry fournit aux utilisateurs un contrôle direct du contenu de leurs conteneurs, avec l’authentification intégrée, la géo-réplication prenant en charge la distribution mondiale et la fiabilité pour les déploiements proches du réseau, la configuration du réseau virtuel avec Private Link, le verrouillage des étiquettes, et de nombreuses autres fonctionnalités avancées.
En plus des images conteneur compatibles avec Docker, Azure Container Registry prend en charge différents artefacts de contenu, y compris les charts Helm et le format d’image OCI (Open Container Initiative).
Repository (référentiel)Un référentiel est une collection d’images conteneur ou d’autres artefacts dans un registre ayant le même nom, mais des étiquettes différentes. Par exemple, les trois images suivantes se trouvent dans le référentiel acr-helloworld :
Les noms des référentiels peuvent également comprendre des espaces de noms. Les espaces de noms vous permettent d’identifier des référentiels associés et la propriété d’artefact dans votre organisation en utilisant des noms de délimités par des barres obliques. Toutefois, le registre gère tous les référentiels indépendamment, et non en tant que hiérarchie. Par exemple :
Les noms de référentiel ne peuvent inclure que des caractères alphanumériques en minuscules, des points, des tirets, des tirets du bas et des barres obliques.
Pour connaître les règles complètes de nommage de référentiel, consultez la spécification de distribution Open Container Initiative.
Artifact (Artefact)Une image conteneur (ou un autre artefact qui se trouve dans le registre) est associée à une ou plusieurs étiquettes, est constituée d’un ou plusieurs calques, et est identifiable par son manifeste. Comprendre comment ces composants sont liés entre eux peut vous aider à gérer de manière efficace votre registre.
L’étiquette pour une image ou autre artefact spécifie sa version. Un même artefact au sein d’un référentiel peut recevoir une ou plusieurs étiquettes, et peut également être « sans étiquette ». Cela signifie que vous pouvez supprimer toutes les étiquettes d’une image : les données de l’image (ses couches) restent donc dans le registre.
Le nom d’une image est défini par le référentiel (ou le référentiel et l’espace de noms) et l’étiquette. Vous pouvez envoyer (push) et tirer (pull) une image en spécifiant son nom dans l’opération push ou pull. L’étiquette latest est utilisée par défaut si vous n’en fournissez pas une dans vos commandes Docker.
La façon dont vous étiquetez les images conteneur est guidée par vos scénarios pour les développer ou les déployer. Par exemple, les étiquettes stables sont recommandées pour gérer vos images de base et les étiquettes uniques pour le déploiement d’images.
Les images conteneur et les artefacts sont constitués d’une ou plusieurs couches. Les différents types d’artefacts définissent les couches différemment. Par exemple, dans une image conteneur Docker, chaque couche correspond à une ligne dans le fichier Dockerfile qui définit l’image :
Figure 3 - Définition des couches dans un Dockerfile
Les artefacts d’un registre partagent des couches communes, ce qui augmente l’efficacité du stockage. Par exemple, plusieurs images dans des référentiels différents peuvent partager une couche de base ASP.NET Core, mais une seule copie de cette couche est stockée dans le registre. Le partage des couches optimise également la distribution des couches sur les nœuds, avec plusieurs artefacts partageant des couches communes. Si une image déjà présente sur un nœud a comme base une couche ASP.NET Core, le tirage suivant d’une autre image référençant la même couche ne va pas transférer la couche au nœud. Au lieu de cela, il va référencer le calque déjà présent dans le nœud.
Pour fournir une isolation sécurisée et une protection contre la manipulation de calques potentiels, les calques ne sont pas partagés entre les registres.
Chaque image conteneur (ou artefact) envoyée (push) à un registre de conteneurs est associée à un manifeste. Le manifeste, qui est généré par le registre quand l’image est tirée, identifie les artefacts de façon univoque et spécifie les couches.
Un manifeste de base pour une image hello-world Linux se présente comme suit :
Figure 4 - Manifeste Hello World
Azure Container Registry vous permet de créer, stocker et gérer des images et des artefacts de conteneur dans un registre privé pour tous les types de déploiements de conteneurs. Utilisez les registres de conteneurs Azure avec vos pipelines de développement et de déploiement de conteneurs existants. Utilisez les tâches Azure Container Registry pour créer des images de conteneur dans Azure à la demande ou automatisez les générations déclenchées par les mises à jour du code source, les mises à jour de l'image de base d'un conteneur ou les minuteurs.
Cas d'utilisationExtrayez des images à partir d’un registre de conteneur Azure pour différents objectifs de déploiement :
Configurez ACR Tasks pour recréer automatiquement des images d’application lorsque leurs images de base sont mises à jour, ou automatisez la génération d’images lorsque votre équipe valide le code dans un dépôt Git. Créez des tâches à plusieurs étapes pour automatiser la création, le test et la correction de plusieurs images conteneur en parallèle dans le cloud.
Azure fournit des outils, notamment l’interface de ligne de commande Azure, le portail Azure et la prise en charge des API, qui permettent de gérer vos registres de conteneurs Azure. Si vous le souhaitez, vous pouvez installer l’extension Docker pour Visual Studio Code et l’extension Compte Azure pour utiliser vos registres de conteneurs Azure. Dans Visual Studio Code, vous pouvez tirer (pull) et envoyer (push) des images vers un registre de conteneurs Azure, et exécuter ACR Tasks.
Fonctionnalités clésExtrayez des images à partir d’un registre de conteneur Azure pour différents objectifs de déploiement :
Niveaux de service des registres : créez au moins un registre de conteneurs dans votre abonnement Azure. Les registres sont disponibles en trois niveaux : De base, Standard et Premium, chacune prenant en charge l’intégration webhook, l’authentification de registres auprès d’Azure Active Directory et la fonctionnalité de suppression. Tirez parti du stockage local proche du réseau de vos images de conteneur en créant un registre dans le même emplacement Azure que vos déploiements. Utilisez la fonctionnalité géoréplication des registres Premium pour les scénarios avancés de réplication et de distribution d’image conteneur.
Sécurité et accès : vous vous connectez à un registre à l’aide d’Azure CLI ou de la commande docker login standard. Azure Container Registry transfère les images conteneur via HTTPS et prend en charge TLS pour sécuriser les connexions clientes.
Vous contrôlez l’accès à un registre de conteneurs à l’aide d’une identité Azure, d’un principal de service pris en charge par Azure Active Directory ou d’un compte d’administration fourni. Utilisez le contrôle d’accès en fonction du rôle Azure (Azure RBAC) pour affecter des autorisations affinées au niveau utilisateurs ou systèmes à un registre.
Les fonctionnalités de sécurité du niveau de service Premium incluent l’approbation de contenu pour la signature des étiquettes d’images, et les pare-feu et réseaux virtuels (préversion) pour restreindre l’accès au registre. Microsoft Defender pour le cloud s’intègre éventuellement à Azure Container Registry pour analyser les images chaque fois qu’une image est envoyée (push) vers un registre.
Génération d’images automatisée : utilisez Azure Container Registry Tasks (ACR Tasks) pour créer, tester, envoyer (push) et déployer plus simplement des images dans Azure. Par exemple, vous pouvez utiliser ACR Tasks pour étendre votre développement interne dans le cloud en déchargeant les opérations docker build dans Azure. Configurez des tâches de build pour automatiser le pipeline des mises à jour correctives (infrastructure et système d’exploitation du conteneur) et ainsi créer automatiquement des images lorsque votre équipe valide le code pour contrôler la source.
Les tâches multi-étapes permettent la définition et l’exécution basées sur une tâche pour la génération, le test et la mise à jour corrective d’images conteneur dans le cloud. Les étapes de la tâche définissent les opérations build et push d’une image de conteneur individuelle. Elles permettent également de définir l’exécution d’un ou plusieurs conteneurs, en utilisant à chaque étape le conteneur comme son environnement d’exécution.
anas elhafdi
merci