ITHub

Docker: bevezetés a containerek világába

Docker: bevezetés a containerek világába
ITHub
ITHub
| ~4 perc olvasás

Ha fejlesztő vagy, nagy eséllyel hallhattál már a Dockerről, ami egy egy hasznos eszköz applikációk containerekbe csomagolására, és abban történő futtatására. Mivel ma már az egész szakma aktívan használja, beleértve a legnagyobb szereplőket (Google, Amazon), érdemes jobban megismerkedni a témával akkor is, ha a napi munkádban esetleg még nem használod. Ez a cikk segít tisztázni a containerekkel kapcsolatos alapfogalmakat, és rávilágít és a virtuális gépektől (VM) való eltérésekre is.

Docker

Virtuális gépek (VM)

A containerek és a VM-ek gyakorlatilag ugyanarra a problémára adnak megoldást: hogyan lehet izolálni egy applikációt és annak összes függőségét egy bárhol futtatható egységbe. Azonban a két megoldás architektúrája meglehetősen különböző; első körben tekintsük át ezt az aspektust. A virtuális gép fogalmával talán már mindannyian találkozhattatok, ez tulajdonképpen egy valódi számítógép emulációját takarja, és szinte pontosan úgy hajt végre bármilyen feladatot, mint egy valódi, fizikailag létező számítógép. A VM a gazdaszámítógép erőforrásait (RAM, CPU, stb.) terheli, így ha több VM-et futtatunk egyszerre, mind ezeken kell osztozniuk. Ezt az ún. hypervisor réteg segíti, ez biztosít átjárást a fizikai gép operációs rendszere és a VM-ek között.

Fontos látni, hogy minden egyes VM tartalmazza a teljes szoftver-, és hardver stacket, amin az alkalmazások futnak, így a virtualizált hardvereket (hálózati adapter, CPU, merevlemezek, stb.), a teljes operációs rendszert, és a felhasználói területet.

A containerekről

Első látásra egy container nem különbözik sokban egy VM-től, hiszen ugyanúgy egy teljesen elkülönített, virtualizált környezett biztosít, amelynek a gazdaszámítógép szolgáltat erőforrásokat. Azonban a VM-el ellentétben a containerek nem az egész stacket, csupán a felhasználói teret virtualizálják, a többi erőforrás pedig közös.

A legnagyobb különbség a containerek és a virtuális gépek között az, hogy minden container osztozik a gazda kerneljén a többi containerrel, így ebben az esetben a virtualizált hardver és az OS nem része a “csomagnak”, csupán az alkalmazásunkhoz kötődő könyvtárak, binárisok és a felhasználó terület. Könnyen látható, hogy ezáltal a container nagyságrendekkel kisebb overheaddel bír a VM-ekhez képest, mondhatni egy “lightweight” technológia az alkalmazások futtatási környezettel együtt történő becsomagolására.

Hol jön a képbe a Docker?

A Docker jelenleg az egyik legelterjedtebb container framework, amelynek implementációja erősen támaszkodik a Linux kernel nyújtotta szeparációs lehetőségekre (namespacek, control groupok). Azonban a technológia már a Docker előtt is létezett – a Google pl. régóta használja -, így felmerülhet kérdés, hogy miért éppen a Docker lett az a megoldás, amely futótűzként terjedt el?

A legkézenfekvőbb válasz erre a könnyű használhatóság. A Docker fejlesztők és sysadminok számára egyaránt egy nagyon egyszerű lehetőséget biztosít hordozható alkalmazások létrehozására és menedzselésére. Segítségével bárki fejleszthet és becsomagolhat egy alkalmazást például a saját laptopján, és biztos lehet benne, hogy az egy teljesen másik környezetben, tipikusan egy cloud szerveren futtatva is ugyanúgy működni fog.

A másik komoly előny a sebesség. A technológiából fakadóan a Docker containerek kicsik és és gyorsak, hiszen tulajdonképpen csak egy, a kernelen futó sandbox környezetről van szó, amely kevés erőforrást emészt fel.

További két tényező, amelyet érdemes megemlíteni, az a modularitás és a skálázhatóság. A Dockerrel nagyon egyszerűen “feldarabolhatjuk” az alkalmazásunkat különböző containerekbe, például egy containerben csücsül a MongoDB adatbázisunk, egy másikban egy Redis szerver, és egy harmadik containerben pedig az ezekhez kapcsolódó Node.js app.

Docker alapfogalmak

Most, hogy megismerkedtünk a containerek működésével, nézzünk bele egy kicsit a Docker specifikus dolgokba is. A Docker alapvetően három részből áll: a daemon, a kliens, és egy REST API. A daemon a host gépen fut és parancsokat fogad a klienstől, az API segítségével pedig közvetlenül kommunikálhatunk a daemonnal. Mi felhasználóként persze elsősorban a klienst fogjuk használni, ennek adunk ki különböző parancsokat.

A containerek definiálására az ún. dockerfile szolgál, ez instrukciókat tartalmaz arra vonatkozóan, hogyan épüljön fel a container. Ezekkel a parancsokkal például előírhatjuk az operációs rendszer verzióját, bizonyos Linux packagek installációját, portok megnyitását, és még rengeteg egyéb dolgot. A részletek ismertetése nélkül így néz ki például egy dockerfile, ez konkrétan egy nagyon alap Apache szerver definícióját tartalmazza:

# A basic apache server. To use either add or bind mount content under /var/www FROM ubuntu:12.04

MAINTAINER Kimbro Staken version: 0.1

RUN apt-get update && apt-get install -y apache2 && apt-get clean && rm -rf /var/lib/apt/lists/*

ENV APACHE_RUN_USER www-data ENV APACHE_RUN_GROUP www-data ENV APACHE_LOG_DIR /var/log/apache2

EXPOSE 80

CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]

Forrás: https://github.com/kstaken/dockerfile-examples

A dockerfile elkészülte után jöhet a build lépés, ami egy Docker image-t fog létrehozni. A Docker image-re úgy kell gondolnunk, mint egy kizárólag olvasható template-re, ami a fájlban meghatározottak alapján létrejövő környezetet tartalmazza. Ha ehhez hozzácsatoljuk az alkalmazásunkat és egy írható/olvasható fájlrendszert, létrejön a Docker container. Amint ez kész, az alkalmazásunk bármely környezetben változtatás nélkül futtathatóvá válik.

Reméljük, ez a kis ízelítő segít meglátni a Docker előnyeit és motivációt ad arra, hogy belemélyedjetek a témába; ebben az esetben érdemes belevetni magatokat a hivatalos dokumentációba.