Pokud si správně pamatujete, tak v posledním díle jsme si připravili aplikaci v Pythonu, kterou jsme zabalili a kterou jsme spustili v Podmanovi a zpřístupnili na jednom portu. Dneska bychom rádi nainstalovali Nextcloud. Pokud tuto aplikaci neznáte, je to populární cloudové řešení pro malé uživatele, nebo i firmy. Jde o PHP aplikaci s databází, která umožňuje synchronizovat soubory, sdílet s dalšími uživateli, spolupracovat na dokumentech atd. Výhodou oproti komerčním poskytovatelům je otevřený zdrojový kód a možnost instalace na vlastní zařízení.

Všimli jste si, čím se liší od naší minulé aplikace? Naše předchozí aplikace neobsahovala žádnou databázi, pouze jeden proces s webovým serverem (uwsgi). Zlaté pravidlo (jako každé s výjimkami) říká, že co kontejner, to jeden proces. Spustit Nextcloud  už bude potřebovat dva procesy (webový server a databázi).

Možnosti mezikontejnerové komunikace

Možností je několik, nejjednodušší z nich by byla pustit oba kontejnery a ten s databází otevřít na IP adrese hosta. V druhém kontejneru se na tuto IP adresu můžete zkusit připojit. Znamenalo by to ale, že databáze i webový server dostane svůj port. Takhle to sice může fungovat, ale připravujete se o izolaci jednotlivých prostředí.

Vytváření sítí kontejnerů

Prvním z dobrých řešení (sám ho moc ale nevyužívám) je vytvoření sítě kontejnerů pomocí podman networking. Její výhodou je snadné přidávání a ubírání kontejnerů ze sítě. Nasazení se tak hodí v organických prostředích, kde se často kontejnery mění a vlastně nevíte, co všechno pro běh dané aplikace/prostředí potřebujete. Všechny informace najdete přehledně v manuálových stránkách man podman-network.

Vytvoření sítě je velmi jednoduché podman network create <Název sítě>. Název můžete vynechat, použije se nějaké výchozí, nebo můžete nastavit masku sítě, přítomnost DNS a další věci, které v sítích běžně nastavujeme. Síť uvidíte ve výpisu podman network ls.

Pustit si s touto sítí kontejner s Fedorou je snadné (pouštím ho se spánkem na 10000s, aby mi hned neskončil). V kontejnerech si nainstaluji dnf install iproute a zobrazím IP adresy ip a. Tady vidíte rozdíl mezi oběma výstupy. Pro připomenutí, pro vstup do kontejneru potřebujete příkaz podman exec -it <ID/jméno kontejneru>, id, pokud nevíte, zobrazuje výstup z příkazu podman ps. Kontejner opustíte přes Ctrl + D, nebo exit.

podman run fedora --network sleep 100000

3: eth0@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 3a:40:74:7d:bb:1b brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.88.2.2/24 brd 10.88.2.255 scope global eth0

Zároveň se rozběhne pod s infrastrukturou (viditelné ve výpisu podman ps).

podman run fedora sleep 100000

2: tap0: <BROADCAST,UP,LOWER_UP> mtu 65520 qdisc fq_codel state UNKNOWN group default qlen 1000
    link/ether 0a:d3:5a:9f:06:7f brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.100/24 brd 10.0.2.255 scope global tap0
    ...

Všimněte si, že rozhraní se liší typem, adresami atd. Vše je možné konfigurovat a pokud máte chuť, tak si s tím pohrajte a napište nám vaše poznatky, milerádi je uveřejníme.

Pody - “zabalené kontejnery”

Potřebujeme tedy pod (infrastrukturní kontejner), který sjednocuje síť, prakticky všechny porty všech členských kontejnerů jsou sdílené. Řekněme, že locahost je sdílený. Na rozdíl od vytváření sítě (výše) je nutné port otevřít v tom okamžiku, kdy vytváříte právě ten infrastrukturní pod. Proto je potřeba si rozmyslet, jaké porty budu zvenku potřebovat.

Zpátky ale k příkladu s Nextcloudem. Už jsme si řekli, že budeme potřebovat dva procesy: databázi a webový server. Jak databáze, tak webový server komunikují přes TCP. Připojení k databázi není ale nutné otevřít ven, stačí, když bude přístupné tomu druhému kontejneru (procesu) webového serveru, který bude číst/ukládat jeho data. Webový server bude komunikovat na portu 80 (ale směrem ven ho napojíme na 8000).

