Python >> Tutoriel Python >  >> Python

Développement d'applications Flask dans des conteneurs Docker sur macOS

L'ajout de Docker à votre environnement de développement Python et Flask peut être déroutant lorsque vous débutez avec des conteneurs. Installons et configurons rapidement Docker pour développer des applications Web Flask sur votre système local.

Nos outils

Ce tutoriel est écrit pour Python 3. Il fonctionnera avec Python 2 mais je ne l'ai pas testé avec la version 2.7 bientôt obsolète.

Docker pour Mac est nécessaire. Je recommande la version stable, sauf si vous avez un objectif explicite pour le edgechannel.

Dans le conteneur Docker, nous utiliserons :

  • Python 3, en particulier la version slim-3.6.5 de Docker Hub
  • Fiole version 1.0.2

Tout le code du Dockerfile et de l'application Flask est disponible en open source sous la licence MIT sur GitHub sous le répertoire docker-flask-mac du référentiel blog-code-examples. Utilisez le code à vos propres fins autant que vous le souhaitez.

Installer Docker sur macOS

Nous devons installer Docker avant de pouvoir lancer nos conteneurs Docker. Si Docker pour Mac est déjà installé et fonctionne, n'hésitez pas à passer à la section suivante.

Sur votre Mac, téléchargez le programme d'installation de Docker Community Edition (CE) pour Mac.

Recherchez l'installation récemment téléchargée dans le Finder et double-cliquez sur le fichier.Suivez le processus d'installation, qui comprend l'octroi de privilèges administratifs au programme d'installation.

Ouvrez Terminal lorsque le programme d'installation est terminé. Testez votre installation Docker avec le --version drapeau :

docker --version

Si Docker est correctement installé, vous devriez voir le résultat suivant :

Docker version 18.03.1-ce, build 9ee9f40

Notez que Docker s'exécute via un agent système que vous pouvez trouver dans la barre de menus.

J'ai trouvé l'agent Docker pour prendre une autonomie précieuse sur mon Macbook Pro. Si je ne développe pas et que j'ai besoin d'utiliser la batterie au maximum, je fermerai l'agent et le redémarrerai lorsque je serai prêt à coder.

Maintenant que Docker est installé, passons à l'exécution d'un conteneur et à l'écriture de notre application Flask.

Fichier Docker

Docker doit savoir ce que nous voulons dans un conteneur, c'est là que le Dockerfile entre.

# this is an official Python runtime, used as the parent image
FROM python:3.6.5-slim

# set the working directory in the container to /app
WORKDIR /app

# add the current directory to the container as /app
ADD . /app

# execute everyone's favorite pip command, pip install -r
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# unblock port 80 for the Flask app to run on
EXPOSE 80

# execute the Flask app
CMD ["python", "app.py"]

Enregistrez le Dockerfile afin que nous puissions exécuter notre prochaine commande avec le contenu complet du fichier. Sur la ligne de commande, exécutez :

docker build -t flaskdock .

Le docker build ci-dessus le fichier utilise le -t flag pour taguer l'image avec le nom de flaskdock .

Si la construction a fonctionné avec succès, nous pouvons voir l'image avec le docker image ls commande. Essayez-le maintenant :

docker image ls

Nous devrions alors voir le nom de notre tag dans la liste des images :

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
flaskdock           latest              24045e0464af        2 minutes ago       165MB

Notre image est prête à être chargée en tant que conteneur afin que nous puissions écrire une application quickFlask que nous utiliserons pour tester notre environnement en l'exécutant dans le conteneur.

Codage d'une application Simple Flask

Il est temps de créer un super simple "Hello, World!" Application Web Flask pour tester le code Python dans notre conteneur Docker. Dans le répertoire du projet actuel, créez un fichier nommé app.py avec le contenu suivant :

from flask import Flask, Response


app = Flask(__name__)


@app.route("/")
def hello():
    return Response("Hi from your Flask app running in your Docker container!")


if __name__ == "__main__":
    app.run("0.0.0.0", port=80, debug=True)

Les 7 lignes de code ci-dessus (sans compter les lignes vierges conformes à PEP8) inapp.py permettent à notre application de renvoyer un message simple lorsqu'elle est exécutée avec le serveur de développement Flask.

Nous avons besoin d'un seul fichier de plus pour spécifier notre Flask dépendance. Créez un requirements.txt fichier dans le même répertoire que app.py :

flask==1.0.2

Assurez-vous que le app.py et requirements.txt fichier sont enregistrés, nous pouvons essayer le code.

Exécuter le conteneur

Maintenant que nous avons notre image en main avec le code Python dans un fichier, nous pouvons exécuter l'image en tant que conteneur avec le docker run commande. Exécutez la commande suivante en veillant à remplacer le chemin absolu du volume par votre propre répertoire.

docker run -p 5000:80 --volume=/Users/matt/devel/py/flaskdocker:/app flaskdock

Si vous recevez l'erreur python: can't open file 'app.py': [Errno 2] No such file or directory alors vous avez probablement oublié de hasarder /Users/matt/devel/py/flaskdocker dans le répertoire où se trouvent vos fichiers de projet, en particulier app.py , sont situés.

Tout a fonctionné lorsque vous voyez une simple réponse HTTP basée sur du texte comme ce qui est montré ci-dessus dans la capture d'écran de mon navigateur Chrome.

Quelle est la prochaine ?

Nous venons d'installer Docker et de configurer une application Flask pour qu'elle s'exécute dans un conteneur. Ce n'est que le début de la façon dont vous pouvez intégrer Docker dans votre flux de travail. Je vous recommande fortement de lire le guide de démarrage rapide de Django avec PostgreSQL qui vous présentera Docker Swarm ainsi que le service de conteneur principal de Docker.

Ensuite, jetez un coup d'œil aux pages Docker et de déploiement pour plus de didacticiels connexes.

Des questions? Faites-le moi savoir via un ticket GitHubissue sur le référentiel Full Stack Python, sur Twitter@fullstackpythonou @mattmakai.

Voyez-vous une faute de frappe, un problème de syntaxe ou simplement quelque chose qui prête à confusion dans cet article de blog ? La source de cette page sur GitHub et soumettre une demande d'extraction avec un correctif ou déposer un ticket de problème sur GitHub.