Le fichier Dockerfile définit ce qui se passe dans à l’intérieur du conteneur comme l’accès aux ressources (interfaces réseau, lecteurs de disque) qui seront virtualisées dans cet environnement isolé du reste du système. Parfois les Dockerfiles font appel à des fichiers annexes pour construire le projet.
Le fichier Dockerfile
Le fichier Dockerfile doit être positionné à la racine de votre projet, ici le répertoire Projet/
.
# Use an official Python runtime as a parent image |
Ce fichier Dockerfile fait référence à quelques fichiers que nous n’avons pas encore créés, à savoir app.py
et Requirements.txt
.
Création de l’API
Nous allons créer les fichiers Requirements.txt
et app.py
dans la racine du projet au même niveau que le Dockerfile.
Lorsque le fichier Dockerfile sera appelé depuis le lancement d’une image les fichiers app.py
et Requirements.txt
sont présents dans le container en raison de la commande COPY
. Le résultat du fichier app.py
est accessible via HTTP grâce à la commande EXPOSE
.
requirements.txt
Flask |
app.py
from flask import Flask |
Nous voyons maintenant que pip install -r requirements.txt
installe les bibliothèques Flask et Redis pour Python et que l’application imprime la variable d’environnement NAME
, ainsi que la sortie d’un appel à socket.gethostname()
. Enfin, étant donné que Redis n’est pas en cours d’exécution (nous n’avons installé que la bibliothèque Python, et non Redis elle-même), nous devons nous attendre à ce que la tentative de l’utiliser ici échoue et génère le message d’erreur.
Remarque : l’accès au nom de l’hôte à l’intérieur d’un conteneur extrait l’ID de conteneur, qui est similaire à l’ID de processus d’un exécutable en cours d’exécution.
Construire l’application app
Création de l’image que nous allons appeler MyImageDock:v0.0.1. à l’aide de l’option –-tag
ou -t
. (Ne pas oublier le point “.” à la fin).
docker build --tag=MyImageDock:v0.0.1. . |
Lister les images précédemment construites :
$ docker image ls // ou $ docker images |
Lancer le projet
Lancer le container en mappant le port 4000 de votre machine sur le port 80 du conteneur à l’aide de -p
:
$ docker run -p 4000:80 MyImageDock:v0.0.1. |
Vous devriez voir un message indiquant que Python sert votre application à l’adresse http://0.0.0.0:80. Mais ce message provient de l’intérieur du conteneur qui ne sait pas que vous avez mappé le port 80 de ce conteneur sur 4000. L’URL correcte est http://localhost:4000.
Accédez à cette URL dans un navigateur Web pour voir le contenu d’affichage diffusé sur une page Web.
Le terminal où est lancé Docker renvoie ceci :
* Serving Flask app "app" (lazy loading) |
Il est également possible d’utiliser la commande curl
:
$ curl http://@ipServ:4000 |
Autre exemple de projet avec Dockerfiles
In a nutshell :
RUN
Exécute la commande et créer une nouvelle image, utilisé par exemple pour installer des packages.CMD
Définit la commande ou les paramètres par défaut.ENTRYPOINT
Configure un container qui peut être lancé comme un exécutable.
Dans un dossier nommé /Projet :
# ls -la Projet/ |
Contenu de Dockerfile :
# |
Lancer le dockerfile dans le dossier courant (ne pas oublier le ‘.’ à la fin) pour créer une image.
# docker build -t test.dockerfile . |
Puis créer et lancer un container à partir de cette image :
# docker run -it --name="dockerfile.container" test.dockerfile /bin/bash |
Documentation
https://docs.docker.com/get-started/part2/
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/)
https://journaldunadminlinux.fr/tuto-docker-demarrer-avec-docker/#comment-3630)
https://www.digitalocean.com/community/tutorials/docker-explained-using-dockerfiles-to-automate-building-of-images
http://goinbigdata.com/docker-run-vs-cmd-vs-entrypoint/