Comprendre et construire des images Docker: un guide pour les débutants

Dans cette introduction, 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.

Table of Contents:

Une image Docker, c’est quoi?

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.Graphic showing the Docker containers and other layers that make up a Docker image.

Les conteneurs basés sur la même image partagent cette image, ce qui réduit la surcharge de ressources

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 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.A Docker File build → Docker Image run → Docker Container

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 :

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

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.

Interactive Method

User-added image

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.

User-added image

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.

User-added 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 paquets 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 (entrypoint). 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.

 

Exemple de fichier Docker

# 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 fichier Docker 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 buil 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

Là encore, vous devriez voir votre nouvelle image apparaître dans les résultats.

En savoir plus sur Docker

Docker : Un guide pour les débutants

Alternatives à Docker

3 Essential Steps to Securing Your Docker Container Deployments

Comment configurer un Registre Docker Privé, Distant et Virtue