Si vous avez déjà construit une application Web avec Python, il y a de fortes chances que vous ayez utilisé un framework pour y parvenir, l’un d’entre eux pouvant être Flask. Flask est un framework web open source, convivial pour les débutants, construits sur le langage de programmation Python. Flask convient lorsque vous souhaitez développer rapidement une application avec une base de code légère.
Docker est un outil open source qui vous permet de conteneuriser vos applications. Il facilite la création, le test, le déploiement et la gestion de vos applications dans un environnement isolé. Dans cet article, nous l’utiliserons pour tout faire, sauf tester.
Prérequis
- Python ≥ v3.8 installé sur votre machine.
- Connaissance pratique de la construction d’applications à l’aide de Flask et de Python.
- Au moins 4 Go de RAM sur votre machine pour permettre la compatibilité avec Docker.
- Connaissance de niveau intermédiaire des CLIs
- Tout IDE ou éditeur de texte approprié
Écrire des fichiers d’exigences Python avec Docker
Si vous avez déjà exploré un projet Python publié, vous avez peut-être remarqué un fichier requirement.txt
. Ce fichier contient la liste des paquets et des dépendances dont vous avez besoin pour exécuter votre projet, ainsi que leurs versions respectives.
Vous pouvez également installer les paquets contenus dans ce fichier dans un autre projet en copiant le fichier requirements.txt dans votre projet souhaité et en exécutant la commande suivante :
pip install -r requirements.txt
L’avantage de cette méthode est que vous n’avez pas à exécuter plusieurs fois la commande pip install
pour chaque paquet.
Votre fichier requirements.txt
doit contenir au moins le contenu suivant :
click==8.0.3
colorama==0.4.4
Flask==2.0.2
itsdangerous==2.0.1
Jinja2==3.0.3
MarkupSafe==2.0.1
Werkzeug==2.0.2
gunicorn==20.1.0
Les numéros de version générés dans le fichier d’exigences peuvent être différents de ce qui est écrit ici car, encore une fois, cela dépend du type d’application que vous construisez et des versions des paquets que vous avez installés lors de la construction de votre application.
L’avantage de la conteneurisation avec Docker est que vous pouvez empaqueter votre application avec toutes les dépendances d’exécution nécessaires pour qu’elle soit autosuffisante. Par conséquent, votre application s’exécute sans que vous ayez à vous soucier des incompatibilités avec son environnement hôte.
Création de l’application Flask
Procédons à la création d’une application Flask simple qui rend un message sur le navigateur. Créez un dossier avec le nom par exemple flask_docker
pour contenir votre application.
Après avoir installé les paquets avec succès, l’étape suivante consiste à créer un fichier Python qui reçoit et répond aux demandes dans notre application. Créez un fichier view.py qui contiendra l’extrait de code Python ci-dessous :
from flask import Flask, render_template import os app = Flask(__name__) @app.route('/') def home(): return render_template('index.html') if __name__ == "__main__": port = int(os.environ.get('PORT', 5066)) app.run(debug=True, host='0.0.0.0', port=port)
Dans l’extrait de code ci-dessus, l’annotation @app.route
sert à diriger la requête vers une URL mappée. Dans ce cas, l’URL fournie est /
, qui représente la page d’accueil.
Cette annotation possède également un paramètre method
qui prend une liste de méthodes HTTP pour spécifier la méthode autorisée pour l’URL fournie. Par défaut (comme illustré), la méthode GET
est la seule méthode HTTP autorisée.
Voici un exemple de la façon dont vous pouvez spécifier que votre itinéraire doit autoriser les méthodes HTTP GET
et POST
:
@app.route('/', methods=['POST', 'GET'])
La fonction home()
lié à l’URL fournie dans l’annotation @app.route
sera exécutée lorsque vous enverrez une requête GET
à cette route. La fonction renvoie un appel à render_template
qui, à son tour, rend le contenu du fichier index.html
, que nous allons créer dans la section suivante.
port = int(os.environ.get('PORT', 5066)) app.run(debug=True, host='0.0.0.0', port=port)
La partie ci-dessus du fichier view.py
est nécessaire lorsque nous déployons cette application sur Heroku, ce que nous allons démontrer dans la section suivante. Si vous ne l’incluez pas, votre application se plantera sur Heroku.
Le modèle HTML
L’étape suivante consiste à créer le fichier index.html
et à fournir le contenu que nous voulons rendre sur le navigateur lorsque vous invoquez la fonction home()
dans le fichier view.py
.
Dans le répertoire racine, créez un répertoire templates
, puis créez le fichier index.html
. Ajoutez l’extrait de code ci-dessous au fichier HTML :
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Flask avec Docker</title> </head> <body> <h1>Il s'agit d'une application Flask conteneurisée avec Docker.</h1> </body> </html>
Configuration du fichier Docker
Si Docker n’est pas installé sur votre machine, vous pouvez suivre ces instructions pour commencer.
Créez un fichier et nommez-le Dockerfile
. Ajoutez l’extrait de code suivant au fichier :
# start by pulling the python image FROM python:3.8-alpine # copy the requirements file into the image COPY ./requirements.txt /app/requirements.txt # switch working directory WORKDIR /app # install the dependencies and packages in the requirements file RUN pip install -r requirements.txt # copy every content from the local file to the image COPY . /app # configure the container to run in an executed manner ENTRYPOINT [ "python" ] CMD ["view.py" ]
Passons en revue les instructions de ce Dockerfile :
FROM python:3.8-alpine :
Puisque Docker nous permet d’hériter d’images existantes, nous installons une image Python et l’installons dans notre image Docker.Alpine
est une distribution Linux légère qui servira de système d’exploitation sur lequel nous installerons notre image.COPY ./requirements.txt /app/requirements.txt
: Ici, nous copions le fichierrequirements.txt
et son contenu (les paquets générés et les dépendances) dans le dossierapp
de l’image.WORKDIR /app
: Nous définissons le répertoire de travail comme/app
, qui sera le répertoire racine de notre application dans le conteneur.RUN pip install -r requirements.txt
: Cette commande installe toutes les dépendances définies dans le fichierrequirements.txt
dans notre application au sein du conteneur.COPY . /app
: Cette commande copie tous les autres fichiers et leurs contenus respectifs dans le dossier app qui est le répertoire racine de notre application dans le conteneur.ENTRYPOINT [ "python" ]
: Il s’agit de la commande qui exécute l’application dans le conteneur.CMD [ "view.py" ]
: Enfin, cela ajoute la liste des paramètres au paramètreEntryPoint
pour exécuter la commande qui exécute l’application. Cette procédure est similaire à celle utilisée pour exécuter l’application Python sur votre terminal à l’aide de la commandepython view.py
.
Construire l’image Docker
Procédons à la construction de l’image avec la commande ci-dessous :
docker image build -t flask_docker .
Exécuter le conteneur
Après avoir réussi à construire l’image, l’étape suivante consiste à exécuter une instance de l’image. Voici comment effectuer cette opération :
docker run -p 5066:5066 -d flask_docker
Cette commande exécute le conteneur et son application intégrée, chacun sur le port 5066
en utilisant une approche de liaison de port. Le premier 5066 est le port que nous allouons au conteneur sur notre machine. Le second 5066 est le port sur lequel l’application sera exécutée sur le conteneur.
Voici la sortie de notre application lorsque nous envoyons une requête à http://localhost:5066
sur notre navigateur :
Déploiement de notre application Flask vers Docker Hub
Docker Registry, également connu sous le nom de Docker Hub, est une communauté de dépôts où les utilisateurs de Docker créent, testent et gèrent des conteneurs. Si vous avez travaillé avec GitHub, cette section vous sera très familière.
Suivez la séquence d’étapes suivantes pour déployer l’image que nous avons construite sur Docker Hub afin de pouvoir y accéder partout.
Étape 1 : Créer un référentiel sur le Docker Hub
Si vous n’avez pas encore de compte, procédez à l’inscription sur Docker Hub. Après avoir réussi à créer un compte, connectez-vous et cliquez sur l’onglet Dépôts dans la barre de navigation.
Suivez les étapes de la page et créez un nouveau dépôt nommé flask-docker
.
Étape 2 : Se connecter sur votre machine locale
L’étape suivante consiste à se connecter sur votre machine locale pour créer une connexion entre votre machine et Docker Hub.
docker login
Étape 3 : Renommer l’image Docker
Lorsque vous envoyez une image vers Docker Hub, il existe un format standard que le nom de votre image doit suivre. Ce format est spécifié comme suit :
Voici la commande pour renommer l’image :
docker tag flask_docker <votre-docker-hub-username>/flask-docker
Étape 4 : pousser vers Docker Hub
L’étape finale consiste à pousser l’image vers Docker Hub en utilisant la commande suivante :
docker push <votre nom d'utilisateur sur le hub Docker>/flask-docker
Voici ce que vous devriez voir après un déploiement réussi :
Déploiement de notre application sur Heroku
Heroku est une plateforme de cloud computing où les développeurs peuvent créer et exécuter des applications dans le cloud. Si vous n’avez pas encore de compte chez Heroku, vous pouvez en créer un ici.
Procédons au déploiement de notre application conteneurisée sur Heroku en suivant les étapes suivantes :
Étape 1 : Connectez-vous à Heroku
heroku login
Si vous ne vous êtes pas encore connecté à votre compte Docker Hub, vous devrez le faire pour continuer.
docker login --username=<your-username> --password=<your-password>
Étape 2 : Créer une application Heroku
heroku create <nom de l'application>
Étape 3 : Créer un Procfile
Un Procfile
contient les commandes que votre application exécute sur Heroku au démarrage.
Créez un fichier et nommez-le Procfile sans extension. Ajoutez ensuite ce qui suit au fichier :
web : gunicorn app:app
Étape 4 : Pousser l’application vers Heroku
heroku container:push web --app <nom de l'application>
Étape 4b : Erreur docker push exited with Error: 1
Si jamais vous avez une erreur par exemple : no basic auth credentials
▸ Error: docker push exited with Error: 1
Il faut se connecter dans le registre Docker avant de le pousser. Voici la commande :
heroku container:login
Étape 5 : Release de l’image
heroku container:release web --app <nom de l'application>
Vous pouvez maintenant procéder à la visualisation de votre application sur Heroku avec l’URL :
https://
Conclusion
Dans ce tutoriel, nous avons construit une application Flask simple et l’avons conteneurisée avec Docker. Nous avons également déployé l’application créée et poussé l’image vers Docker Hub ainsi que l’application conteneurisée vers Heroku. Tout comme nous l’avons démontré avec une application Flask, vous pouvez également explorer comment conteneuriser d’autres applications ici. Ce projet est disponible sur mon repo GitHub pour plus d’informations.
Pour plus d’informations sur l’intégration de Docker à votre application, la documentation de Docker est une ressource utile avec laquelle vous pouvez commencer.
Si vous souhaitez également développer vos compétences dans le framework Python Flask, voici la documentation du framework Flask qui peut vous guider.
À la vôtre !