Récupérer une image Docker existante et la déployer localement

Effectué

Docker est une technologie qui vous permet de déployer des applications et des services rapidement et facilement. Une application Docker s’exécute à l’aide d’une image Docker. Une image Docker est un environnement pré-empaqueté contenant le code d’application et l’environnement dans lequel le code s’exécute.

Dans le scénario d’entreprise que nous avons décrit précédemment, vous souhaitez examiner la faisabilité de l’empaquetage et de l’exécution d’une application avec Docker. Vous décidez de générer et de déployer une image Docker en exécutant une application web de test.

Dans cette unité, vous allez découvrir les concepts et processus clés impliqués dans l’exécution d’une application conteneurisée stockée dans une image Docker.

Vue d’ensemble de Docker

Docker est un outil servant à exécuter des applications en conteneur. Une application en conteneur comprend l’application et le système de fichiers qui constitue l’environnement dans lequel elle s’exécute. Par exemple, une application en conteneur peut se composer d’une base de données, et d’autres logiciels et informations de configuration associés nécessaires à l’exécution de l’application.

Une application en conteneur a généralement un encombrement inférieur à celui d’une machine virtuelle configurée pour exécuter la même application. La raison en est qu’une machine virtuelle doit fournir l’ensemble du système d’exploitation et l’environnement de prise en charge associé. Un conteneur Docker n’a pas cette surcharge, car Docker utilise le noyau du système d’exploitation de l’ordinateur hôte pour faire fonctionner le conteneur. Le téléchargement et le démarrage d’une image Docker sont plus rapides et compacts que le téléchargement et l’exécution d’une machine virtuelle qui fournit des fonctionnalités similaires.

Vous créez une application conteneurisée en générant une image qui contient un ensemble de fichiers et une section d’informations de configuration qu’utilise Docker. Vous exécutez l’application en demandant à Docker de démarrer un conteneur basé sur l’image. Quand le conteneur démarre, Docker utilise la configuration de l’image pour déterminer quelle application exécuter au sein du conteneur. Docker fournit les ressources de système d’exploitation et la sécurité nécessaire. Il vérifie que les conteneurs s’exécutent simultanément et restent relativement isolés.

Important

Docker ne fournit pas le niveau d’isolation disponible avec les machines virtuelles. Une machine virtuelle implémente l’isolement au niveau du matériel. Les conteneurs Docker partagent les ressources et les bibliothèques du système d’exploitation sous-jacent. Cependant, Docker garantit qu’un conteneur ne peut pas accéder aux ressources d’un autre conteneur, sauf si les conteneurs sont configurés pour cela.

Vous pouvez exécuter Docker sur votre poste de travail ou votre ordinateur portable si vous développez et que vous testez localement. Concernant les systèmes de production, Docker est disponible pour les environnements de serveur, y compris de nombreuses variantes de Linux et Microsoft Windows Server 2016. De nombreux fournisseurs prennent également en charge Docker dans le cloud. Par exemple, vous pouvez stocker des images Docker dans Azure Container Registry et exécuter des conteneurs avec Azure Container Instances.

Dans ce module, vous allez utiliser Docker localement pour créer et exécuter une image. Ensuite, vous chargerez l’image dans Azure Container Registry et l’exécuterez dans une instance de conteneur Azure. Cette version de Docker est appropriée pour développer et tester des images Docker localement.

Images Docker Linux et Windows

Initialement développé pour Linux, Docker s’est depuis développé pour prendre en charge Windows. Les images Docker individuelles sont basées sur Windows ou basées sur Linux, mais pas les deux en même temps. Le système d’exploitation de l’image détermine le type d’environnement de système d’exploitation utilisé à l’intérieur du conteneur.

Les créateurs d’images Docker qui souhaitent offrir des fonctionnalités similaires dans des images basées sur Linux et des images basées sur Windows peuvent générer ces images séparément. Par exemple, Microsoft propose des images Docker Windows et Linux contenant un environnement ASP.NET Core que vous pouvez utiliser comme base pour les applications ASP.NET Core conteneurisées.

Les ordinateurs Linux sur lesquels Docker est installé peuvent exécuter uniquement des conteneurs Linux. Les ordinateurs Windows sur lesquels Docker est installé peuvent exécuter les deux types de conteneurs. Windows exécute les deux en utilisant une machine virtuelle pour exécuter un système Linux, et utilise le système Linux virtuel pour exécuter les conteneurs Linux.

