Dockerizing einer Flask-Anwendung mit Docker unter Debian 10

Docker ist ein Open-Source-Werkzeug, das entwickelt wurde, um das Erstellen, Bereitstellen und Ausführen von Anwendungen durch die Verwendung von Containern zu erleichtern. Ein Container ist ein Softwarepaket, das Code und all seine Abhängigkeiten verpackt, so dass die Anwendung schnell und zuverlässig von einer Computerumgebung zur anderen läuft.

Flask ist ein beliebtes Python-Web-Framework. Es wird als Mikroframework klassifiziert, weil es keine besonderen Werkzeuge oder Bibliotheken benötigt. Im Vergleich zu anderen Frameworks ist es leichtgewichtig und stark strukturiert.

In diesem Tutorial werden wir erklären, wie man die Flask-Anwendung mit Docker auf einem Debian-10-Server einsetzt.

Voraussetzungen

  • Ein Server, auf dem Debian 10 läuft.
  • Auf Ihrem Server ist ein Root-Passwort konfiguriert.

Erste Schritte

Bevor Sie beginnen, ist es eine gute Idee, das Paket Ihres Systems auf die neueste Version zu aktualisieren. Sie können alle Pakete mit dem folgenden Befehl aktualisieren:

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

Sobald alle Pakete aktualisiert sind, starten Sie Ihr System neu, um die Änderungen zu übernehmen.

Erforderliche Abhängigkeiten installieren

Als nÃ?chstes mÃ?ssen Sie den Nginx-Webserver und andere AbhÃ?ngigkeiten in Ihrem System installieren. Sie können alle diese Abhängigkeiten mit dem folgenden Befehl installieren:

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

Sobald alle Pakete installiert sind, können Sie mit dem nächsten Schritt fortfahren.

Docker installieren

Standardmäßig ist die neueste Version von Docker nicht im Debian-10-Repository verfügbar. Daher ist es eine gute Idee, sie aus dem offiziellen Docker-Repository zu installieren.

Laden Sie zuerst den GPG-Schlüssel herunter und fügen Sie ihn mit dem folgenden Befehl hinzu:

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

Fügen Sie dann das Docker-Repository mit dem folgenden Befehl hinzu:

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

Aktualisieren Sie als nächstes das Repository und installieren Sie den Docker mit dem folgenden Befehl:

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

Sobald die Installation erfolgreich abgeschlossen ist, überprüfen Sie den Status des Dockers mit dem folgenden Befehl:

systemctl status docker

Sie sollten die folgende Ausgabe erhalten:

? 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"

Zu diesem Zeitpunkt ist Docker installiert und läuft. Sie können nun mit dem nächsten Schritt fortfahren.

Setup Flask Verzeichnisstruktur

Als nächstes müssen Sie eine Verzeichnisstruktur für Ihre Flask-Anwendung erstellen.

Lassen Sie uns ein Verzeichnis namens flask innerhalb des Verzeichnisses /var/www/ erstellen:

mkdir -p /var/www/flask

Ändern Sie als nächstes das Verzeichnis in ein Flask und erstellen Sie die Verzeichnisstruktur für flask:

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

Das statische Verzeichnis wird zum Speichern von Bildern, CSS- und JavaScript-Dateien verwendet, während das templates-Verzeichnis zum Speichern der HTML-Vorlagen für Ihr Projekt dient.

Als Nächstes müssen Sie eine __init__.py-Datei innerhalb des app-Verzeichnisses erstellen:

nano app/__init__.py

Fügen Sie den folgenden Inhalt hinzu, um eine Flask-Instanz zu erstellen, und importieren Sie die Logik aus der Datei views.py:

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

Speichern und schließen Sie die Datei und erstellen Sie dann die Datei views.py in Ihrem Anwendungsverzeichnis.

nano app/views.py

Fügen Sie die folgenden Zeilen hinzu

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

Speichern und schließen Sie die Datei und erstellen Sie dann die Datei uwsgi.ini mit dem folgenden Befehl:

nano uwsgi.ini

