Dockeriser une application Flask en utilisant Docker sur Debian 10

Docker est un outil open-source conçu pour faciliter la création, le déploiement et l’exécution d’applications en utilisant des conteneurs. Un conteneur est un logiciel qui regroupe le code et toutes ses dépendances pour que l’application s’exécute rapidement et de manière fiable d’un environnement informatique à un autre.

Flask est un framework web Python populaire. Il est classé comme un micro-cadre car il ne nécessite pas d’outils ou de bibliothèques particuliers. Par rapport à d’autres frameworks, il est léger et très structuré.

Dans ce tutoriel, nous allons expliquer comment déployer une application Flask avec Docker sur un serveur Debian 10.

Conditions préalables

  • Un serveur fonctionnant sous Debian 10.
  • Un mot de passe root est configuré sur ton serveur.

Démarrage

Avant de commencer, c’est une bonne idée de mettre à jour les paquets de ton système à la dernière version. Tu peux mettre à jour tous les paquets avec la commande suivante :

apt-get update -y
apt-get upgrade -y

Une fois que tous les paquets sont mis à jour, redémarre ton système pour appliquer les changements.

Installe les dépendances requises

Ensuite, tu devras installer le serveur Web Nginx et d’autres dépendances dans ton système. Tu peux les installer tous à l’aide de la commande suivante :

apt-get install nginx apt-transport-https ca-certificates curl gnupg2 software-properties-common curl -y

Une fois que tous les paquets sont installés, tu peux passer à l’étape suivante.

Installe Docker

Par défaut, la dernière version de Docker n’est pas disponible dans le référentiel de Debian 10. C’est donc une bonne idée de l’installer à partir du dépôt officiel de Docker.

Tout d’abord, télécharge et ajoute la clé GPG avec la commande suivante :

wget https://download.docker.com/linux/debian/gpg apt-key add gpg

Ensuite, ajoute le référentiel Docker avec la commande suivante :

add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian buster stable"

Ensuite, mets à jour le référentiel et installe le Docker avec la commande suivante :

apt-get update -y
apt-get install docker-ce -y

Une fois l’installation terminée avec succès, vérifie l’état du Docker avec la commande suivante :

systemctl status docker

Tu devrais obtenir la sortie suivante :

? docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2020-04-19 06:26:25 UTC; 1min 8s ago
     Docs: https://docs.docker.com
 Main PID: 8883 (dockerd)
    Tasks: 10
   Memory: 46.6M
   CGroup: /system.slice/docker.service
           ??8883 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Apr 19 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.413828757Z" level=warning msg="Your kernel does not support swap memory limit
Apr 19 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.413876690Z" level=warning msg="Your kernel does not support cgroup rt period"
Apr 19 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.413889604Z" level=warning msg="Your kernel does not support cgroup rt runtime
Apr 19 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.414115814Z" level=info msg="Loading containers: start."
Apr 19 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.788332166Z" level=info msg="Default bridge (docker0) is assigned with an IP a
Apr 19 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.972022325Z" level=info msg="Loading containers: done."
Apr 19 06:26:25 debian10 dockerd[8883]: time="2020-04-19T06:26:25.010940205Z" level=info msg="Docker daemon" commit=afacb8b7f0 graphdriver(s)=o
Apr 19 06:26:25 debian10 dockerd[8883]: time="2020-04-19T06:26:25.011145541Z" level=info msg="Daemon has completed initialization"
Apr 19 06:26:25 debian10 systemd[1]: Started Docker Application Container Engine.
Apr 19 06:26:25 debian10 dockerd[8883]: time="2020-04-19T06:26:25.074603639Z" level=info msg="API listen on /var/run/docker.sock"

À ce stade, Docker est installé et fonctionne. Tu peux maintenant passer à l’étape suivante.

Configurer la structure de répertoire de Flask

Ensuite, tu devras créer une structure de répertoire pour contenir ton application Flask.

Créons un répertoire nommé flask à l’intérieur du répertoire /var/www/ :

mkdir -p /var/www/flask

Ensuite, change le répertoire en flask et crée la structure du répertoire pour flask :

cd /var/www/flask
mkdir -p app/static
mkdir -p app/templates

Le répertoire static est utilisé pour stocker les images, les fichiers CSS et JavaScript, tandis que le répertoire templates est utilisé pour stocker les modèles HTML de ton projet.

Ensuite, tu devras créer un fichier __init__.py dans le répertoire app :

nano app/__init__.py

Ajoute le contenu suivant pour créer une instance Flask et importer la logique du fichier views.py :

from flask import Flask
app = Flask(__name__)
from app import views

Enregistre et ferme le fichier puis crée le fichier views.py dans ton répertoire app.

nano app/views.py

Ajoute les lignes suivantes

from app import app
@app.route('/')
def home():
   return "hello world!"

Sauvegarde et ferme le fichier puis crée le fichier uwsgi.ini avec la commande suivante :

nano uwsgi.ini

Ce fichier contiendra les configurations uWSGI pour notre application, comme indiqué ci-dessous :