Dans ce module, vous allez créer et exécuter une image basée sur Linux.

Registres docker et Docker Hub

Les images Docker sont stockées et mises à disposition dans des registres. Un registre est un service web auquel Docker peut se connecter pour charger et télécharger des images conteneur. Le registre le plus connu est Docker Hub, qui est un registre public. De nombreuses personnes et organisations publient des images sur Docker Hub, et vous pouvez télécharger et exécuter ces images à l’aide de Docker, que celui-ci s’exécute sur votre poste de travail, sur un serveur ou dans le cloud. Vous pouvez créer un compte Docker Hub et y charger vos images gratuitement.

Un registre est organisé sous la forme d’une série de dépôts. Chaque dépôt contient plusieurs images Docker qui partagent un nom commun, et généralement les mêmes objectifs et les mêmes fonctionnalités. Ces images ont normalement des versions différentes identifiées par une étiquette. Ce mécanisme vous permet de publier et de conserver plusieurs versions des images pour des raisons de compatibilité. Quand vous téléchargez et que vous exécutez une image, vous devez spécifier le registre, le dépôt et l’étiquette de version de l’image. Les étiquettes sont des étiquettes de texte, et vous pouvez utiliser votre système de numérotation des versions (v1.0, v1.1, v1.2, v2.0, etc.).

Supposons que vous voulez utiliser l’image Docker du runtime ASP.NET Core. Cette image est disponible en deux versions :

  • 8.0 (LTS) : mcr.microsoft.com/dotnet/aspnet:8.0
  • 6.0 (LTS) : mcr.microsoft.com/dotnet/aspnet:6.0

Supposons à présent que vous voulez utiliser les exemples d’image Docker .NET Core. Ici, vous pouvez choisir parmi quatre versions :

  • mcr.microsoft.com/dotnet/samples:dotnetapp
  • mcr.microsoft.com/dotnet/samples:dotnetapp-chiseled
  • mcr.microsoft.com/dotnet/samples:aspnetapp
  • mcr.microsoft.com/dotnet/samples:aspnetapp-chiseled

Notes

Plusieurs étiquettes peuvent être affectées à une même image. Par convention, la version la plus récente d’une image se voit attribuer l’étiquette latest en plus d’une étiquette qui décrit son numéro de version. Quand vous publiez une nouvelle version d’une image, vous pouvez réaffecter l’étiquette latest pour référencer la nouvelle image.

Un dépôt est également l’unité de confidentialité pour une image. Si vous ne souhaitez pas partager une image, vous pouvez rendre le dépôt privé. Vous pouvez accorder l’accès à d’autres utilisateurs avec lesquels vous souhaitez partager l’image.

Parcourir Docker Hub et tirer une image

Remarque

Vous n’avez pas besoin d’effectuer les exemples ni d’exécuter le code des sections suivantes. Vous allez le faire dans la prochaine unité.

Il s’avère souvent que Docker Hub contient une image qui se rapproche du type d’application que vous voulez conteneuriser. Vous pouvez télécharger cette image et l’étendre avec le code de votre application.

Docker Hub contient plusieurs milliers d’images. Vous pouvez rechercher et parcourir un registre en utilisant Docker à partir de la ligne de commande ou du site web de Docker Hub. Le site web vous permet de rechercher, de filtrer et de sélectionner des images par type et par éditeur. La figure ci-dessous montre un exemple de page de recherche.

Capture d’écran de la page de recherche Docker Hub où sont répertoriées les différentes images conteneur.

Vous utilisez la commande docker pull avec le nom de l’image pour récupérer une image. Par défaut, Docker télécharge l’image étiquetée latest à partir de ce dépôt sur Docker Hub si vous spécifiez seulement le nom du dépôt. Gardez à l’esprit que vous pouvez modifier la commande pour extraire d’autres étiquettes et à partir d’autres dépôts. Cet exemple récupère (fetch) l’image avec l’étiquette aspnetapp à partir du dépôt mcr.microsoft.com/dotnet/samples:aspnetapp. Cette image contient une application web ASP.NET Core simple.