Diese Datei wird die uWSGI-Konfigurationen für unsere Anwendung enthalten, wie unten gezeigt:

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

Speichern und schließen Sie die Datei, wenn Sie fertig sind. uWSGI ist eine Bereitstellungsoption für Nginx, die sowohl ein Protokoll- als auch ein Anwendungsserver ist.

Als nächstes müssen Sie die Datei main.py erstellen, um die Flask-Instanz namens app aus dem Anwendungspaket zu importieren. Sie können sie mit dem folgenden Befehl erstellen:

nano main.py

Fügen Sie die folgende Zeile hinzu:

from app import app

Speichern und schließen Sie die Datei, wenn Sie fertig sind. Als Nächstes erstellen Sie eine Datei requirements.txt zur Angabe der Abhängigkeiten, die der pip-Paketmanager in Ihrer Docker-Bereitstellung installieren wird:

nano requirements.txt

Fügen Sie die folgende Zeile hinzu, die mit der neuesten Version von Flask übereinstimmt:

Flask==1.1.2

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Zu diesem Zeitpunkt ist Ihre Flask-Anwendung erfolgreich konfiguriert. Sie können nun mit dem nächsten Schritt fortfahren.

Konfigurieren Sie den Docker für die Bereitstellung von Flask

Als nächstes müssen Sie ein Dockerfile erstellen, um eine Flask-Anwendung zu erstellen und bereitzustellen.

Erstellen Sie zunächst eine Dockerdatei mit dem folgenden Befehl:

cd /var/www/flask
nano Dockerfile

Fügen Sie die folgenden Zeilen hinzu:

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

Speichern und schließen Sie die Datei, wenn Sie fertig sind. Erstellen Sie als Nächstes ein start.sh-Skript, um ein Image aus der Docker-Datei zu erstellen, und erstellen Sie einen Container aus dem resultierenden Docker-Image.

nano start.sh

Fügen Sie die folgende Zeile hinzu:

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

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Hinweis : Stellen Sie sicher, dass der Port 56733 frei und nutzbar ist.

Abschließend führen Sie das Skript mit folgendem Befehl aus:

bash start.sh

Dadurch wird das Docker-Image erstellt und ein Container aus dem resultierenden Image erstellt, wie unten gezeigt:

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

Mit dem folgenden Befehl können Sie nun die laufenden Container auflisten:

docker ps

Sie sollten die folgende Ausgabe erhalten:

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

Sie können den Docker-Container auch unter der URL http://your-server-ip:56733 überprüfen. Sie sollten den folgenden Bildschirm sehen:

Template-Dateien bereitstellen

Sie können auch Schablonendateien einsetzen, um statische und dynamische Inhalte bereitzustellen. Sie können eine Homepage-Vorlage für Ihre Anwendung mit dem folgenden Befehl erstellen:

nano app/templates/home.html

Fügen Sie die folgenden Codes hinzu:

<!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>

Speichern und schließen Sie die Datei, wenn Sie fertig sind. Als nächstes müssen Sie die Datei views.py modifizieren, um die neu erstellte Datei bereitzustellen:

nano app/views.py

Aktualisieren Sie die Datei wie unten gezeigt:

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')

Speichern und schließen Sie die Datei. Anschließend mÃ?ssen Sie die Docker-Container neu starten, um die Ãnderungen zu Ã?bernehmen.

Sie können den Docker-Container mit dem Namen docker.test mit dem folgenden Befehl neu starten:

docker stop docker.test
docker start docker.test

Öffnen Sie nun Ihren Webbrowser und geben Sie die URL http://your-server-ip:56733/template ein. Sie sollten Ihre neu erstellte Vorlage auf dem folgenden Bildschirm sehen:

Schlussfolgerung

Gratulation! Sie haben erfolgreich eine Flask-Anwendung mit Docker auf einem Debian-10-Server eingesetzt. Sie können die Anwendung nun mit minimaler Neukonfiguration über verschiedene Server hinweg replizieren. Zögern Sie nicht, mich zu fragen, wenn Sie irgendwelche Fragen haben.

Das könnte Dich auch interessieren …