První seznámení s Docker

18. 2. 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.
  2. 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í.
  3. 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

6 docker run and ps 1

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)

7 browser test 1

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.

8 docker stop 1

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

< Zpět na VÝPIS AKTUALIT

Další články z kategorie

23. 12. 2021
Úspěšný vstup do nového roku a svátky plné pohody, klidu a odpočinku přeje celý tým B2A!

Přejeme všem obchodním partnerům i dalším příznivcům vánoční svátky přesně takové, jaké máte nejraději. Plné pohody, odpočinku, dobrého jídla a společnosti těch nejbližších. Děkujeme za perfektní spolupráci v roce 2021 a přejeme šťastný a úspěšný vstup do roku 2022!

PŘEČÍST
6. 12. 2021
První krůčky k digitalizaci zdravotnictví probíhají i u nás v ČR

Dříve trávili novorozenci na oddělení týdny, někdy i měsíce. A rodiče v permanentním stresu pendlovali mezi nemocnicí, domovem a prací. A dnes. Dnes jsme pokročili tak daleko, že pokud to zdravotní stav alespoň trochu dovolí, miminko můžou rodiče po pár dnech vzít domů. Sžívat se a užívat si společné chvíle. A hlavně – být v […]

PŘEČÍST
6. 11. 2021
Proč cílíme na User Centric Approach

Zastáváme názor, že spokojení zaměstnanci jsou těmi největšími tahouny firemního rozvoje. Při vylaďování našich aplikací hrál proto „user centric approach„ vždy zásadní roli… Správně pojmenovat nám jej ale pomohla až společnost Apple. Místo zaměření na procesy, které ještě nefungují, se zaměřujeme právě na přání a priority konkrétních lidí na konkrétních pozicích a stavíme softwarové vrstvy, které přesně odpovídají […]

PŘEČÍST
30. 10. 2021
Petr Kubíček jako host v novém díle podcastu #salesbooster

O tom, proč je metoda „user centric approach“ základním stavebním kamenem úspěšné digitalizace nebo jak se za posledních sedm let změnit náš mindset v B2A, hovořil Petr Kubíček (CEO v B2A) s Petrem Sobotkou v novém díle podcastu SalesBooster. „S Petrem Sobotkou se znám už od dob vysokoškolského studia… a tak jsem jeho nabídku zúčastnit se jako […]

PŘEČÍST
30. 9. 2021
Tři fáze designování komponent – 3.díl

V této závěrečné fázi designování komponent se zaměříme na použitelnost CSS, zamyslíme se nad možným rozšířením o tabulkové direktivy a uvedeme si jejich hlavní výhody. Pro ty z vás, které předchozí dva díly minuly, uvádím níže odkazy k přiblížení tématu: Tři fáze designování komponent – 1.díl Tři fáze designování komponent – 2.díl CSS Vstup do […]

PŘEČÍST
1. 7. 2021
RabbitMQ - implementace message brokera

Message broker Message broker je software, který dovoluje, jak už název vypovídá, různým aplikacím či službám komunikovat a vyměňovat si mezi sebou informace. Tyto brokery využívají ke komunikaci různých protokolů (např. AMQP), což dovoluje aplikacím být na sobě nezávislé a komunikovat mezi sebou i přes to, že jsou napsány v různých jazycích či běží na rozdílných […]

PŘEČÍST
19. 5. 2021
Fastlane z trochu jiného úhlu pohledu

Zřejmě všichni iOS vývojáři již slyšeli o nástroji Fastlane, který se využívá k automatizaci činností v průběhu celého vývoje nejen iOS aplikací. Jako první nás nejspíše napadne jejich generování, testování a vydávání. My se dnes ale podíváme na jiné - možná ne tolik rozšířené - využití, které tento nástroj rovněž poskytuje. Fastlane Fastlane umí podat […]

PŘEČÍST
29. 4. 2021
Tři fáze designování komponent – 2.díl

V předchozím díle jsme si názorně ukázali design tabulkové komponenty tzv. “from scratch” jen za pomocí HTML a CSS. Markup jsme rozčlenili do komponent za pomocí BEM konvence pojmenování CSS tříd, a tímto jsme si předchystali půdu pro pokračování, které je uvedeno v tomto 2.dílu. Celá tato třídílná série je do jisté míry na sobě nezávislá […]

PŘEČÍST
17. 3. 2021
Přínosy digitalizace výroby pro oblast kvality

Společnost Intemac Solutions, s.r.o. - zabývající se poradenstvím českým firmám v oblasti implementace digitálních technologií - nás pozvala, abychom se zúčastnili prvního studiového webináře, který se konal 3.března 2021 v Kuřimi.  Webinář byl zaměřený na téma „Zlepšování kontroly kvality díky digitálním nástrojům“, a to konkrétně na přínosy digitalizace ve výrobních firmách. V rámci webináře jsme […]

PŘEČÍST
16. 3. 2021
Přínosy digitalizace výroby pro oblast kvality
PŘEČÍST

Hledáme lidi s talentem a zapálením pro věc.

Zobrazit pracovní nabídky
menu-circlecross-circle
linkedin facebook pinterest youtube rss twitter instagram facebook-blank rss-blank linkedin-blank pinterest youtube twitter instagram