Tout savoir sur Docker et ses composants

Présentation Générale de Docker et ses composants

28 Octobre 2022

Docker overview | Docker Documentation

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.

La plateforme docker

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

  • Livraison rapide et cohérente de vos applications
  • Déploiement et mise à l'échelle réactifs
  • Exécuter plus de charges de travail sur le même hardware

L’architecture 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

Architecture Docker et les démons

Le démon Docker

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

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.

Le desktop Docker

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.

Les objets Docker

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.

Les images

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.

Les conteneurs (Containers)

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.

Exemple

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.

docker run -i -t ubuntu /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) :

  1. Si vous n'avez pas l'image ubuntu localement, Docker l'extrait de votre registre configuré, comme si vous aviez exécuté manuellement docker pull ubuntu.
  2. Docker crée un nouveau conteneur, comme si vous aviez exécuté manuellement une commande docker container create.
  3. Docker alloue un système de fichiers en lecture-écriture au conteneur, en tant que couche finale. Cela permet à un conteneur en cours d'exécution de créer ou de modifier des fichiers et des répertoires dans son système de fichiers local.
  4. Docker crée une interface réseau pour connecter le conteneur au réseau par défaut, puisque vous n'avez spécifié aucune option de mise en réseau. Cela inclut l'attribution d'une adresse IP au conteneur. Par défaut, les conteneurs peuvent se connecter à des réseaux externes à l'aide de la connexion réseau de la machine hôte.
  5. Docker démarre le conteneur et exécute /bin/bash. Étant donné que le conteneur s'exécute de manière interactive et est attaché à votre terminal (en raison des indicateurs -i et -t), vous pouvez fournir une entrée à l'aide de votre clavier pendant que la sortie est enregistrée sur votre terminal.
  6. Lorsque vous tapez exit pour terminer la commande /bin/bash, le conteneur s'arrête mais n'est pas supprimé. Vous pouvez le redémarrer ou le supprimer.

Les commandes de base

Gestion des images
  • docker pull : récupérer des images du dépôt docker.
  • docker push : utilisée pour pousser une image vers le référentiel Docker Hub.
  • docker images : répertorie toutes les images Docker stockées localement.
  • docker build : créer une image à partir d'un fichier docker spécifié.
Gestion des containers
  • docker run : créer un conteneur à partir d'une image.
  • docker ps : lister les conteneurs en cours d'exécution.
  • docker exec : utilisée pour accéder au conteneur en cours d'exécution.
  • docker stop : arrête un conteneur en cours d'exécution.
  • docker rm : supprimer un conteneur arrêté.

Intégrer une application existante

Dockerize an ASP.NET Core application | Docker Documentation
Créer un Dockerfile pour une application ASP.NET Core
  1. Créez un Dockerfile dans votre dossier de projet.
  2. Ajoutez le texte ci-dessous à votre Dockerfile pour les conteneurs Linux ou Windows. Les balises ci-dessous sont multi-arch, ce qui signifie qu'elles extraient des conteneurs Windows ou Linux en fonction du mode défini dans Docker Desktop pour Windows. En savoir plus sur le changement de conteneur.
  3. Le Dockerfile suppose que votre application s'appelle aspnetapp. Modifiez le Dockerfile pour utiliser le fichier DLL de votre projet.
# syntax=docker/dockerfile:1
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env
WORKDIR /app

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy everything else and build
COPY ../engine/examples ./
RUN dotnet publish -c Release -o out

# Build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "aspnetapp.dll"]

Pour rendre votre contexte de construction aussi petit que possible, ajoutez un fichier .dockerignore à votre dossier de projet et copiez-y ce qui suit.

bin/
obj/
Construire et exécuter l'image Docker

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 :

docker build -t aspnetapp .
$ docker run -d -p 8080:80 --name myapp aspnetapp
Afficher la page Web exécutée à partir d'un conteneur

Accédez à localhost:8080 pour accéder à votre application dans un navigateur Web.

Dockerfiles et bonnes pratiques

Exclure avec .dockerignore

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 étapes

Les 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 :

  • Installez les outils dont vous avez besoin pour créer votre application
  • Installer ou mettre à jour les dépendances de la bibliothèque
  • Générez votre application
N'installez pas de packages inutiles

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.

Minimiser le nombre de couches

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é.

Docker Registry

Docker Registry | Docker Documentation

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'utiliser

Vous devez utiliser le registre si vous souhaitez :

  • Contrôlez où vos images sont stockées
  • Possédez entièrement votre pipeline de distribution d'images
  • Intégrez le stockage et la distribution d'images dans votre workflow de développement interne

Alternatives

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 artefacts

Figure 2 - Le registre Docker distribue les images

Le registre Docker distribue les images
Registry (registre)

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 :

  • acr-helloworld:latest
  • acr-helloworld:v1
  • acr-helloworld:v2

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 :

  • marketing/campaign10-18/web:v2
  • marketing/campaign10-18/api:v3
  • marketing/campaign10-18/email-sender:v2
  • product-returns/web-submission:20180604
  • product-returns/legacy-integrator:20180715

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.

Tag

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

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.

Manifeste

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

Manifeste Hello World

Azure Container Registry

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'utilisation

Extrayez des images à partir d’un registre de conteneur Azure pour différents objectifs de déploiement :

  • Des systèmes d’orchestration évolutifs qui gèrent des applications en conteneur sur des clusters d’hôtes, y compris de Kubernetes, du contrôleur de domaine/système d’exploitation et de Docker Swarm.
  • Des services Azure qui prennent en charge la création et l’exécution des applications à grande échelle, y compris Azure Kubernetes Service (AKS), App Service, Batch, Service Fabric et d’autres services.
Les développeurs peuvent également effectuer un push vers un registre de conteneur dans le cadre d’un flux de travail de développement de conteneur. Par exemple, vous pouvez cibler un registre de conteneurs à partir d’un outil de livraison et d’intégration continue comme Azure Pipelines ou Jenkins.

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és

Extrayez 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.

  • Images et artefacts pris en charge : placée dans un dépôt, chaque image est une capture instantanée en lecture seule d’un conteneur compatible avec Docker. Les registres de conteneur Azure peuvent inclure des images de Windows et Linux. Vous contrôlez les noms d’images pour tous les déploiements de votre conteneur. Utilisez des commandes Docker standard pour envoyer les images dans un référentiel ou extraire une image d’un référentiel. En plus des images conteneurs Docker, Azure Container Registry stocke des formats de contenu associés comme les graphiques Helm et les images générées selon la spécification du format d’image Open Container Initiative (OCI).
  • 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.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *