Construire ses propres images
Méthode : Images 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
~ docker run --name mon-conteneur -it debian:stretch bash
root@584bdfe3d445:/# apt-get update && apt-get install -y curl
Ign:1 http://cdn-fastly.deb.debian.org/debian stretch InRelease
...
done.
root@584bdfe3d445:/# exit
~ docker commit mon-conteneur mon-image
sha256:0744ad5f1e7e816474d35d0a680e3421c332489ebf11f21c3ab0ce3779f34f54
~ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mon-image latest 0744ad5f1e7e 4 seconds ago 138MB
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.
Fondamental : Dockerfile
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.