[uwsgi]
module = main
callable = app
master = true

Enregistre et ferme le fichier lorsque tu as terminé. uWSGI est une option de déploiement pour Nginx qui est à la fois un protocole et un serveur d’applications.

Ensuite, tu devras créer le fichier main.py pour importer l’instance Flask nommée app du paquet d’applications. Tu peux le créer avec la commande suivante :

nano main.py

Ajoute la ligne suivante :

from app import app

Sauvegarde et ferme le fichier lorsque tu as terminé. Ensuite, crée un fichier requirements.txt pour spécifier les dépendances que le gestionnaire de paquets pip installera dans ton déploiement Docker :

nano requirements.txt

Ajoute la ligne suivante qui correspond à la dernière version de Flask :

Flask==1.1.2

Sauvegarde et ferme le fichier lorsque tu as terminé.

À ce stade, ton application Flask a été configurée avec succès. Tu peux maintenant passer à l’étape suivante.

Configurer Docker pour déployer Flask

Ensuite, tu vas devoir créer un Dockerfile pour construire et déployer une application Flask.

Tout d’abord, crée un Dockerfile à l’aide de la commande suivante :

cd /var/www/flask
nano Dockerfile

Ajoute les lignes suivantes :

FROM tiangolo/uwsgi-nginx-flask:python3.6-alpine3.7
RUN apk --update add bash nano
ENV STATIC_URL /static
ENV STATIC_PATH /var/www/app/static
COPY ./requirements.txt /var/www/requirements.txt
RUN pip install -r /var/www/requirements.txt

Sauvegarde et ferme le fichier lorsque tu as terminé. Ensuite, crée un script start.sh pour construire une image à partir du Dockerfile et créer un conteneur à partir de l’image Docker résultante.

nano start.sh

Ajoute la ligne suivante :

#!/bin/bash
app="docker.test"
docker build -t ${app} .
docker run -d -p 56733:80 \
  --name=${app} \
  -v $PWD:/app ${app}

Sauvegarde et ferme le fichier lorsque tu as terminé.

Remarque: Assure-toi que le port 56733 est libre et utilisable.

Enfin, exécute le script à l’aide de la commande suivante :

bash start.sh

Cela créera l’image Docker et construira un conteneur à partir de l’image résultante, comme indiqué ci-dessous :

Sending build context to Docker daemon  9.728kB
Step 1/6 : FROM tiangolo/uwsgi-nginx-flask:python3.6-alpine3.7
python3.6-alpine3.7: Pulling from tiangolo/uwsgi-nginx-flask
48ecbb6b270e: Pull complete 
692f29ee68fa: Pull complete 
f75fc7ac1098: Pull complete 
c30e40bb471c: Pull complete 
Successfully built f5de17e1ce82
Successfully tagged docker.test:latest
22cd2bd23c9190cf2900fa1d7c55e4765a266e68c74dc1e6858872e9ebe7bdcd

Tu peux maintenant répertorier les conteneurs en cours d’exécution avec la commande suivante :

docker ps

Tu devrais obtenir la sortie suivante :

CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                            NAMES
22cd2bd23c91        docker.test         "/entrypoint.sh /sta…"   About a minute ago   Up About a minute   443/tcp, 0.0.0.0:56733->80/tcp   docker.test

Tu peux aussi vérifier le conteneur Docker en visitant l’URL http://your-server-ip:56733. Tu devrais voir l’écran suivant :

Déployer des fichiers modèles

Tu peux aussi déployer des fichiers modèles pour servir du contenu statique et dynamique. Tu peux créer un modèle de page d’accueil pour ton application avec la commande suivante :

nano app/templates/home.html

Ajoute les codes suivants :

<!doctype html>

<html lang="en-us">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <title>Welcome Flask</title>
  </head>

  <body>
    <h1>Home Page</h1>
    <p>This is the home page of our flask application.</p>
  </body>
</html>

Enregistre et ferme le fichier lorsque tu as terminé. Ensuite, tu devras modifier le fichier views.py pour servir le fichier nouvellement créé :

nano app/views.py

Mets à jour le fichier comme indiqué ci-dessous :

from flask import render_template

from app import app

@app.route('/')
def home():
   return "hello world!"

@app.route('/template')
def template():
    return render_template('home.html')

Sauvegarde et ferme le fichier. Ensuite, tu devras redémarrer les conteneurs Docker pour appliquer les modifications.

Tu peux redémarrer le conteneur Docker nommé docker.test avec la commande suivante :

docker stop docker.test
docker start docker.test

Maintenant, ouvre ton navigateur Web et tape l’URL http://your-server-ip:56733/templ ate. Tu devrais voir ton modèle nouvellement créé dans l’écran suivant :

Conclusion

Félicitations ! Tu as réussi à déployer une application Flask avec Docker sur un serveur Debian 10. Tu peux maintenant répliquer l’application sur différents serveurs avec une reconfiguration minimale. N’hésite pas à me demander si tu as des questions.

Vous aimerez aussi...