Comment créer des images Docker

Topics Cloud Native Images Docker : Mode…

Définition

Une image Docker est un modèle en lecture seule qui contient les instructions nécessaires pour créer un conteneur, en regroupant une application et son environnement préconfiguré. Dans cet article, vous découvrirez l’essentiel pour comprendre et construire des images Docker, ainsi qu’un accompagnement pas à pas et des bonnes pratiques pour des builds de conteneurs efficaces et sécurisés.

Résumé

  • Une image Docker est un modèle en lecture seule qui contient les instructions nécessaires pour créer un conteneur, en regroupant une application et son environnement préconfiguré. C’est le point de départ essentiel pour utiliser Docker.
  • Les images sont construites à partir de couches, où chaque couche est une image intermédiaire, et les modifications apportées à une couche inférieure nécessitent la reconstruction de cette couche et de toutes les couches supérieures. Pour optimiser les builds, les couches qui changent souvent, comme le code de l’application, doivent être placées le plus haut possible dans la pile.
  • Les deux principales méthodes pour créer une image Docker sont la méthode interactive (la plus rapide pour les tests, mais difficile à gérer sur le long terme) et la méthode via Dockerfile (plus systématique, flexible et adaptée aux déploiements en production de niveau entreprise).
  • Dans une optique de bonnes pratiques, il convient d’utiliser les builds multiétapes pour isoler les dépendances de build de l’image d’exécution, plus légère. Vous réduisez ainsi la taille finale et diminuez les risques de sécurité.
  • Les registres de conteneurs (comme Docker Hub ou JFrog Container Registry) sont des catalogues d’emplacements de stockage (dépôts) où les images sont stockées et partagées, chaque dépôt contenant des images apparentées référencées par différentes étiquettes pour représenter les versions.

Aperçu

Dans cette introduction aux images Docker, nous vous présenterons non seulement les bases des images Docker, mais nous vous montrerons également où trouver des images prêtes à l’emploi qui vous donneront une longueur d’avance dans la création de vos propres applications, outils et services conteneurisés.

En tant que nouvel utilisateur de Docker, vous devrez également comprendre comment créer vos propres images personnalisées. Nous verrons donc brièvement comment créer des images Docker pour déployer votre code et assembler des services basés sur des conteneurs. Mais d’abord, couvrons les bases et examinons en détail la composition d’une image Docker.

Qu’est-ce qu’une image Docker ?

Une image Docker est un modèle en lecture seule contenant un ensemble d’instructions pour créer un conteneur qui peut fonctionner sur la plateforme Docker. Elle offre un moyen pratique de regrouper des applications et des environnements de serveur préconfigurés, que vous pouvez utiliser pour votre usage privé ou partager publiquement avec d’autres utilisateurs de Docker. Les images Docker sont également le point de départ pour toute personne utilisant Docker pour la première fois.

Composition d’une image Docker

Une image Docker est constituée d’une collection de fichiers qui regroupent tous les éléments essentiels (tels que les installations, le code d’application et les dépendances) nécessaires à la configuration d’un environnement de conteneur entièrement opérationnel. Vous pouvez créer une image Docker en utilisant l’une des deux méthodes suivantes :

  • Méthode interactive : en exécutant un conteneur à partir d’une image Docker existante, en modifiant manuellement l’environnement du conteneur par le biais d’une série d’étapes en direct et en sauvegardant le résultat final sous la forme d’une nouvelle image.
  • Méthode Dockerfile : en construisant un fichier en texte clair, connu sous le nom de Dockerfile, qui fournit les spécifications pour la création d’un Docker

Nous aborderons ces deux méthodes plus en détail dans la suite de ce guide. Pour l’instant, concentrons-nous sur les concepts les plus importants des images Docker.

Docker Layers

Chacun des fichiers qui composent une image Docker est appelé couche (en anglais, layer). Ces couches forment une série d’images intermédiaires, construites les unes sur les autres par étapes, où chaque couche dépend de la couche immédiatement inférieure. La hiérarchie de vos couches est essentielle pour une gestion efficace du cycle de vie de vos images Docker. Vous devez donc placer les couches qui changent le plus souvent le plus haut possible dans la pile. En effet, lorsque vous apportez des modifications à une couche de votre image, Docker reconstruit non seulement cette couche particulière, mais également toutes les couches construites à partir de celle-ci. Par conséquent, la modification d’une couche au sommet d’une pile implique le moins de travail de calcul pour reconstruire l’image entière.

Container Layer

Chaque fois que Docker lance un conteneur à partir d’une image, il ajoute une fine couche inscriptible, appelée container layer (couche de conteneur), qui stocke toutes les modifications apportées au conteneur pendant sa durée d’exécution. Comme cette couche est la seule différence entre un conteneur opérationnel et l’image Docker source elle-même, n’importe quel nombre de conteneurs similaires peut potentiellement partager l’accès à la même image sous-jacente tout en conservant leur propre état individuel.

Image parent

Dans la plupart des cas, la première couche d’une image Docker est appelée « image parent » (en anglais, parent image). C’est la pierre angulaire sur laquelle toutes les autres couches sont construites et qui fournit les éléments de base de vos environnements de conteneurs. Vous pouvez trouver une grande variété d’images prêtes à l’emploi à utiliser comme image parent sur le registre public de conteneurs, Docker Hub.

 

Vous pouvez également les trouver sur un petit nombre de services tiers, tels que le Google Container Registry. Vous pouvez également utiliser l’une de vos images existantes comme base pour en créer de nouvelles. Une image parent typique peut être une distribution Linux allégée ou être accompagnée d’un service préinstallé, tel qu’un système de gestion de base de données (SGBD) ou un système de gestion de contenu (SGC).

Image de base

En termes simples, une image de base (en anglais, Base Image) est une première couche vide, qui vous permet de construire vos images Docker à partir de zéro. Les images de base vous donnent un contrôle total sur le contenu des images, mais sont généralement destinées aux utilisateurs de Docker plus avancés.

Manifeste Docker

Outre un ensemble de fichiers de couche individuels, une image Docker comprend également un fichier supplémentaire appelé manifeste. Il s’agit essentiellement d’une description de l’image au format JSON qui comprend des informations telles que les balises de l’image, une signature numérique et des détails sur la manière de configurer le conteneur pour différents types de plateformes hôtes.

Qu’est-ce qu’un registre de conteneurs ou un dépôt de conteneurs ?

Bien que les termes « registre » (en anglais, registry) et « dépôt » (repository) soient souvent utilisés de manière interchangeable, ils représentent deux concepts distincts et hiérarchiques dans l’écosystème de stockage et de partage d’images Docker : le service global et l’emplacement spécifique pour les versions d’images.

Registres de conteneurs

Les registres de conteneurs sont des catalogues d’emplacements de stockage, connus sous le nom de dépôts, dans lesquels vous pouvez charger (push) et télécharger (pull) des images de conteneurs. Les trois principaux types de registres sont les suivants :

  1. Docker Hub : la ressource d’images officielle de Docker où vous pouvez accéder à plus de 100 000 images de conteneurs partagées par des fournisseurs de logiciels, des projets open source et la communauté d’utilisateurs de Docker. Vous pouvez également utiliser le service pour héberger et gérer vos propres images privées.
  2. Services de registre tiers : des offres entièrement gérées qui servent de point d’accès central à vos propres images de conteneurs et vous permettent de les stocker, de les gérer et de les sécuriser sans avoir à gérer votre propre registre sur site. Parmi les exemples de registres tiers prenant en charge les images Docker, citons Red Hat Quay, Amazon ECR, Azure Container Registry, Google Container Registry et le JFrog Container Registry.
  3. Registres autohébergés : modèle de registre privilégié par les organisations qui préfèrent héberger les images de conteneurs sur leur propre infrastructure sur site ; généralement pour des raisons de sécurité, de conformité ou de réduction des temps de latence. Pour exécuter votre propre registre autohébergé, vous devez déployer un serveur de registre. Vous pouvez également créer votre propre Registre Docker privé, virtuel et avec accès à distance.

Dépôts de conteneurs

Les dépôts de conteneurs sont les emplacements physiques spécifiques où vos images Docker sont effectivement stockées, chaque dépôt comprenant une collection d’images apparentées portant le même nom. Chacune des images d’un dépôt est référencée individuellement par une balise différente et représente une version différente du même déploiement de conteneurs. Par exemple, sur Docker Hub, mysql est le nom du dépôt qui contient différentes versions de l’image Docker pour le populaire SGBD open source MySQL.

Sécurité, gouvernance et confiance dans les dépôts agentiques

La nature autonome des dépôts agentiques introduit de nouveaux défis en matière de sécurité et de gouvernance qui nécessitent une gestion prudente. Étant donné que les agents d’IA peuvent exécuter du code et prendre des décisions, il est primordial de s’assurer que leurs actions sont sécurisées, vérifiables et conformes aux politiques de l’organisation.

Relever les défis en matière de sécurité

Parce que les dépôts agentiques peuvent interagir de manière autonome avec la chaîne d’approvisionnement logicielle, ils font émerger de nouvelles considérations en matière de Sécurité applicative (AppSec). L’un des principaux défis consiste à se prémunir contre les attaques par injection d’invite, où un acteur malveillant fournit une invite en langage naturel qui manipule le comportement d’un agent. Une autre préoccupation est la possibilité pour les agents d’introduire des vulnérabilités ou des dépendances non conformes sans surveillance appropriée. Pour atténuer ces risques, les dépôts agentiques doivent mettre en œuvre des dispositifs de sécurité robustes tels que :

  • Des architectures de confiance zéro : veiller à ce que toutes les actions des agents soient vérifiées et authentifiées, quelle que soit leur origine.
  • L’IA explicable (XAI) : fournir des explications claires et lisibles par l’homme pour chaque décision prise par un agent, ce qui permet l’audit et le débogage.
  • Garde-fous automatisés : appliquer des politiques strictes qui empêchent les agents d’effectuer des actions non autorisées, telles que l’introduction de vulnérabilités connues ou l’accès à des données sensibles sans autorisation.

Le rôle de la gouvernance et de la confiance

Les cadres de gouvernance pour les dépôts agentiques vont au-delà des contrôles techniques et incluent des politiques qui définissent le champ d’action et l’autorité des agents d’IA. L’établissement de la confiance passe par la transparence et la responsabilité. Les organisations doivent créer des cadres clairs qui définissent les niveaux d’autonomie des agents, leurs droits d’utilisation des données et leurs responsabilités en matière de prise de décision. Ce faisant, elles peuvent s’assurer qu’au fur et à mesure que les agents d’IA s’intègrent plus profondément dans les opérations d’une entreprise, cette dernière peut gérer les risques en toute confiance et maintenir le contrôle. L’objectif est de considérer la gouvernance non pas comme un obstacle, mais comme un catalyseur fondamental qui renforce la confiance des parties prenantes et permet l’adoption sûre et évolutive de l’IA agentique.

Comment les dépôts agentiques améliorent la sécurité, la gouvernance et la confiance

Si l’IA agentique s’accompagne d’un ensemble de considérations en matière de sécurité et de gouvernance, il convient également de noter que l’utilisation appropriée des dépôts agentiques peut servir à améliorer la posture de sécurité et la conformité d’une organisation.

Sécurité : grâce à une automatisation intelligente, les dépôts agentiques offrent une approche proactive de la sécurité et de la conformité. Ils peuvent surveiller et analyser en permanence la chaîne d’approvisionnement logicielle pour détecter les vulnérabilités et les violations des politiques, ce qui permet d’atteindre un niveau de diligence supérieur à celui des contrôles manuels. Pour ce faire, des outils d’analyse de la sécurité sont intégrés directement dans les workflows des agents, ce qui permet de s’assurer que chaque artefact est vérifié avant d’être utilisé.

