Uvod
Docker je platforma za kontejnere otvorenog koda. To je lagano, virtualizirano, prijenosno, softverski definirano standardizirano okruženje koje omogućuje softveru da radi izolirano od drugog softvera koji se izvodi na fizičkom računalu domaćinu. Docker nudi laganu alternativu virtualnim strojevima. Istovremeno pruža prenosivost, performanse, agilnost i skalabilnost aplikacija. Za sveobuhvatan vodič o Docker ekosustavu, pogledajte naš detaljni pregled kontejnerizacije s Dockerom.
Flask je minimalni web okvir otvorenog koda izgrađen pomoću Python. Neke od sjajnih značajki Flaska su da je lagan, fleksibilan i visoko strukturiran. Osim toga, ne zahtijeva nikakve posebne alate ili priključke za rad.
Kombiniranje Flaska i Dockera daje vam laganu, fleksibilnu i skalabilnu aplikaciju. Možete je implementirati na mnogim poslužiteljima i infrastrukturama, zahvaljujući prijenosnoj prirodi Dockeriziranih kontejnera. Fokus ovog vodiča je pokazati vam kako implementirati Flask aplikaciju s Dockerom. Također ćemo pokazati kako osigurati da buduća ažuriranja vaše aplikacije stupe na snagu.
Preduvjeti
Ovo će biti praktičan vodič i trebali biste stvoriti okruženje koje će vam omogućiti da ga pratite:
- Trebate imati instalaciju Ubuntu 20.04 kao vaše početno operativno okruženje. Također trebate stvoriti ne-root korisnika sa sudo privilegijama.
- Osim toga, trebate instalirati Docker. Imamo vodič o tome kako instalirati i upravljati Dockerom na Ubuntuu. Slijedite korake 1, 2, 3 i 4. Ovo bi trebalo raditi za bilo koju distribuciju Ubuntua.
- Na kraju, trebate imati instaliran Nginx. Slijedite naš vodič o instaliranju Nginxa na Ubuntu.
Sada, počnimo!
Korak 1: Pripremite Flask aplikaciju
Započet ćemo stvaranjem direktorija koji će sadržavati našu Flask aplikaciju. Možete odabrati naziv direktorija po svom izboru. Međutim, za ovaj vodič nazvat ćemo ga flask_demo. Spremit ćemo projektne datoteke unutar /var/www direktorija, što je obično direktorij kojem Ubuntu prema zadanim postavkama dopušta pristup javnom internetu. Prvo izvedite sljedeće naredbe kako biste stvorili direktorij i ušli u njega:
|
1 2 3 |
sudo mkdir /var/www/flask_demo cd /var/www/flask_demo |
Unutar ovog korijenskog direktorija našeg projekta stvorit ćemo osnovnu strukturu mapa Flask aplikacije. Zatim izvedite sljedeću naredbu za stvaranje osnovne strukture, dodajući zastavicu -p kako biste usput stvorili sve nadređene mape:
|
1 |
sudo mkdir -p app/static app/templates |
Mapa app sadrži sve datoteke povezane s Flask aplikacijom, uključujući views i blueprints. Views sadrže kod koji pišete za odgovaranje na zahtjeve koji dolaze do vaše aplikacije. Blueprints pomažu u izradi komponenti aplikacije i podržavaju uobičajene obrasce u Flask aplikacijama.
Prikladno nazvana mapa static sadrži statička sredstva kao što su slike, CSS i JavaScript datoteke. Direktorij templates sadrži sve HTML predloške za projekt.
Sada možemo početi pisati datoteke potrebne za pokretanje Flask aplikacije. Započnite stvaranjem datoteke pod nazivom __init__.py unutar direktorija app kako biste rekli Python interpreteru da se direktorij app treba tretirati kao paket. Izvedite sljedeću naredbu u svom terminalu kako biste otvorili datoteku u uređivaču nano:
|
1 |
sudo nano app/__init__.py |
Pakete u Pythonu koristimo za grupiranje modula u logičke prostore imena ili hijerarhije. Modularizacija omogućuje rastavljanje koda na pojedinačne blokove kojima se može upravljati i koji obavljaju određene funkcije.
Nakon toga, unutar datoteke __init__.py otvorene u vašem uređivaču, dodajte sljedeći isječak koda za pokretanje instance Flaska i uvezite logiku iz views.py koju ćete stvoriti u sljedećim koracima:
|
1 2 3 4 5 |
from flask import Flask app = Flask(__name__) from app import views |
Kada završite, pritisnite Ctrl + O i ENTER kako biste spremili datoteku, a zatim je zatvorili s Ctrl + X. Zatim kreirajmo views.py unutar app direktorija. Datoteka views.py sadržavat će većinu logike aplikacije:
|
1 |
sudo nano app/views.py |
Unutar datoteke dodajte sljedeći isječak koda. Ovaj kod će prikazati jednostavan niz znakova kako bi pokazao da vaša aplikacija radi kada korisnici posjete vašu web stranicu:
|
1 2 3 4 5 |
from app import app @app.route('/') def home(): return "Naša Flask aplikacija radi!" |
U ovoj datoteci započinjemo uvozom instance Flask aplikacije. Zatim moramo dodati liniju za definiranje rute: @app.route(/). Linija @app.route(/) naziva se dekorator u Flasku. Možete koristiti dekoratore za ubrizgavanje dodatnih funkcionalnosti u jednu ili više funkcija. U ovom slučaju, prosljeđujemo poziv ruti / na funkciju home. Kada korisnik posjeti ovu rutu, vidjet će tekst: "Naša Flask aplikacija radi!".
Zatim ćete kreirati datoteku uwsgi.ini kako bi sadržavala uWSGI konfiguracije za aplikaciju. uWSGI je opcija implementacije za Nginx koja služi kao protokol i aplikacijski poslužitelj. Pokrenite sljedeću naredbu za kreiranje datoteke u korijenskom direktoriju projekta pomoću uređivača nano:
|
1 |
sudo nano uwsgi.ini |
Unutar otvorene datoteke dodajte sljedeći isječak koda:
|
1 2 3 4 |
[uwsgi] module = main callable = app master = true |
Ova datoteka sadrži neke direktive. Njihovu svrhu definiramo u nastavku:
- module – definira modul iz kojeg će se posluživati Flask aplikacija. Postavili smo modul kao main, referencirajući se na datoteku main.py u korijenskom direktoriju. Ovu ćemo datoteku kreirati u sljedećem koraku.
- callable – usmjerava uWSGI da koristi instancu app izvezenu iz aplikacije.
- master – osigurava da aplikacija nastavi raditi kako bi se smanjilo vrijeme zastoja tijekom ponovnog učitavanja cijele aplikacije.
Spremite i zatvorite datoteku kada završite.
Sada možete kreirati datoteku main.py kako biste odredili ulaznu točku svoje aplikacije. uWSGI će pročitati ovu datoteku kako bi znao kako komunicirati s aplikacijom. Pokrenite sljedeću naredbu za kreiranje datoteke main.py pomoću nano unutar korijenskog direktorija vašeg projekta:
|
1 |
sudo nano main.py |
Unutar datoteke dodajte sljedeći redak koji će uvesti instancu Flaska koja je kreirana u paketu aplikacije:
|
1 |
from app import app |
Posljednja stvar koju ćete učiniti u ovom koraku je definirati ovisnosti potrebne za rad aplikacije. Ove ovisnosti definirat ćemo unutar datoteke pod nazivom dependencies.txt. Kada Docker gradi sliku vaše aplikacije, izvršit će naredbu upravitelja paketa pip (package manager) za instalaciju ovisnosti. Otvorite datoteku u korijenskom direktoriju sljedećom naredbom:
|
1 |
sudo nano dependencies.txt |
Do ove točke u našem projektu želimo samo jednu ovisnost: Flask. Stoga možemo dodati sljedeći redak kako bismo referencirali ispravnu verziju Flaska koju želimo za naš projekt:
|
1 |
Flask==2.0.1 |
Odlučujemo se za Flask verziju 2.0.1 kao ovisnost. To je najnovija verzija u vrijeme pisanja ovog vodiča. Više o različitim verzijama možete saznati na stranici Flask Changes. Time je dovršeno postavljanje Flask aplikacije. Sada pripremimo Docker konfiguracije za implementaciju.
Korak 2: Konfigurirajte Docker
Za postavljanje Docker implementacije, kreirat ćemo dvije datoteke, Dockerfile i start.sh. Datoteka Dockerfile sadrži deklarativne retke koji čine Docker sliku. Datoteka start.sh je osnovna shell skripta za izgradnju slike i pokretanje spremnika iz Dockerfile. Dok ste unutar korijenskog direktorija projekta, izvršite sljedeću naredbu za kreiranje Dockerfile:
|
1 |
sudo nano Dockerfile |
Ova datoteka sadrži potrebne konfiguracije za Docker sliku. Zatim dodajte sljedeći isječak koda kako biste odredili ovisnosti i način izgradnje slike:
|
1 2 3 4 5 6 7 8 9 10 11 |
FROM tiangolo/uwsgi-nginx-flask:python3.6-alpine3.7 RUN apk --update add bash nano git ENV STATIC_URL /static ENV STATIC_PATH /var/www/app/static COPY ./dependencies.txt /var/www/dependencies.txt RUN pip install -r /var/www/dependencies.txt |
Prva linija u Dockerfile definira baznu sliku iz koje gradimo našu sliku. U ovom slučaju, gradit ćemo na temelju tiangolo/uwsgi-nginx-flask, dostupne na DockerHub. Odabrali smo ovu specifičnu sliku jer podržava mnoge verzije Pythona.
Također navodimo da želimo ažurirati sliku. Zatim moramo dodati bash naredbeni proces , nano uređivač teksta, te git klijent za povlačenje i guranje izvornog koda iz repozitorija za kontrolu verzija kao što su GitHub, Bitbucket, ili Gitlab. Linije s ENV definiraju varijable okruženja koje će se koristiti u spremniku.
Naredba COPY kopira zavisnosti u spremnik. Naredba RUN poziva pip upravitelj paketima za parsiranje dependencies.txt datoteke i instaliranje zavisnosti. Spremite i zatvorite datoteku kada završite s uređivanjem.
Zatim ćete stvoriti start.sh skriptu. Ova skripta će uključivati Docker naredbe za izgradnju i pokretanje slike. Iako ove naredbe možete izvršavati postupno u terminalu, smatramo da je urednije dodati ih u shell skriptu i jednostavno je pozvati iz terminala jednom naredbom.
Prije nego što možemo definirati sadržaj ove datoteke, moramo prvo utvrditi slobodan port koji drugi servisi ne koriste. Koristit ćemo port 45644. Međutim, možete odabrati i drugi port. Izvršite sljedeću liniju kako biste provjerili je li port slobodan:
|
1 |
sudo nc localhost 45644 < /dev/null; echo $? |
Ovisno o portu koji ste odabrali, ako je izlaz gornje naredbe 1, onda je slobodan. U suprotnom, možda ćete morati odabrati drugi port i ponovno pokušati s naredbom:

