Natrag na blog

Izgradnja i postavljanje Flask aplikacije s Dockerom na Ubuntu 20.04

Izgradnja i postavljanje Flask aplikacije s Dockerom na Ubuntu 20.04

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:

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:

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:

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:

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:

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:

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:

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:

Unutar otvorene datoteke dodajte sljedeći isječak koda:

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:

Unutar datoteke dodajte sljedeći redak koji će uvesti instancu Flaska koja je kreirana u paketu aplikacije:

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:

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:

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:

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:

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:

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:

Flask application Port Check

Budući da smo utvrdili slobodan port, sada možemo stvoriti datoteku pomoću nano unutar korijenskog direktorija projekta pokretanjem sljedeće naredbe:

Unutar ove datoteke dodajte sljedeći isječak koda:

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:

Flask application pwd

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:

Pričekajte da se skripta završi s izvođenjem, a zatim izvršite sljedeću Docker naredbu za popis svih pokrenutih spremnika:

Izlaz će prikazati pokrenute spremnike:

Demo Docker

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:

Flask App Running

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:

Zatim dodajte sljedeći isječak koda u datoteku:

Spremite i zatvorite datoteku kada završite. Također, stvorite drugu stranicu, nazovimo je stranica O nama, sa sljedećom naredbom:

Dodajte sljedeći isječak koda u datoteku:

Spremite i zatvorite datoteku kada završite. Zatim izmijenite app/views.py datoteku kako biste referencirali predloške kao i rute za stvarne stranice:

Izmijenite datoteku tako da izgleda ovako:

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:

Nakon što se spremnik pokrene i proradi, posjetite Početnu stranicu i stranicu O nama kako biste vidjeli dio novog sadržaja:

Flask application Index

 Flask application 1

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

File Structure

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:

Dodajte istaknuti redak tako da izgleda ovako:

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:

Sada možete izmijeniti app/views.py datoteku kako biste prikazali kako radi automatsko ponovno učitavanje:

Promijenite niz koji vraća funkcija home kao što je istaknuto:

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:

Sada, ako ponovno učitate početnu stranicu, vidjet ćete prikazane nove promjene:

Touch Reload

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:

Sretno s radom!

author

Pranay Kapgate

Autor · CloudSigma

Preslav Dobrev je kreativni dizajner u CloudSigma, usredotočen na dosljedan poslovni identitet korištenjem tradicionalnih i inovativnih marketinških kanala. Vješt je u spajanju umjetničke vizije sa strateškim marketingom kako bi stvorio dojmljive brendirane priče.

Komentari

Još nema komentara. Budite prvi.