Construire ses propres images

MéthodeImages personnalisées

Nous l'avons vu, il n'est pas forcément recommandé d'utiliser des images utilisateurs issues du Docker Hub. Il arrive également que l'on souhaite créer une image avec des contraintes particulières :

  • Je veux utiliser une distribution (debian, ubuntu, alpine) particulière

  • Je veux utiliser des variables d'environnement pour configurer mes paramètres

  • Je veux disposer mes fichiers de configuration dans le dossier /configuration

À la manière d'un langage, le Dockerfile est régi par l'utilisation de mots clés. Les plus utilisés sont FROM, RUN, CMD... Ils ont chacun une action particulière et donne en sortie un layer. Nous détaillerons cela par la suite.

Il faut garder en tête que l'ensemble de ces instructions sont ensuite assemblées pour au final représenter l'image Docker.

Méthode

Il est possible de construire une image Docker en lançant un conteneur et en exécutant manuellement dans ce conteneur des commandes comme l'installation d'un paquet ou encore l'édition d'un fichier. Une fois que toutes les modifications ont été apportées, il est possible de sauvegarder le résultat de ce conteneur dans une image en utilisant la commande docker commit

1
~ docker run --name mon-conteneur -it debian:stretch bash
2
root@584bdfe3d445:/# apt-get update && apt-get install -y curl
3
Ign:1 http://cdn-fastly.deb.debian.org/debian stretch InRelease
4
...
5
done.
6
root@584bdfe3d445:/# exit
7
~ docker commit mon-conteneur mon-image
8
sha256:0744ad5f1e7e816474d35d0a680e3421c332489ebf11f21c3ab0ce3779f34f54
9
~ docker images
10
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
11
mon-image           latest              0744ad5f1e7e        4 seconds ago       138MB
12
debian              stretch             de8b49d4b0b3        10 days ago         101MB

Attention

Cette manière de construire des images est difficilement reproductible et automatisable. De fait, on perd le plus grand interêt des conteneurs qui est d'avoir une resource portable mais également reproductible quelque soit l'environnement.

FondamentalDockerfile

Comme meilleure alternative, nous pouvons recourir à une approche automatisée de fabrication des images à l'aide de Dockerfile.

Un Dockerfile est un script de construction à base de texte contenant des instructions spéciales permettant de générer les images correctes et pertinentes à partir des images officielles de base. Les instructions séquentielles contenues dans Dockerfile peuvent inclure la sélection de l'image de base, l'installation de l'application requise, l'ajout de fichiers de configuration ou encore des fichiers de données. D'autres directives permettent à l'utilisateur de lancer l'exécution automatique d'un service ou encore l'exposition de ces services au monde externe.

Ce système de construction automatisé basé sur Dockerfile simplifie considérablement le processus de construction d'image. Il offre également une grande flexibilité dans l'organisation des instructions de construction et dans la visualisation du processus de construction complet.

On peut comparer le Dockerfile à une recette de cuisine. L'étape suivante est la préparation de cette recette en utilisant le processus de construction d'image de Docker.

À l'aide de la commande docker build, le démon Docker va itérer ligne par ligne sur les instructions du Dockerfile et construire l'image petit à petit.

Remarque

De par son format texte, il est très facile d'ajouter le Dockerfile à un outil de versionnement afin d'historiser les changements qui ont pu avoir lieu sur le fichier et revenir en arrière si nécessaire.