Notes

Les exemples de cette unité sont destinés à illustrer la syntaxe des différentes commandes Docker. Vous n’avez pas besoin d’exécuter ces commandes durant la lecture de cette unité. Les exercices qui suivent cette unité vous guident dans l’utilisation directe de Docker.

docker pull mcr.microsoft.com/dotnet/samples:aspnetapp

Quand vous récupérez une image, Docker la stocke localement et la rend disponible pour les conteneurs en cours d’exécution. Vous pouvez voir les images dans votre registre local avec la commande docker image list.

docker image list

La sortie ressemble à l’exemple suivant :

REPOSITORY TAG IMAGE ID CREATED SIZE
mcr.microsoft.com/dotnet/samples   aspnetapp           6e2737d83726        6 days ago          263MB

Vous pouvez utiliser l’ID du nom de l’image pour référencer l’image dans de nombreuses autres commandes Docker.

Exécuter un conteneur Docker

Utilisez la commande docker run pour démarrer un conteneur. Spécifiez l’image à exécuter avec son nom ou son ID. Si vous n’avez pas déjà effectué une opération (docker pull) sur l’image, Docker le fait pour vous.

docker run mcr.microsoft.com/dotnet/samples:aspnetapp

Dans cet exemple, la commande répond avec le message suivant :

warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
 No XML encryptor configured. Key {d8e1e1ea-126a-4383-add9-d9ab0b56520d} may be persisted to storage in unencrypted form.
Hosting environment: Production
Content root path: /app
Now listening on: http://[::]:80
Application started. Press Ctrl+C to shut down.

Cette image contenant une application web, elle écoute les demandes qui arrivent sur le port HTTP 80. Toutefois, si vous ouvrez un navigateur web et accédez à http://localhost:80, vous ne voyez pas l’application.

Par défaut, Docker n’autorise pas les demandes réseau entrantes à atteindre votre conteneur. Vous devez indiquer à Docker d’affecter un numéro de port spécifique de votre ordinateur à un port spécifique dans le conteneur en ajoutant l’option -p à docker run. Cette instruction active les demandes réseau vers le conteneur sur le port spécifié.

En outre, l’application web dans cette image n’est pas destinée à être utilisée de façon interactive à partir de la ligne de commande. Quand nous la démarrons, nous voulons que Docker la démarre en arrière-plan et qu’il la laisse simplement s’exécuter. Utilisez l’indicateur -d pour indiquer à Docker de démarrer l’application Web en arrière-plan.

Appuyez sur Ctrl+C pour arrêter l’image, puis redémarrez-la comme indiqué dans l’exemple suivant :

docker run -p 8080:80 -d mcr.microsoft.com/dotnet/samples:aspnetapp

La commande mappe le port 80 dans le conteneur au port 8080 sur votre ordinateur. Si vous visitez la page http://localhost:8080 dans un navigateur, vous verrez l’exemple d’application web.

Capture d’écran de l’exemple d’application web en cours d’exécution dans un navigateur.

Conteneurs et fichiers

Si un conteneur en cours d’exécution apporte des modifications aux fichiers dans son image, ces modifications existent uniquement dans le conteneur où les modifications sont effectuées. À moins que vous preniez des mesures spécifiques pour conserver l’état d’un conteneur, ces modifications sont perdues quand le conteneur est supprimé. De même, plusieurs conteneurs basés sur une même image qui s’exécutent simultanément ne partagent pas les fichiers dans l’image. Chaque conteneur a sa propre copie indépendante. Les données qu’un conteneur écrit dans son système de fichiers ne sont pas visibles par l’autre conteneur.

Il est possible d’ajouter des volumes accessibles en écriture à un conteneur. Un volume, qui représente un système de fichiers que le conteneur peut monter, est mis à la disposition de l’application en cours d’exécution dans le conteneur. Les données d’un volume sont conservées quand le conteneur s’arrête, et plusieurs conteneurs peuvent partager un même volume. Ce module n’aborde pas en détail la création et l’utilisation de volumes.

C’est une bonne pratique que d’éviter d’apporter des modifications au système de fichiers de l’image pour les applications déployées avec Docker. Utilisez-le seulement pour les fichiers temporaires dont la perte ne pose pas de problème.