Gouvernance : la capacité des agents à fournir des explications claires et vérifiables de leurs actions grâce à l’IA explicable est également cruciale, car elle renforce la transparence et la confiance, permettant aux équipes de vérifier les décisions et de maintenir la conformité avec les politiques de gouvernance.

Comment créer une image Docker

Dans cette dernière section, nous aborderons les deux méthodes différentes de création d’images Docker de manière un peu plus détaillée, afin que vous puissiez commencer à mettre vos connaissances en pratique.

Méthode interactive

Avantages : la façon la plus rapide et la plus simple de créer des images Docker. Idéal pour tester, dépanner, déterminer les dépendances et valider les processus.

Inconvénients : gestion difficile du cycle de vie, nécessitant une reconfiguration manuelle, sujette aux erreurs, des processus interactifs en cours. Il est plus facile de créer des images non optimisées avec des couches inutiles.

Vous trouverez ci-dessous une série d’étapes simplifiées pour créer une image de manière interactive :

  • Installez Docker et lancez le moteur Docker
  • Ouvrez une session de terminal
  • Utilisez la commande Docker run suivante pour démarrer une session shell interactive avec un conteneur lancé à partir de l’image spécifiée par image_name:tag_name :

$ docker run -it image_name:tag_name bash

Si vous omettez le nom de la balise, Docker extrait automatiquement la version la plus récente de l’image, identifiée par la dernière balise. Si Docker ne trouve pas l’image localement, il récupérera ce dont il a besoin pour construire le conteneur à partir du dépôt approprié sur Docker Hub.

Dans notre exemple, nous lancerons un environnement de conteneurs basé sur la dernière version d’Ubuntu :

$ docker run -it ubuntu bash

  • Configurez maintenant votre environnement de conteneurs en installant, par exemple, tous les cadres, dépendances, bibliothèques, mises à jour et code d’application dont vous avez besoin. L’exemple simple suivant ajoute un serveur NGINX :

# apt-get update && apt-get install -y nginx

Ensuite, vous devez connaître le nom ou l’identifiant de votre instance de conteneur en cours d’exécution.

  • Ouvrez un autre Bash shell et tapez la commande docker ps suivante pour lister les processus de conteneurs actifs :

$ docker ps

L’exemple de sortie ci-dessous montre notre conteneur en cours d’exécution avec l’ID e61e8081866d et le nom keen_gauss :

CONTAINER ID    IMAGE    COMMAND    CREATED          STATUS        PORTS    NAMES
e61e8081866d       ubuntu      “bash”         2 minutes ago     Up 2 minutes         keen_gauss

Ce nom est généré aléatoirement par le Docker daemon. Mais vous pouvez également donner un nom plus significatif à votre conteneur en lui attribuant votre propre nom à l’aide de name operator dans la commande Docker run.

  • Sauvegardez votre image à l’aide de la commande Docker commit, en spécifiant l’ID ou le nom du conteneur à partir duquel vous voulez la créer :

$ docker commit keen_gauss ubuntu_testbed

Dans l’exemple ci-dessus, nous avons fourni le nom de notre conteneur et appelé l’image résultante ubuntu_testbed.

  • Maintenant, utilisez la commande Docker images pour voir l’image que vous venez de créer :

$ docker images

Vous devriez voir votre nouvelle image apparaître dans les résultats.

REPOSITORY     TAG        IMAGE ID          CREATED            SIZE
ubuntu                 latest      775349758637    5 minutes ago      64.2MB

  • Enfin, revenez à votre shell de conteneur interactif et saisissez exit pour l’arrêter.

# exit

Méthode Dockerfile

Avantages : des images propres, compactes et reproductibles basées sur des recettes. Gestion plus facile du cycle de vie et intégration plus aisée dans les processus d’intégration continue (CI) et de livraison continue (CD). Déroulement clair et auto-explicatif des étapes de travail jusqu’à la création de l’image.

Inconvénients : plus difficile pour les débutants et plus long à créer à partir de zéro.