Praktický příklad

podman pod create --name "nextcloud" -p 8000:80
195f44fa9b0101e0bb66a2d248696b4c93fd7e59e7f587601230cdd071121f7a
podman pod ps
POD ID NAME STATUS CREATED INFRA ID # OF CONTAINERS
195f44fa9b01 nextcloud Created 3 seconds ago 906a18f9a665 1

Vytvořím jeden pod názvem nextcloud, který na hostitelském počítači může otevřít port 8000 a propojit ho dovnitř na port 80. Samozřejmě ověřím, že tento pod existuje, v tuto chvíli obsahuje pouze jeden kontejner (infrastrukturní).

podman run --name "nextcloud-mariadb" -e MYSQL_ROOT_PASSWORD="password" -e MYSQL_DATABASE=nextcloud --pod nextcloud mariadb

Do daného podu přidám kontejner s databází mariadb. Nastavím heslo na roota. Vy si prosím místo PASSWORD zvolte něco bezpečného. Je velmi běžné, že konfigurace kontejnerů se provádí při spuštění přes nastavování proměnných -e PROMENNA=HODNOTA. Tady nastavujeme heslo root uživatele a výchozí databázi, která bude vytvořena. Zvolte si jiné heslo, ideálně nějaké bezpečné. Všechny magické proměnné se dozvíte v dokumentaci těchto kontejnerů (MariaDB je třeba tady).

V tuto chvíli naběhne kontejner s databází, která naslouchá na portu TCP/3306, nicméně není vidět z vnějšku tohoto podu. Tento port může použít pouze aplikace, která poběží uvnitř celého podu.

podman run --name nextcloud-app --pod nextcloud nextcloud

Teď jsme spustili samotný Nextcloud. Všimněte si, že trochu nešťastně jsem zvolil jméno celého podu nextcloud, takže samotná aplikace musí mít jméno nextcloud-app.

Připojit se můžete na http://localhost:8000, která mapuje dovnitř na port 80. Služba je dostupná i v celé vaší síti, stačí přidat do firewallu pravidlo pomocí sudo firewall-cmd --add-port 8000/tcp. A už můžete spustit konfiguraci Nextcloudu! Jediná věc na kterou si dejte pozor, že místo localhost musíte použít IP adresu 127.0.0.1(nebo explicitně uvést číslo portu za dvojtečkou localhost:3306), protože jinak se snaží Nextcloud otevřít lokální unixový socket a připojení na MariaDB samozřejmě selže (soubory mají stále oba kontejnery oddělené)

Trvalé úložiště

Pokud smažete kontejner, přijdete i o všechna data. Přidáme proto kontejnerům trvalé úložiště. V případě Nextcloudu se tam budou odkládat vaše soubory a v případě databáze tam budete odkládat databázové soubory. Kompletní příkazy z dnešního dne máte tady shrnuté:

# Vytvoření úložiště pro trvalé soubory v domovském adresáři:
mkdir ~/podman{nextcloud,mariadb}
# Spuštění pod s infrastrukturou pro sdílení portů
podman pod create --name "nextcloud" -p 80:80
# Webserver s nextcloudem
podman run -v /home/ondrej/podman-mariadb/:/var/lib/mysql/:Z --name nextcloud-app --pod nextcloud nextcloud
# Databázový server
podman run -v /home/ondrej/podman-nextcloud/:/var/www/html/data/:Z --name "nextcloud-mariadb" -e MYSQL_ROOT_PASSWORD="password" -e MYSQL_DATABASE=nextcloud --pod nextcloud mariadb

HTTPS

Pokud chcete takhle aplikaci používat udělejte si HTTPS certifikát a postavte před tuto službu třeba nginx proxy. Samozřejmě můžete Nextcloud server uvnitř pustit na jiném portu a přidat dovnitř nginx proxy kontejner s certifikátem. O nginx proxy tu psát ale nebudeme, třeba jindy :). Snad bude stačit oficiální dokumentace

Co říci závěrem

Dnes jsme si ukázali, jak komplexně pustit celou aplikaci Nextcloud, jak řešit vícečlenné aplikace, trvalé disky, atd. Nebojte se nic, to stále není všechno, příští lekce se bude zabývat integrací se systemd, kterou osobně považuji za geniální. Stále vás žádám, že dopustil jsem se nějaké nepřenosti, chyby, opravte mě laskavě v komentářích.