Construire et déployer une application Flask à l’aide de Docker

-

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 fichier requirements.txt et son contenu (les paquets générés et les dépendances) dans le dossier app 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 fichier requirements.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ètre EntryPoint 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 commande python 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://.herokuapp.com/

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 !

Alfred
Alfredhttps://www.alfreddagenais.com
Salut ! Moi, c'est Alfred, développeur dans l’âme et explorateur de l'infini Web. Je suis constamment à la recherche de nouvelles idées et je pense que le développement web et l'informatique ont le pouvoir de transformer le monde. Je suis un grand admirateur de l'expérimentation, parce que c'est souvent de là que naissent les idées les plus créatives. Je suis convaincu que l'humour est un ingrédient clé de la vie, alors j'essaie toujours de glisser une blague ou deux dans mon code (pas toujours facile à comprendre, mais c'est le risque à prendre). En dehors de la programmation, j'aime passer du temps avec ma famille et mes amis, découvrir de nouveaux endroits et cuisiner des plats délicieux (du moins, j'essaie). Si vous voulez discuter de développement web, d'innovation, ou tout simplement échanger des blagues, n'hésitez pas à me contacter. Je suis toujours partant pour une bonne conversation !

Share this article

Recent posts

Popular categories

LAISSER UN COMMENTAIRE

S'il vous plaît entrez votre commentaire!
S'il vous plaît entrez votre nom ici

Recent comments