L’approche Dockerfile est la méthode de choix pour les déploiements de conteneurs dans le monde réel, au niveau de l’entreprise. C’est une façon plus systématique, plus flexible et plus efficace de construire des images Docker et la clé pour créer des environnements de conteneurs compacts, fiables et sécurisés.

En résumé, la méthode Dockerfile est un processus en trois étapes au cours duquel vous créez le fichier Docker et ajoutez les commandes dont vous avez besoin pour assembler l’image.

Le tableau suivant vous indique les instructions Dockerfile les plus susceptibles d’être utilisées :

Commande

Objectif

FROM 

Permet de spécifier l’image parent.

WORKDIR

Permet de définir le répertoire de travail pour toutes les commandes qui suivent dans le fichier Docker.

RUN

Permet d’installer les applications et les packages nécessaires à votre conteneur.

COPY

Permet de copier des fichiers ou des répertoires à partir d’un emplacement spécifique.

ADD

Comme COPY, mais également capable de gérer des URL à distance et de décompresser des fichiers compressés.

ENTRYPOINT

Commande qui sera toujours exécutée au démarrage du conteneur. Si elle n’est pas spécifiée, la valeur par défaut est /bin/sh -c

CMD

Arguments transmis au point d’entrée. Si ENTRYPOINT n’est pas défini (la valeur par défaut est /bin/sh -c), CMD correspondra aux commandes exécutées par le conteneur.

EXPOSE

Permet de définir le port par lequel vous pouvez accéder à votre application conteneurisée.

LABEL Permet d’ajouter des métadonnées à l’image.

 

Example Dockerfile

