Vissza a bloghoz

Flask alkalmazás építése és telepítése Dockerrel Ubuntu 20.04-en

Flask alkalmazás építése és telepítése Dockerrel Ubuntu 20.04-en

Bevezetés

Docker egy nyílt forráskódú konténerplatform. Ez egy könnyű, virtualizált, hordozható, szoftveresen definiált szabványosított környezet, amely lehetővé teszi a szoftverek futtatását a fizikai gazdagépen futó más szoftverektől elkülönítve. A Docker könnyű alternatívát kínál a virtuális gépekkel szemben. Ugyanakkor biztosítja az alkalmazások hordozhatóságát, teljesítményét, agilitását és skálázhatóságát. Egy átfogó útmutatóért a Docker-ökoszisztémáról, tekintse meg a Dockerrel történő konténerizációról szóló részletes áttekintésünket.

Flask egy nyílt forráskódú, minimális webes keretrendszer, amely a Python nyelvre épül. A Flask nagyszerű tulajdonságai közé tartozik, hogy könnyű, rugalmas és rendkívül strukturált. Emellett a futtatásához nincs szükség semmilyen speciális eszközre vagy beépülő modulra.

A Flask és a Docker kombinálása egy könnyű, rugalmas és skálázható alkalmazást eredményez. Az alkalmazást számos szerveren és infrastruktúrán telepítheti, a dockerizált konténerek hordozható jellegének köszönhetően. Ez az útmutató arra összpontosít, hogy bemutassa, hogyan telepíthet egy Flask alkalmazást a Docker segítségével. Azt is bemutatjuk, hogyan biztosíthatja, hogy az alkalmazás jövőbeli frissítései érvénybe lépjenek.

Előfeltételek

Ez egy gyakorlati útmutató lesz, és létre kell hoznia egy olyan környezetet, amely lehetővé teszi a lépések követését:

útmutatónkat. Most pedig kezdjük el!

1. lépés: A Flask alkalmazás előkészítése

Először létrehozunk egy könyvtárat, amely a Flask alkalmazásunkat fogja tárolni. Választhat tetszőleges könyvtárnevet is. Ebben az útmutatóban azonban a következő nevet adjuk neki: flask_demo. A projektfájlokat a /var/www könyvtárba mentjük, amely általában az a könyvtár, amelyhez az Ubuntu alapértelmezés szerint hozzáférést enged a nyilvános internetről. Először futtassa a következő parancsokat a könyvtár létrehozásához és a belépéshez:

A projektünk ezen gyökérkönyvtárában létrehozzuk egy Flask alkalmazás alapvető mappaszerkezetét. Ezután futtassa a következő parancsot az alapszerkezet létrehozásához, hozzáadva a -p jelzőt, hogy az összes szülőmappa is létrejöjjön az út során:

Az app mappa tartalmazza a Flask alkalmazással kapcsolatos összes fájlt, beleértve a views és blueprints fájlokat. A nézetek (views) tartalmazzák azt a kódot, amelyet az alkalmazást érő kérések megválaszolására ír. A tervrajzok (blueprints) segítenek az alkalmazáskomponensek létrehozásában, és támogatják a Flask alkalmazásokban megszokott mintákat.

A találóan elnevezett static mappa statikus elemeket, például képeket, CSS- és JavaScript-fájlokat tartalmaz. A templates könyvtár tartalmazza a projekt összes HTML-sablonját.

Most elkezdhetjük a Flask alkalmazás inicializálásához szükséges fájlok megírását. Kezdje egy __init__.py nevű fájl létrehozásával az app könyvtárban, hogy jelezze a Python értelmezőnek, hogy az app könyvtárat csomagként kell kezelni. Futtassa a következő parancsot a terminálon a fájl megnyitásához a nano szerkesztővel:

A Pythonban csomagokat használunk a modulok logikai névterekbe vagy hierarchiákba történő csoportosítására. A modularizáció lehetővé teszi a kód felosztását egyedi és kezelhető blokkokra, amelyek meghatározott funkciókat látnak el.

Ezután a szerkesztőben megnyitott __init__.py fájlban adja hozzá a következő kódrészletet a Flask példány elindításához, és importálja a logikát a views.py fájlból, amelyet a következő lépésekben fog létrehozni:

Ha végzett, nyomja meg a Ctrl + O és ENTER a fájl mentéséhez, majd zárja be a Ctrl + X billentyűkkel. Ezután hozzuk létre a views.py fájlt az app könyvtárban. A views.py fájl fogja tartalmazni az alkalmazás logikájának nagy részét:

A fájlba adja hozzá a következő kódrészletet. Ez a kód egy egyszerű karakterláncot jelenít meg, amely jelzi, hogy az alkalmazás fut, amikor a felhasználók meglátogatják a webhelyet:

Ebben a fájlban először importáljuk a Flask alkalmazáspéldányt. Ezután hozzá kell adnunk egy sort az útvonal meghatározásához: @app.route(/). Az @app.route(/) sorra Flaskban úgy hivatkozunk, mint egy dekorátorra . A dekorátorok segítségével további funkciókat ágyazhat be egy vagy több függvénybe. Ebben az esetben átadunk egy hívást az útvonalnak / a home függvényre. Amikor egy felhasználó meglátogatja ezt az útvonalat, a következő szöveget fogja látni: "Our Flask application is running!".

Ezután létrehozza az uwsgi.ini fájlt, amely az alkalmazás uWSGI konfigurációit tartalmazza. Az uWSGI egy telepítési lehetőség az Nginx-hez, amely protokollként és alkalmazásszerverként szolgál. Futtassa a következő parancsot a fájl létrehozásához a projekt gyökérkönyvtárában a nano szerkesztővel:

A megnyitott fájlba adja hozzá a következő kódrészletet:

Ez a fájl néhány direktívát tartalmaz. Ezek célját az alábbiakban határozzuk meg:

  • module – meghatározza azt a modult, amelyből a Flask alkalmazás kiszolgálásra kerül. A modult main-re állítottuk be, hivatkozva a gyökérkönyvtárban található main.py fájlra. Ezt a fájlt a következő lépésben fogjuk létrehozni.
  • callable – utasítja az uWSGI-t, hogy az alkalmazásból exportált app példányt használja.
  • master – biztosítja az alkalmazás folyamatos futását, hogy minimalizálja az állásidőt a teljes alkalmazás újratöltése során.

Ha végzett, mentse és zárja be a fájlt.

Most létrehozhatja a main.py fájlt az alkalmazás belépési pontjának meghatározásához. Az uWSGI olvasni fogja ezt a fájlt, hogy tudja, hogyan kell interakcióba lépni az alkalmazással. Futtassa a következő parancsot a main.py  fájl létrehozásához a nano segítségével a projekt gyökérkönyvtárában :

A fájlba adja hozzá a következő sort, amely importálja az alkalmazáscsomagban létrehozott Flask példányt:

Az utolsó dolog, amit ebben a lépésben megtesz, az az alkalmazás futtatásához szükséges függőségek meghatározása. Ezeket a függőségeket egy dependencies.txt nevű fájlban fogjuk meghatározni. Amikor a Docker felépíti az alkalmazás rendszerképét, végrehajt egy pip (csomag kezelő) parancsot a függőségek telepítéséhez. Nyissa meg a fájlt a gyökérkönyvtárban a következő paranccsal:

A projektünkben eddig a pontig csak egy függőséget szeretnénk: Flask. Ezért hozzáadhatjuk a következő sort, hogy hivatkozzunk a projekthez szükséges megfelelő Flask verzióra:

A Flask verzió 2.0.1 mellett döntünk függőségként. Ez a legújabb verzió a jelen útmutató írásakor. A különböző verziókról további információt a Flask Changes oldalon találhat. Ezzel befejeződött a Flask alkalmazás beállítása. Most készítsük elő a Docker konfigurációkat a telepítéshez.

Step 2: Configure Docker

A Docker telepítés beállításához két fájlt fogunk létrehozni: Dockerfile és start.sh fájlokat. A Dockerfile deklaratív sorokat tartalmaz, amelyek egy Docker rendszerképet alkotnak. A start.sh egy egyszerű shell szkript a rendszerkép felépítéséhez és a konténer elindításához a Dockerfile fájlból. Miközben a projekt gyökérkönyvtárában tartózkodik, futtassa a következő parancsot a Dockerfile:

Ez a fájl tartalmazza a Docker rendszerképhez szükséges konfigurációkat. Ezután adja hozzá a következő kódrészletet a függőségek és a rendszerkép felépítésének meghatározásához:

Az első sor egy Dockerfile fájlban meghatározza azt az alapképet, amelyből a saját képünket építjük. Ebben az esetben a következő kép alapján fogunk építkezni: tiangolo/uwsgi-nginx-flask, amely elérhető a DockerHub oldalon. Azért választottuk ezt a konkrét képet, mert számos Python-verziót támogat.

Azt is megadjuk, hogy frissíteni szeretnénk a képet. Ezután hozzá kell adnunk a bash parancsértelmezőt , a nano szövegszerkesztőt, valamint a git klienst a forráskód lekéréséhez és feltöltéséhez olyan verziókezelő tárhelyekről, mint a GitHub, Bitbucket, vagy Gitlab. Az ENV kezdetű sorok a konténerben használandó környezeti változókat határozzák meg.

