Python aplikace v Docker kontejneru

V Pythonu je možné vytvořit aplikace, které běží v prohlížeči, ačkoli způsob jejich implementace je trochu odlišný od JavaScriptu, protože Python není přirozeně podporován prohlížeči. Existují však nástroje a frameworky, které umožňují vytvořit webové aplikace pomocí Pythonu.

Použití webových frameworků (Back-end řešení)

Python se často používá na straně serveru, kde poskytuje API nebo generuje HTML stránky, které jsou následně vykreslovány v prohlížeči. K tomu slouží různé frameworky:

  • Flask je jednoduchý a lehký framework pro malé aplikace.
  • Django je robustní framework pro větší a složitější projekty.
  • FastAPI je moderní framework vhodný pro tvorbu API s vysokým výkonem.

Jak to funguje:

  1. Python běží na serveru a generuje odpovědi na požadavky z prohlížeče (např. HTML stránky nebo data v JSON formátu).
  2. Front-end část aplikace může být psaná v HTML, CSS a JavaScriptu.

Příklad s Flaskem:

Nejdříve si ukážeme, jak spustit web appku napsanou v Pythonu lokálně z příkazové řádky Linuxu. Základní aplikace hello_flask.py na kterou se po spuštění můžete připojit v prohlížeči http://localhost:5000.

Instalace Flasku

Modul Flask není součástí standardní knihovny Pythonu a je nutné jej nainstalovat ručně. V terminálu zadejte příkaz:

Tímto ověříte, že je Flask správně nainstalovaný.

Uložte hello_flask.py například v editoru nano a spusťte.

Zobrazí se:

Pokud budete potřebovat proces ukončit, zjistěte PID procesu běžícího na portu 5000 příkazem lsof a ukončete příkazem kill.

Aplikaci hello_flask.py můžete rozšířit o formulář, který načte a vypíše vaše jméno.

Po spuštění aplikace jste mohli zahlédnout varování:

Pokusím se ho vysvětlit…

Rozdíl mezi vývojovým serverem a produkčním WSGI serverem

  • Vývojový server:
    • Flask má zabudovaný vývojový server (běží pomocí app.run()).
    • Je navržen pouze pro lokální testování a vývoj.
    • Není bezpečný ani výkonný pro nasazení na produkci.
  • Produkční WSGI server:
    • Servery jako Gunicorn, uWSGI nebo mod_wsgi jsou navrženy pro stabilitu, bezpečnost a vysoký výkon.
    • Jsou optimalizované pro zpracování více požadavků současně a lépe integrují aplikace v Pythonu s tradičními webovými servery jako Nginx nebo Apache.

Proč Docker

Produkční WSGI server můžete samozřejmě naistalovat přímo. Proč to dělat složitější?

Kontejnerizace aplikací přináší mnoho výhod, ale pro mne jsou na domácím serveru největší přínosy bezpečnost a blbuvzdornost. Ty jsou dány izolací od ostatních aplikací a hostitelského systému. Pokud mi hacknou kontejner nebo ho ve slabší chvice rozvrtám sám, nepoloží to celý server. Kontejnery mohu snadno a rychle podle potřeb vypnout a uvolnit tak HW prostředky.

Instalace Dockeru

Zkušenosti mám jen s Debian a Alpine Linuxy. Nesetkal jsem se s žádnými problémy a mohu je doporučit i pro opravdu slabý HW. Instalaci Dockeru zvládne i nezkušený uživatel.

Debian Linux

Alpine Linux

Portainer

Doporučuji začít kontejnerem Portainer-CE. Usnadňuje práci s kontejnery tím, že poskytuje webové intuitivní grafické uživatelské rozhraní (GUI), což znamená, že uživatelé mohou spravovat kontejnery, obrazy, sítě a svazky bez nutnosti používat příkazovou řádku.

Windows a macOS

Oficiální web docker.com nabízí pro Windows a Mac Docker Desktop. Nezkoušel jsem ho. Problém s instalací nejspíše nebude, ale Linux je pro Docker považován za nejlepší volbu z důvodů, které souvisejí s jeho nativním propojením s Linuxovým jádrem:

  • Linuxové jádro obsahuje technologie jako cgroups a namespaces, které jsou základem pro fungování kontejnerů. Docker tyto funkce přímo využívá bez nutnosti emulace. Absence mezivrstvy zajišťuje minimální režii a vyšší výkon.
  • Na Windows nebo macOS musí používat virtualizační vrstvy, jako je WSL2 nebo HyperKit, což přidává režijní náklady.
  • Většina Docker obrazů je optimalizována pro Linux, protože servery v produkčním prostředí běží převážně na Linuxu.
  • Řešení problémů a ladění je jednodušší díky dostupnosti nástrojů přímo v Linuxu, atd.

Vytvoření vlastního obrazu

Oficiální kontejner python:3.11-alpine na Docker Hub neobsahuje všechny potřebné knihovny. Mohli byste je doinstalovat po spuštění kontejneru, ale výhodné je využít automatizaci instalace a pomocí Dokerfile souboru vytvořit vlastní obraz.

Vytvořte si textový soubor bez přípony s názvem „Dockerfile“ a vložto do něj následující příkazy:

Z adresáře se souborem „Dockerfile“ spusťte příkaz:

V případě jiného adresáře nahraďte tečku cestou k Dockerfile souboru. Parametr -t je nepovinný. Umožňuje obraz pojmenovat.

Docker Compose

Vytvořit z obrazu kontejner lze i jinak, ale doporučuji vytvořit textový soubor „compose.yaml„. Slouží v Dockeru k definici a správě více kontejnerů jako jedné aplikace. Jedná se o konfigurační soubor v YAML formátu, který popisuje služby (kontejnery), jejich závislosti, síťová nastavení, svazky (volumes) a další parametry potřebné k jejich spuštění.

Pomocí „requirements.txt“ výše můžete instalovat další balíčky.

Adresářovou strukturu /home/admin/Workspace/Python/GunicornApp si upravte podle sebe. Vložte soubory app.py, compose.yaml a případně requirements.txt do vytvořeného adresáře. V příkazové řádce přejděte do adresáře, kde se nachází váš soubor compose.yaml, a spusťte příkaz:

-d Spustí kontejnery na pozadí (detached mode).

Zkontrolujte, zda kontejnery běží správně:

Pokud jste nezměnili port, měla by být vaše aplikace dostupná na http://localhost:8001

Pokud potřebujete upravit compose.yaml, restartujte kontejnery příkazem:

Pokud chcete odstranit staré kontejnery a jejich data, použijte:

Bonusový příklad

Vpravo vidíte reálné aktuální vytížení mého domácího serveru. Ve vaší web appce si toto zobrazení můžete také přidat. Pravidelný refresh provádí javascript. Statický obsah stránky je nyní umístěn v template souboru index.html.

Do adresáře s aplikací app.py přidejte adresář /templates a v něm vytvořte soubor index.html