# Use the official Ubuntu 18.04 as base
FROM ubuntu:18.04
# Install nginx and curl
RUN apt-get update &&
apt-get upgrade -y &&
apt-get install -y nginx curl &&
rm -rf /var/lib/apt/lists/*

Un exemple de Dockerfile pour construire une image basée sur la version officielle d’Ubuntu 18.04 avec l’installation de Nginx

Nous allons maintenant mettre en place un fichier .dockerignore pour répertorier tous les fichiers qui seraient autrement créés pendant le processus de build de Docker et que vous souhaitez exclure du build final.

Les fichiers .dockerignore jouent un rôle important dans la création de conteneurs plus compacts et plus rapides en fournissant un moyen d’empêcher les fichiers et répertoires sensibles ou inutiles de se frayer un chemin dans vos builds d’images. Votre fichier .dockerignore doit être situé dans le répertoire racine, connu sous le nom de contexte de build, à partir duquel vous avez l’intention de construire votre image. Il s’agit soit de votre répertoire de travail actuel, soit du chemin que vous avez spécifié dans la commande Docker build dont nous parlerons plus loin.

Le contexte Docker Build

Utilisez maintenant la commande Docker build pour créer votre image Docker. Utilisez l’option -t flag pour définir un nom d’image et une balise :

$ docker build -t my-nginx:0.1 .

Dans l’exemple ci-dessus, nous avons construit l’image à partir du même répertoire que le Dockerfile et le contexte, car l’argument indique simplement au Docker daemon de construire l’image à partir des fichiers et des dossiers du répertoire de travail actuel.

Enfin, comme nous l’avons vu dans la méthode interactive, vous pouvez utiliser la commande Docker images pour afficher l’image que vous venez de créer.

$ docker images

REPOSITORY     TAG IMAGE ID        CREATED SIZE

my-nginx       0.1 f95ae2e1344b    10 seconds ago 138MB

ubuntu         18.04 ccc6e87d482b  12 days ago 64.2MB

Encore une fois, vous devriez voir votre nouvelle image apparaître dans les résultats.

Explorer les bonnes pratiques en matière d’images Docker

Construire des images Docker ne consiste pas seulement à faire fonctionner une image : il s’agit de créer des images efficaces, sécurisées et faciles à maintenir qui fonctionnent bien en production. Quelques bonnes pratiques peuvent faire une grande différence :

  • Optimiser la superposition des couches d’images
    Placez les composants qui changent fréquemment, tels que le code d’application, aussi haut que possible dans la pile de couches. Cela réduit le temps de rebuild lorsque seuls des changements mineurs sont effectués. Les couches inférieures sont réservées aux dépendances stables telles que les packages de systèmes d’exploitation ou les frameworks.
  • Exploiter le build cache pour accélérer les builds
    Docker met en cache les couches qui n’ont pas été modifiées entre les versions. En ordonnant soigneusement les instructions de votre Dockerfile (par exemple en installant les dépendances avant de copier le code de l’application), vous maximisez la réutilisation du cache et limitez les rebuilds inutiles.
  • Mettre en œuvre des builds multiétapes pour des images efficaces
    Grâce aux builds multiétapes, il est possible de dissocier les dépendances de build des dépendances runtime. Par exemple, une étape peut servir à compiler l’application, tandis qu’une autre, allégée, est dédiée à son exécution. Cela permet de réduire la taille de l’image finale et d’éliminer les fichiers sensibles ou inutiles des conteneurs de production.

Le respect de ces bonnes pratiques garantit des builds plus rapides, des images plus petites et moins de risques pour la sécurité, tout en améliorant la productivité des développeurs.

Prochaines étapes et pistes pour aller plus loin

Une fois que vous êtes à l’aise avec la création d’images Docker, vous pouvez commencer à explorer des techniques et des intégrations avancées :

  • Approfondissez vos connaissances sur les images Docker
    La documentation Docker couvre la syntaxe avancée Dockerfile, l’analyse automatisée des images et les pipelines de build reproductibles qui vont au-delà des principes de base.
  • Explorez les techniques avancées de construction d’images
    Pour sécuriser davantage votre supply chain de conteneurs, pensez à activer content trust pour les images signées, à adopter des builds reproductibles via les digests et à automatiser vos workflows avec des outils CI/CD.
  • Intégrer JFrog pour une gestion transparente
    JFrog Artifactory et le JFrog Container Registry offrent des fonctionnalités de niveau professionnel pour le stockage, la gestion des versions et la promotion des images Docker. Grâce à l’analyse intégrée des vulnérabilités, aux métadonnées de build et aux connexions au pipeline CI/CD, les produits JFrog aident les équipes à gérer les images de conteneurs en toute sécurité et à grande échelle.

En appliquant les bonnes pratiques et en élargissant votre boîte à outils, vous serez en mesure de gérer les images Docker non seulement comme des artefacts de code, mais aussi dans le cadre d’un flux de développement sécurisé, automatisé et prêt pour un usage en entrepris

Gérer les images Docker avec JFrog

La maîtrise des principes fondamentaux des images Docker pose les bases de la création d’applications conteneurisées efficaces, sécurisées et évolutives. Que vous expérimentiez des builds interactifs ou que vous exploitiez les fichiers Docker pour des workflows prêts pour la production, le respect des bonnes pratiques garantit que vos images sont optimisées en termes de performances et de sécurité.

Pour aller plus loin dans votre stratégie de conteneurs, la plateforme de chaîne d’approvisionnement logicielle de JFrog offre des solutions de niveau entreprise pour stocker, gérer et sécuriser vos images Docker à grande échelle — intégrées à vos pipelines CI/CD et enrichies par l’analyse de vulnérabilités et des insights de métadonnées. Avec JFrog, vos images de conteneurs ne sont pas de simples artefacts ; elles font partie d’une chaîne d’approvisionnement logicielle automatisée et fiable.

Pour plus d’informations, veuillez consulter notre site web, organisez une visite virtuelle ou organisez une démonstration individuelle à votre convenance.

Artifact-State-of-Union-2025_Cover

L’état de la chaîne d’approvisionnement logicielle en 2024

Nous avons combiné les réponses de 1200 professionnels de la sécurité, du développement et des opérations informatiques pour comprendre l’état actuel de la sécurité de la chaîne d’approvisionnement logicielle.

Télécharger maintenant

Release Fast Or Die