Budući da smo utvrdili slobodan port, sada možemo stvoriti datoteku pomoću nano unutar korijenskog direktorija projekta pokretanjem sljedeće naredbe:
|
1 |
sudo nano start.sh |
Unutar ove datoteke dodajte sljedeći isječak koda:
|
1 2 3 4 5 6 7 |
#!/bin/bash app_name="docker-flask-demo" docker build -t ${app_name} . docker run -d -p 45644:80 --name=${app_name} -v $PWD:/app ${app_name} |
Prva linija, koja se naziva shebang, navodi da je ovo bash datoteka i da se treba izvršavati kao naredbe. Druga linija deklarira varijablu pod nazivom app_name. Koristimo ovu varijablu za postavljanje naziva slike i spremnika. Treća linija upućuje Docker da izgradi sliku na temelju Dockerfile definicije u trenutnom direktoriju. Slika će se zvati docker-flask-demo prema varijabli.
Zadnja linija stvara spremnik pod nazivom docker-flask-demo prema varijabli koju smo definirali. Zastavica -d održava spremnik pokrenutim u pozadini u odvojenom stanju nakon što naredba završi s izvršavanjem. Zastavica -p povezuje port na poslužitelju s određenim portom na spremniku. U ovom slučaju, montiramo port 45644 na računalu domaćinu na port 80 koji će Docker izložiti u spremniku.
Koristimo zastavicu -v za određivanje Docker volumena koji će se montirati na spremnik. Varijabla $PWD je zadana Linux varijabla koja sadrži putanju do trenutnog direktorija u kojem se nalazite u određenom trenutku:

