Zpět

První seznámení s Docker

13 minut čtení 18. 02. 2021

docker

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.

Základní pojmy

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.

docker

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.

Co mi jako vývojáři Docker přináší?

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. 

  1. Rychlé zapojení do vývoje
    Každá aplikace může mít specifické softwarové požadavky, a udržovat si vše přesně nainstalováno a nastaveno ve virtuálním stroji je zbytečná překážka. V některých situacích nemusí být ani možné provozovat více aplikací na stejném systému. Například kvůli rozdílným požadavkům na verzi PHP a systémových knihoven. Díky Dockeru a našim na míru vytvořeným Images je možné zapojit se do vývoje aplikací během jednotek minut s jistotou, že prostředí je přesně takové, jaké má být.
  1. Prostředí, kde aplikace funguje
    Rozdílnosti v prostředí virtuálních strojů mezi vývojáři způsobují kromě promarněného času nastavováním, také zbytečné chyby, které může být těžké odhalit. Sdílené prostředí také eliminuje mezi vývojáři nechvalně známý problém, kdy aplikace “na mém počítači ale funguje jak má”. Stejné prostředí je použito ve všech fázích nasazení aplikace. Vývojář od první chvíle pracuje ve stejném prostředí, jaké bude využito při nasazení aplikace do testovacího či produkčního prostředí.
  1. Docker Compose
    Nástroj, díky kterému je správa a konfigurace kontejnerů hračka. Pomocí konfiguračního souboru lze definovat všechny kontejnery služeb, které aplikace potřebuje ke svému běhu. Jednou ze služeb bývá i kontejner aplikace samotné. Využití Docker Compose je u nás stěžejní pro dosažení efektivity při zapojení do vývoje nebo stability prostředí, kde aplikace využívají naši zákazníci.

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.

Příklad praktického využití Dockeru

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ř kontejneru
php:7.4-apache  ….. jako základní Image pro svůj běh využil  php:7.4-apache

docker

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

docker

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.

docker

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!

docker

A jak dál?

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.

Závěr

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

Co když hledáme právě Tebe?

Kariéra v B2A