Flask toepassing Dockeriseren met Docker op Debian 10

Docker is een open-source hulpmiddel dat ontworpen is om het gemakkelijker te maken om toepassingen te maken, uit te rollen en te draaien door containers te gebruiken. Een container is een softwarepakket dat code en al zijn afhankelijkheden inpakt zodat de toepassing snel en betrouwbaar van de ene computeromgeving naar de andere loopt.

Flask is een populair Python web framework. Het wordt geclassificeerd als een microframework omdat het geen bijzondere gereedschappen of bibliotheken nodig heeft. Vergeleken met andere raamwerken is het licht van gewicht en zeer gestructureerd.

In deze zelfstudie leggen we uit hoe je Flask toepassing met Docker op Debian 10 server kunt inzetten.

Vereisten

  • Een server waarop Debian 10 draait.
  • Een root wachtwoord is geconfigureerd op je server.

Aan de slag

Voor je begint is het een goed idee om de pakketten van je systeem bij te werken naar de nieuwste versie. Je kunt alle pakketten bijwerken met het volgende commando:

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

Als alle pakketten zijn bijgewerkt, herstart je je systeem om de veranderingen toe te passen.

Installeer de vereiste afhankelijkheden

Vervolgens moet je de Nginx webserver en andere afhankelijkheden in je systeem installeren. Je kunt ze allemaal installeren met het volgende commando:

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

Als alle pakketten geïnstalleerd zijn, kun je doorgaan naar de volgende stap.

Installeer Docker

Standaard is de nieuwste versie van Docker niet beschikbaar in de Debian 10 repository. Het is dus een goed idee om het uit de officiële Docker repository te installeren.

Download eerst de GPG sleutel en voeg die toe met het volgende commando:

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

Voeg vervolgens de Docker repository toe met het volgende commando:

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

Werk vervolgens de repository bij en installeer de Docker met het volgende commando:

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

Als de installatie met succes is voltooid, controleer dan de status van de Docker met het volgende commando:

systemctl status docker

Je zou de volgende uitvoer moeten krijgen:

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

Op dit punt is Docker geïnstalleerd en draait het. Je kunt nu verder gaan met de volgende stap.

Flask Directory structuur opzetten

Vervolgens moet je een mappenstructuur maken om je Flask toepassing in te bewaren.

Laten we een directory aanmaken met de naam flask binnen de directory /var/www/:

mkdir -p /var/www/flask

Verander vervolgens de directory in een flask en maak de directory structuur voor flask:

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

De map static wordt gebruikt om afbeeldingen, CSS, en JavaScript bestanden op te slaan, terwijl de map templates gebruikt wordt om de HTML sjablonen voor je project op te slaan.

Vervolgens moet je een __init__.py bestand maken binnen de app directory:

nano app/__init__.py

Voeg de volgende inhoud toe om een Flask instantie te maken en de logica uit het views.py bestand te importeren:

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

Bewaar en sluit het bestand en maak dan het views.py bestand aan in je app directory.

nano app/views.py

Voeg de volgende regels toe

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

Bewaar en sluit het bestand en maak dan het bestand uwsgi.ini aan met het volgende commando:

nano uwsgi.ini

Dit bestand zal de uWSGI configuraties voor onze toepassing bevatten zoals hieronder getoond:

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

Sla het bestand op en sluit het als je klaar bent. uWSGI is een inzetmogelijkheid voor Nginx die zowel een protocol als een applicatieserver is.

Vervolgens moet je het bestand main.py maken om de Flask instantie met de naam app uit het applicatiepakket in te voeren. Je kunt het maken met het volgende commando:

nano main.py

Voeg de volgende regel toe:

from app import app

Sla het bestand op en sluit het als je klaar bent. Maak vervolgens een requirements.txt bestand aan om de afhankelijkheden op te geven die de pip pakketbeheerder bij je Docker inzet zal installeren:

nano requirements.txt

Voeg de volgende regel toe die overeenkomt met de nieuwste versie van Flask:

Flask==1.1.2

Sla het bestand op en sluit het als je klaar bent.

Op dit punt is je Flask toepassing met succes geconfigureerd. Je kunt nu verder gaan met de volgende stap.

Configureer Docker om Flask in te zetten

Vervolgens moet je een Dockerfile maken om een Flask toepassing te bouwen en in te zetten.

Maak eerst een Dockerfile met het volgende commando:

cd /var/www/flask
nano Dockerfile

Voeg de volgende regels toe:

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

Sla het bestand op en sluit het als je klaar bent. Maak vervolgens een start.sh script om een image te bouwen uit het Dockerfile en maak een container van het resulterende Docker image.

nano start.sh

Voeg de volgende regel toe:

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

Sla het bestand op en sluit het als je klaar bent.

Opmerking: Zorg ervoor dat poort 56733 vrij en bruikbaar is.

Voer tenslotte het script uit met het volgende commando:

bash start.sh

Dit zal het Docker image aanmaken en van het resulterende image een container bouwen zoals hieronder te zien is:

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

Je kunt nu de draaiende containers opnoemen met het volgende commando:

docker ps

Je zou de volgende uitvoer moeten krijgen:

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

Je kunt de Docker container ook verifiëren door de URL http://your-server-ip:56733 te bezoeken. Je zou het volgende scherm moeten zien:

Sjabloonbestanden inzetten

Je kunt ook sjabloonbestanden inzetten om statische en dynamische inhoud te serveren. Je kunt een home page sjabloon voor je applicatie maken met het volgende commando:

nano app/templates/home.html

Voeg de volgende codes toe:

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

Sla het bestand op en sluit het als je klaar bent. Vervolgens moet je het views.py bestand aanpassen om het nieuw aangemaakte bestand te serveren:

nano app/views.py

Werk het bestand bij zoals hieronder:

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

Sla het bestand op en sluit het. Daarna moet je de Docker containers opnieuw starten om de veranderingen toe te passen.

Je kunt de Docker container met de naam docker.test opnieuw starten met het volgende commando:

docker stop docker.test
docker start docker.test

Open nu je webbrowser en typ de URL http://your-server-ip:56733/template. Je zou je nieuw gemaakte sjabloon in het volgende scherm moeten zien:

Conclusie

Gefeliciteerd! Je hebt met succes een Flask toepassing ingezet met Docker op Debian 10 server. Je kunt de toepassing nu over verschillende servers repliceren met minimale herconfiguratie. Voel je vrij me te vragen als je vragen hebt.