U našem slučaju, montiramo cijeli direktorij projekta u /var/www direktorij spremnika. Docker konfiguracija je sada spremna. Možete izgraditi sliku i pokrenuti spremnik na temelju izgrađene slike izvršavanjem sljedeće naredbe:
|
1 |
sudo bash start.sh |
Pričekajte da se skripta završi s izvođenjem, a zatim izvršite sljedeću Docker naredbu za popis svih pokrenutih spremnika:
|
1 |
sudo docker ps |
Izlaz će prikazati pokrenute spremnike:

Trebali biste vidjeti naš spremnik s nazivom docker-flask-demo na popisu pokrenutih spremnika. Pronađite javni IP svog poslužitelja i pristupite mu u pregledniku na navedenom portu: http://your-server-public-ip:45644.
Trebali biste vidjeti sličan izlaz:

Ako vidite gore navedeno u svom pregledniku, uspješno ste postavili Flask aplikaciju. Zatim ćemo mijenjati datoteke i posluživati sadržaj korisnicima putem predložaka.
Korak 3: Posluživanje sadržaja putem datoteka predložaka
U Flasku, Predlošci se koriste za prikaz statičkog i dinamičkog sadržaja posjetiteljima web stranice. Pokazat ćemo vam kako stvoriti HTML predložak i poslužiti ga svojim korisnicima kada posjete određenu rutu. Na primjer, to može biti Početna stranica ili stranica O nama.
Izvršite sljedeću naredbu u svom terminalu kako biste stvorili index.html datoteku u app/templates direktoriju:
|
1 |
sudo nano app/templates/index.html |
Zatim dodajte sljedeći isječak koda u datoteku:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Flask Demo</title> </head> <body> <h2>Nalazite se na početnoj</h2> <p>Dobrodošli na the Flask s Docker demo stranicu</p> </body> </html> |
Spremite i zatvorite datoteku kada završite. Također, stvorite drugu stranicu, nazovimo je stranica O nama, sa sljedećom naredbom:
|
1 |
sudo nano app/templates/about.html |
Dodajte sljedeći isječak koda u datoteku:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>O Flask Demo</title> </head> <body> <h2>Stranica O nama</h2> <p>Ovo je bio a demo projekt. . Prikazuje kako izgraditi to build a Flask aplikaciju s Dockerom i Nginxom.</p> <p>Možete dodati onoliko stranica i datoteka koliko god želite you like</p> </body> </html> |
Spremite i zatvorite datoteku kada završite. Zatim izmijenite app/views.py datoteku kako biste referencirali predloške kao i rute za stvarne stranice:
|
1 |
sudo nano app/views.py |
Izmijenite datoteku tako da izgleda ovako:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
from flask import render_template from app import app @app.route('/') def home(): return "Naša Flask aplikacija radi!" @app.route('/index') def index(): return render_template('index.html') @app.route('/about') def about(): return render_template('about.html') |
Spremite i zatvorite datoteku kada završite. Promjene koje ste unijeli neće stupiti na snagu dok ne zaustavite i ponovno pokrenete spremnik. Pokrenite sljedeće Docker naredbe za zaustavljanje i pokretanje spremnika. Zabilježite naziv spremnika koji smo ranije definirali:
|
1 |
sudo docker stop docker-flask-demo && sudo docker start docker-flask-demo |
Nakon što se spremnik pokrene i proradi, posjetite Početnu stranicu i stranicu O nama kako biste vidjeli dio novog sadržaja:
|
1 |
Početna stranica: http://your-server-public-ip:45644/index |

