Docker, Image, Container, Docker Compose, Docker Swarm, Kubernetes - všechna tato slova je v posledních letech možné vidět snad ve všech oblastech vývoje a provozování software.
V současné době je všeobecně rozšířený postup zabalit software do balíčku s pevně definovaným prostředím, a ten pak provozovat ve formě kontejnerů na fyzických či virtuálních serverech. Jde o široké téma, které může být poměrně složité, pojďme se tedy seznámit s jeho základy.
Docker je software, který umožňuje spouštět balíčky (Image) ve formě kontejnerů (Container) s využitím virtualizace na úrovni operačního systému. Díky tomu je kontejner izolován od vlivů operačního systému a dalších procesů. Z operačního systému využívá jádro a knihovny potřebné pro spuštění kontejneru.
Image ve světě IT představuje přesně zachycený stav souborového systému. Tento princip využívá i Docker Image, která je vytvořena sekvencí příkazů. Tyto příkazy přesně popisují, jak má výsledná Image vypadat. Každý příkaz v sekvenci vytváří další vrstvu souborového systému, na kterou naváže další příkaz. Nebo půjde o poslední vrstvu, kterou bude mít kontejner dostupnou.
Image může obsahovat software, adresářové struktury, zdrojové kódy aplikace nebo aplikaci samotnou. Prakticky může obsahovat vše, co je možné nainstalovat, nastavit nebo vytvořit na běžném operačním systému. Výhodou Image je, že ji lze sdílet. Proto není třeba řešit precizní nastavení každého systému, kde chceme provozovat specifický software.
Container lze popsat jako prostředí, ve kterém je spuštěn proces ve specifickém kontextu odděleném od prostředí operačního systému. Za kontext lze považovat proměnné prostředí, sdílené adresáře, sítě, publikované porty nebo také samotný operační systém. Většinu těchto vlastností může definovat přímo Image, kontejnery ale umožňují některá nastavení měnit a provozovat tak stejnou Image v několika variantách/konfiguracích. Je doporučováno, aby byl uvnitř kontejneru spuštěn pouze hlavní proces, například webový server nebo databázový systém. Při vytvoření kontejneru je do souborového systému Image přidána další vrstva, do které kontejner může zapisovat data.
Volume je označení pro adresář, jehož obsah je sdílen s operačním systémem a kontejnerem. Při odstranění kontejneru dojde k odstranění všech dat zapsaných do poslední vrstvy souborového systému a o data tedy přijdeme. Volumes lze využít pro trvalé uložení změn souborového systému, které byly provedeny uvnitř kontejneru. Pomocí Volumes je možné kontejneru data i poskytnout. Příkladem jsou zdrojové kódy webové stránky, kterou chceme pomocí webového serveru uvnitř kontejneru provozovat.
Po zhruba dvou letech používání u nás v B2A můžu vyzdvihnout několik vlastností, které se těší velké oblibě v celém týmu.
TIP: Velké množství již existujících Docker Images, které lze využít pro definice vlastních kontejnerů je možné najít na veřejně dostupném registru https://hub.docker.com
Mezi další výhody patří například verzování Docker Images, které obsahují již sestavené aplikace. Dále jednotný postup pro práci s prostředím mezí více aplikacemi / produkty nebo efektivnější nasazování aplikace díky využití Continuous integration / Continuous delivery.
Docker nabízí řadu příkazů. Dnes si však vystačíme s těmito třemi:docker run
docker ps
docker stop
Cílem je otestovat, zda naše velmi jednoduchá aplikace napsaná v jazyce PHP bude funkční i na další verzi. Zdrojový kód pro toto zadání si lze stáhnout na tomto uvedeném odkaze: https://github.com/b2aswd/blog/tree/main/backend/hello-docker . Všechny příkazy jsou poté prováděny uvnitř složky hello-docker.
Víme, že aplikace byla napsána v dobách PHP 7.4, spustíme si tedy kontejner na základě Image php:7.4-apache
a zdrojové kódy pomocí Volume sdílíme do kontejneru.
docker run --rm -d -p 8074:80 -v $(pwd)/src:/var/www/html php:7.4-apache
Tento příkaz říká Dockeru, aby spustil kontejner, který:
--rm
..... po zastavení bude automaticky odstraněn-d
..... byl spuštěn na pozadí-p 8074:80
..... publikoval interní port 80 dostupný jako 8074 na operačním systému hostitele-v $(pwd)/src:/var/www/html
..... sdílel obsah adresáře: $(pwd)/src
souborového systému hostitele do adresáře: /var/www/html
uvnitř kontejneruphp:7.4-apache
..... jako základní Image pro svůj běh využil php:7.4-apache
Pomocí dalšího příkazu ověříme, zda kontejner existuje. Ve výpisu by měl být jeden kontejner, který má ve sloupcích IMAGE a PORTS odpovídající hodnoty. Ostatní nastavení kontejneru nejsou v tomto základním výpisu k dispozici.docker ps
Kontejner běží, můžeme tedy pomocí webového prohlížeče ověřit, zda je webový server funkční a dostupný na adrese http://127.0.0.1:8074. Stránka by měla vypsat podrobné informace o verzi PHP, která je v kontejneru použita.
Primitivní test naší aplikace na PHP 7.4 provedeme otevřením adresy http://127.0.0.1:8074/test.php ve webovém prohlížeči. Očekávaným výstupem ve webovém prohlížeči je text “I'm PHP script running in Container!”
Nyní víme, že kontejner obsahuje vše potřebné pro běh naší velmi jednoduché aplikace.
Pro ověření kompatibility s novější verzí PHP můžeme spustit na první pohled stejný kontejner, jen s jinou základní Image - rovnou ověříme, zda běží.
docker run --rm -d -p 8080:80 -v $(pwd)/src:/var/www/html php:8-apache
docker ps
Nyní můžeme ověřit kromě verze PHP, která je v kontejneru použita (http://127.0.0.1:8080), také funkčnost naší aplikace (http://127.0.0.1:8080/test.php)
Webový prohlížeč nás přivítal pozitivní hláškou Fatal error, lze tedy konstatovat, že naše velmi jednoduchá aplikace není aktuálně kompatibilní s PHP 8.
Pro dosažení cíle v tomto případě stačilo použití dvou jednoduchých příkazů, nezbývá než zastavit běžící kontejner pomocí příkazu docker stop
a s ID kontejnerů z výstupu docker ps
jako parametry.
Docker, Image, Container - již pro Vás nebudou pouze pojmy! Cílem tohoto článku bylo seznámení se se základy Dockeru, bez kterých se neobejde žádný vývojář vstupující do této problematiky. Jako skvělý podklad pro další zkoumání Dockeru je samozřejmě dokumentace. Tu můžete procházet například zde: https://docs.docker.com
V dalším pokračování se budu věnovat oblastem jako je tvorba vlastní Image, využití Docker Compose nebo provoz vlastního registru pro Images. Máte se tedy na co těšit!
Zdroje:
https://github.com/b2aswd/blog/tree/main/backend/hello-docker
https://docs.docker.com
https://www.docker.com/company/newsroom/media-resources#logos
https://www.docker.com/resources/what-container
https://hub.docker.com/_/php