A COPY parancs átmásolja a függőségeket a konténerbe. A RUN parancs meghívja a pip csomag kezelőt a dependencies.txt fájl feldolgozásához és a függőségek telepítéséhez. Mentse el és zárja be a fájlt, ha végzett a szerkesztéssel.

Ezután létrehozza a start.sh szkriptet. Ez a szkript tartalmazni fogja a Docker parancsokat a kép felépítéséhez és futtatásához a képet. Bár ezeket a parancsokat egymás után is végrehajthatja a terminálon, úgy gondoltuk, tisztább, ha hozzáadja őket egy shell szkripthez, és egyszerűen meghívja a terminálról egyetlen paranccsal.

Mielőtt meghatároznánk a fájl tartalmát, először keresnünk kell egy szabad portot, amelyet más szolgáltatások nem használnak. Mi a 45644 portot fogjuk használni. Választhat azonban másik portot is. Futtassa a következő sort annak ellenőrzésére, hogy a port szabad-e:

A választott porttól függően, ha a fenti parancs kimenete 1, akkor szabad. Ellenkező esetben előfordulhat, hogy másik portot kell választania, és újra meg kell próbálnia a parancsot:

Flask application Port Check

Mivel találtunk egy szabad portot, most létrehozhatjuk a fájlt a nano segítségével a projekt gyökérkönyvtárában a következő parancs futtatásával:

Ebbe a fájlba adja hozzá a következő kódrészletet:

Az első sor, amelyet shebang-nek neveznek, meghatározza, hogy ez egy bash fájl, és parancsként kell végrehajtani. A második sor deklarál egy app_name nevű változót. Ezt a változót használjuk a kép és a konténer nevének beállítására. A harmadik sor arra utasítja a Dockert, hogy építse fel a képet az aktuális könyvtárban található Dockerfile definíció alapján. A kép neve a változónak megfelelően docker-flask-demo lesz.

Az utolsó sor létrehoz egy docker-flask-demo nevű konténert a meghatározott változónak megfelelően. A -d jelző a háttérben, leválasztott (detached) állapotban tartja a konténert a parancs végrehajtása után. A -p jelző a szerver egy portját a konténer egy adott portjához köti. Ebben az esetben a gazdagép 45644 portját csatlakoztatjuk ahhoz a 80 porthoz, amelyet a Docker elérhetővé tesz a konténerben.

A -v jelzőt használjuk egy Docker kötet megadására, amelyet a konténerhez csatolunk. A $PWD változó egy alapértelmezett Linux változó, amely az aktuális könyvtár elérési útját tartalmazza, amelyben éppen tartózkodik:

Flask application pwd

A mi esetünkben a teljes projektkönyvtárat a konténer /var/www könyvtárához csatoljuk. A Docker konfiguráció most már kész. A következő parancs végrehajtásával felépítheti a képet, és elindíthatja a konténert a felépített kép alapján:

Várja meg, amíg a szkript futása befejeződik, majd futtassa a következő Docker parancsot a futó konténerek listázásához:

A kimenet megjeleníti a futó konténereket:

Demo Docker

Látnia kell a konténerünket a következő névvel: docker-flask-demo a futó konténerek listájában. Keresse meg a szervere nyilvános IP címét, és nyissa meg a böngészőjében a megadott porton: http://your-server-public-ip:45644.

Hasonló kimenetet kell látnia:

Flask App Running

Ha a fentieket látja a böngészőjében, akkor sikeresen telepített egy Flask alkalmazást. Ezután módosítani fogjuk a fájlokat, és sablonokon keresztül fogunk tartalmat kiszolgálni a felhasználóknak.

3. lépés: Tartalom kiszolgálása sablonfájlokon keresztül

A Flaskban a sablonok használatosak a statikus és dinamikus tartalmak megjelenítésére a webhely látogatói számára. Megmutatjuk, hogyan hozhat létre egy HTML sablont, és hogyan szolgálhatja ki azt a felhasználóknak, amikor egy bizonyos útvonalat látogatnak meg. Ez lehet például egy Főoldal vagy egy Rólunk oldal.

Futtassa a következő parancsot a terminálon egy index.html fájl létrehozásához az app/templates könyvtárban:

Ezután adja hozzá a következő kódrészletet a fájlhoz:

Mentse el és zárja be a fájlt, ha végzett. Hozzon létre egy másik oldalt is, nevezzük Rólunk oldalnak, a következő paranccsal:

Adja hozzá a következő kódrészletet a fájlhoz:

Mentse el és zárja be a fájlt, ha végzett. Ezután módosítsa az app/views.py fájlt, hogy hivatkozzon a sablonokra, valamint a tényleges oldalak útvonalaira:

Módosítsa a fájlt úgy, hogy az így nézzen ki:

Mentse el és zárja be a fájlt, ha végzett. Az elvégzett módosítások nem lépnek életbe, amíg le nem állítja és újra nem indítja a konténert. Futtassa a következő Docker parancsokat a konténer leállításához és elindításához. Jegyezze meg a konténer nevét, amelyet korábban meghatároztunk:

Miután a konténer elindult és fut, látogasson el a Főoldalra és a Névjegy oldalra, hogy megtekinthesse az új tartalmak egy részét:

Flask application Index

 Flask application 1

Eddig létrehozott egy Flask alkalmazást, amely képes tartalmat kiszolgálni a webhely látogatói számára. Íme a projekt fájlszerkezete:

File Structure

Valószínűleg észrevette, hogy újra kellett indítanunk a Docker konténert, hogy az átvegye az új változtatásokat. A következő lépésben ezt automatizáljuk a rövidebb állásidő biztosítása érdekében.

4. lépés: Az alkalmazásfájlok frissítéseinek konfigurálása az automatikus újratöltéshez

Gyakran változtatunk egy alkalmazáson a logika, a felhasználói felületek javítása vagy függőségek hozzáadása érdekében. Ahhoz, hogy az ilyen változtatások életbe lépjenek, szükség lehet a Docker konténer újraindítására. Szerencsére uWSGI rendelkezik egy úgynevezett touch-reload funkcióval a Python szkript újratöltéséhez a konténer újraindítása nélkül.

Alapértelmezés szerint a Python rendelkezik egy auto-reloading (automatikus újratöltési) funkcióval, amely figyeli a teljes fájlrendszert a változások után, és frissíti az alkalmazást, ha változás történik. Bár az automatikus újratöltés jó az állásidő minimalizálására, erőforrás-igényes lehet. Ezért éles (production) környezetben nem ajánlott.

Lássuk, hogyan használhatja a touch-reload funkciót egy adott fájl változásainak figyelésére és az alkalmazás újratöltésére, ha változások történnek. Módosítsa a uwsgi.ini fájlt a nano szerkesztővel:

Adja hozzá a kiemelt sort, hogy így nézzen ki:

Mentse el és zárja be a fájlt, ha végzett. A hozzáadott sor meghatározott egy fájlt, amelynek módosítása kiváltja az alkalmazás újratöltését. Ahhoz azonban, hogy ez a feltétel aktívvá váljon a jövőbeli módosításokhoz, először újra kell indítania a konténert:

Most már módosíthatja az app/views.py fájlt, hogy bemutassa az automatikus újratöltés működését:

Módosítsa a home függvény által visszaadott karakterláncot a kiemeltek szerint:

Ha végzett, mentse el és zárja be a fájlt.

Nyissa meg az alkalmazás főoldalát a böngészőben: http://your-server-public-ip:45644.

Még nem fog látni semmilyen változást. Ez azért van, mert a touch-reload feltétel az uwsgi.ini fájl változását észleli. Használhatja a touch parancsot a feltétel aktiválásához, ezáltal a teljes alkalmazás újratöltéséhez a következő paranccsal:

Most, ha újratölti a főoldalt, láthatja a megjelenő új változtatásokat:

Touch Reload

A jövőben, ha bármilyen további változtatást eszközöl, csak a következő parancsot kell futtatnia: sudo touch uwsgi.ini és a teljes alkalmazás kevesebb állásidővel fog újraindulni. Ezzel elértünk a bemutató végéhez.

Összegzés

Ebben a bemutatóban implementált és telepített egy Flask alkalmazást Docker-képekkel és -konténerekkel. Az állásidő minimalizálása érdekében, elkerülve a konténer újraindításának szükségességét, beállította a touch-reload opciót, hogy figyelje egy adott fájl változásait, és automatikusan újraindítsa a teljes alkalmazást. Végül mindezt tesztelte a böngészőben, hogy megbizonyosodjon a működéséről.

A Docker gyorsabb telepítést biztosít, és lehetővé teszi az alkalmazások egyszerű skálázását. Ha szeretne többet megtudni a különböző Docker-parancsokról, kérjük, tekintse meg ezt a bemutatót a következő témában: hogyan kell telepíteni és használni a Dockert Ubuntun.

További Dockerrel kapcsolatos forrásokért a blogunkon, az alábbiakat tekintheti meg:

Kellemes kódolást!

author

Pranay Kapgate

Szerző · CloudSigma

Preslav Dobrev a CloudSigma kreatív tervezője, aki hagyományos és innovatív marketingcsatornák segítségével következetes vállalati identitás kialakítására összpontosít. Kiemelkedően képes ötvözni a művészi látásmódot a stratégiai marketinggel, hogy hatásos márkatörténeteket hozzon létre.

Hozzászólások

Még nincsenek hozzászólások. Legyen Ön az első.