Skip to content

Les images Docker

Qu'est-ce qu'une image ?

Une image docker est une sorte de template destiné à être instancié et qui contient une application accompagnée de l'ensemble de ses dépendances logicielles.

Elle se veut portable sur n'importe quel environnement où tourne Docker.

Elle est composée d'un ou plusieurs layers, chacun contenant un système de fichiers et des metadatas. Les images sont ensuite distribuées via le registry de Docker.

L'union Filesystem

Une image est un ensemble de couches (layers) accessibles en lecture seule qui composent le système de fichiers final. Lors du démarrage du container, celui-ci ajoute un layer en lecture-écriture lié au container qui n'affecte pas les couches précédents.

Par défaut les layers sont stockés dans /var/lib/docker

Aufs FileSystem

Aufs mechanism

Dockerfile

Un Dockerfile est un fichier texte qui contient une série d'instructions pour construire le système de fichiers d'une image.

Le workflow standard consiste à :

  • Spécifier l'image de base
  • Ajouter les dépendances
  • Ajouter du code applicatif
  • Définir la commande de démarrage
  • Builder l'image à l'aide de docker image build

Voici un exemple de Dockerfile

shell
#Image de base
FROM node:alpine

# Crée l'arborescence
RUN mkdir /app

# Définition du répertoire de travail
WORKDIR /app

# Copie la liste des dépendances dans le workdir
COPY package.json .

# Installation des dépendances
npm 

# Expose le port 80
EXPOSE 80

# Commande exécutée au démarrage du container
CMD ["npm", "start"]

Principales instructions

InstructionDescription
ADD / COPYCopie une ressource à partir de la machine hôte vers le filesystem de l'image
ENVDéfinit une variable d'environnement
EXPOSEExpose un port de l'application
`FROMDéfinit l'iamge de base utilisée pour la construction de l'image
HEALTHCHECKVérifie l'état de santé du container
RUNExécute une commande au sein de l'image
USERDéfinit l'utilisateur exécutant une instruction au sein du container
VOLUMEDéfinit un volume la gestion des données

L'ensemble des commandes est disponible sur la documentation de docker https://docs.docker.com/engine/reference/builder/.

  • ADD / COPY Les instructions ADD et COPY ont le même objectif : copier des fichiers et répertoires dans le système de fichiers de l'image. Toutes deux engendre la création d'un nouveau layer. Contrairement à COPY, l'instruction ADD permet de spécifier une url pour la source, tel qu'uun fichier tar.gz.

  • ENV Elle définit les variables d'environnement. Elle pourra être utilisée dans les instructions suivantes du build. Enfin elle sera accessible dans l'environnement des containers créés à partir de cette image.

  • EXPOSE Cette instruction informe sur les ports utilisés par l'application, que l'on peut redéfinir via le flag -p au démarrage du container

  • FROM L'instruction est la première présente dans un Dockerfile. Elle sert à spécifier l'image à partir de laquelle l'image sera construite

  • HEALTHCHECK Souvent oubliée, elle permet de vérifier l'état de santé du container. Son usage fait parti des bests practices, étant donné qu'elle permettra à un orchestrateur de redémarrer un service en mauvais état

  • RUN Elle permet d'exécuter une commande dans un nouveau layer. Elle permet par exemple l'installation d'un package.

  • USER L'option USER permet de définir l'utilisateur qui exécutera une instruction lors de la création de l'image ou à l'intérieur du container.

  • VOLUME L'instruction a pour objectif de définir un répertoire dont les données seront découplées du cycle de vie du container, ce qui signifique qu'en cas de suppression du container, les données seront persistées.