|
1 |
O nama stranica: http://your-server-public-ip:45644/about |

Do sada ste izradili Flask aplikaciju koja može posluživati sadržaj posjetiteljima vaše web stranice. Evo strukture datoteka za projekt:

Vjerojatno ste primijetili da smo morali ponovno pokrenuti Docker spremnik kako bi prihvatio nove promjene. U sljedećem koraku to ćemo automatizirati kako bismo osigurali manje zastoja.
Korak 4: Konfigurirajte automatsko ponovno učitavanje ažuriranja datoteka aplikacije
Svaki drugi dan unosimo promjene u aplikaciju kako bismo poboljšali logiku, korisnička sučelja ili dodali neke ovisnosti. Da bi takve promjene stupile na snagu, možda ćete morati ponovno pokrenuti Docker spremnik. Srećom, uWSGI ima značajku pod nazivom touch-reload za ponovno učitavanje Python skripte bez ponovnog pokretanja spremnika.
Python već u startu ima značajku automatskog-ponovnog učitavanja koja prati cijeli datotečni sustav radi promjena i osvježava aplikaciju kada dođe do promjene. Iako je automatsko ponovno učitavanje dobro za smanjenje zastoja, može zahtijevati mnogo resursa. Stoga se ne preporučuje za produkcijska okruženja.
Pogledajmo kako možete koristiti touch-reload za praćenje promjena na određenoj datoteci i ponovno učitavanje aplikacije kada dođe do promjena. Izmijenite uwsgi.ini datoteku pomoću nano uređivača teksta:
|
1 |
sudo nano uwsgi.ini |
Dodajte istaknuti redak tako da izgleda ovako:
|
1 2 3 4 5 |
[uwsgi] module = main callable = app master = true touch-reload = /app/uwsgi.ini |
Spremite i zatvorite datoteku kada završite. Dodani redak specificira datoteku koja će se mijenjati kako bi se pokrenulo ponovno učitavanje aplikacije. Međutim, da bi se ovaj uvjet aktivirao za buduće izmjene, najprije morate ponovno pokrenuti spremnik:
|
1 |
sudo docker stop docker-flask-demo && sudo docker start docker-flask-demo |
Sada možete izmijeniti app/views.py datoteku kako biste prikazali kako radi automatsko ponovno učitavanje:
|
1 |
sudo nano app/views.py |
Promijenite niz koji vraća funkcija home kao što je istaknuto:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
from flask import render_template from app import app @app.route('/') def home(): return "<h3>Neke promjene u našoj Flask aplikaciji za automatsko ponovno učitavanje!</h3>" @app.route('/index') def index(): return render_template('index.html') @app.route('/about') def about(): return render_template('about.html') |
Spremite i zatvorite datoteku kada završite.
Otvorite početnu stranicu svoje aplikacije u pregledniku: http://your-server-public-ip:45644.
Još nećete vidjeti nikakve promjene. To je zato što uvjet touch-reload detektira promjenu na uwsgi.ini datoteci. Možete koristiti touch kako biste aktivirali uvjet, čime se ponovno učitava cijela aplikacija pomoću sljedeće naredbe:
|
1 |
sudo touch uwsgi.ini |
Sada, ako ponovno učitate početnu stranicu, vidjet ćete prikazane nove promjene:

U budućnosti, ako unesete bilo kakve daljnje promjene, trebate samo pokrenuti naredbu sudo touch uwsgi.ini i cijela će se aplikacija ponovno učitati s manje zastoja. Time smo došli do kraja ovog vodiča.
Zaključak
U ovom ste vodiču implementirali i pokrenuli Flask aplikaciju s Docker slikama i spremnicima. Kako biste smanjili vrijeme zastoja izbjegavanjem potrebe za ponovnim pokretanjem spremnika, konfigurirali ste touch-reload kako bi osluškivao promjene na određenoj datoteci i automatski ponovno učitao cijelu aplikaciju. Na kraju ste sve ovo testirali u pregledniku kako biste se uvjerili da radi.
Docker osigurava bržu implementaciju i omogućuje jednostavno skaliranje aplikacija. Ako želite saznati više o raznim Docker naredbama, pogledajte ovaj vodič o tome kako instalirati i koristiti Docker na Ubuntuu.
Za više resursa o Dockeru na našem blogu, možete pogledati sljedeće:
- Tehnologija kontejnerizacije: Vrste i upotreba različitih spremnika na CloudSigma PaaS platformi
- Kako dijeliti podatke između Docker spremnika i hosta
- Instalacija i postavljanje Dockera na CentOS-u 7
- Implementacija Laravela, Nginxa i MySQL-a pomoću Docker Composea
- Čišćenje Docker resursa – slike, spremnici i volumeni
Sretno s radom!
Komentari
Još nema komentara. Budite prvi.