Gérer les conteneurs Docker

Vous pouvez voir les conteneurs actifs avec la commande docker ps.

docker ps

La sortie comprend l’état du conteneur (Up s’il est en cours d’exécution, Exited s’il s’est arrêté) ainsi que d’autres valeurs comme les indicateurs de ligne de commande spécifiés au démarrage de l’image et d’autres informations. Étant donné que Docker vous permet d’exécuter plusieurs conteneurs simultanément à partir d’une même image, chaque conteneur se voit affecter un ID unique ainsi qu’un nom unique explicite. La plupart des commandes Docker utilisées pour gérer les différents conteneurs peuvent utiliser l’ID ou le nom afin de faire référence à un conteneur spécifique.

Dans la sortie ci-dessous, vous pouvez voir deux conteneurs. Le champ PORTS montre que le conteneur avec l’ID elegant_ramanujan est l’image en cours d’exécution avec le port 80 sur l’hôte Docker mappé au port 8080 sur votre ordinateur. L’instance youthful_heisenberg est le conteneur de l’exécution précédente de l’image. Le champ COMMAND affiche la commande exécutée par le conteneur pour démarrer l’application dans l’image. Dans ce cas, pour les deux conteneurs, il s’agit de dotnet aspnetapp.dll. L’ID d’image pour les conteneurs est également le même, car les deux conteneurs exécutent la même Image.

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57b9587583e3        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   42 seconds ago      Up 41 seconds       0.0.0.0:8080->80/tcp   elegant_ramanujan
d27071f3ca27        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   5 minutes ago      Up 5 minutes       0.0.0.0:8081->80/tcp   youthful_heisenberg

Notes

docker psest un raccourci pour docker container ls. Les noms de ces commandes sont basés sur les utilitaires Linux ps et ls, qui listent les processus et fichiers en cours d’exécution, respectivement.

Vous pouvez arrêter un conteneur actif avec la commande docker stop en spécifiant l’ID de conteneur.

docker stop elegant_ramanujan

Si vous réexécutez docker ps, vous voyez que le conteneur elegant_ramanujan n’est plus dans la sortie. Le conteneur existe toujours, mais il n’héberge plus de processus en cours d’exécution. Vous pouvez inclure les conteneurs arrêtés dans la sortie de docker ps en incluant l’indicateur -a :

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57b9587583e3        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   2 minutes ago       Exited (0) 21 seconds ago                       elegant_ramanujan
d27071f3ca27        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   7 minutes ago      Up 7 minutes       0.0.0.0:8081->80/tcp   youthful_heisenberg

Vous pouvez redémarrer un conteneur arrêté avec la commande docker start. Le processus principal du conteneur est redémarré.

docker start elegant_ramanujan

En règle générale, une fois qu’un conteneur est arrêté, vous devez également le supprimer. La suppression d’un conteneur nettoie toutes les ressources qu’il a laissées. Une fois que vous supprimez un conteneur, toutes les modifications apportées au sein de son système de fichiers image sont définitivement perdues.

docker rm elegant_ramanujan

Vous ne pouvez pas supprimer un conteneur en cours d’exécution, mais vous pouvez forcer l’arrêt et la suppression d’un conteneur avec l’indicateur -f de la commande docker rm. Cette méthode permet d’arrêter et de supprimer rapidement un conteneur, mais elle ne doit être utilisée que si l’application à l’intérieur du conteneur n’a pas besoin d’effectuer un arrêt approprié.

docker container rm -f elegant_ramanujan

Supprimer des images Docker

Vous pouvez supprimer une image de l’ordinateur local avec la commande docker image rm. Spécifiez l’ID de l’image à supprimer. L’exemple suivant supprime l’image correspondant à l’exemple d’application web.

docker image rm mcr.microsoft.com/dotnet/core/samples:aspnetapp

Les conteneurs exécutant l’image doivent être arrêtés pour que l’image puisse être supprimée. Si l’image est toujours en cours d’utilisation par un conteneur, vous obtenez un message d’erreur semblable au message suivant. Dans cet exemple, l’erreur se produit car le conteneur youthful_hesienburg utilise toujours l’image.

Error response from daemon: conflict: unable to delete 575d85b4a69b (cannot be forced) - image is being used by running container c13165988cfe