Már több hónapja használom a dockert a webes projektek fejlesztési és szállítási folyamatának struktúrázására. A «HabrHabr» olvasóinak ajánlom a docker bevezető cikkének fordítását — .
Mi az a docker?
A docker egy nyílt platform az alkalmazások fejlesztésére, szállítására és üzemeltetésére. A Dockert azért fejlesztették ki, hogy gyorsabban készíthesse el alkalmazásait. A docker segítségével elválaszthatja az alkalmazását az infrastruktúrájától, és az infrastruktúrát kezelhető alkalmazásként kezelheti. A docker segít gyorsabban kiadni a kódját, gyorsabban tesztelni, gyorsabban kiadni az alkalmazásokat, és csökkenteni a kódírás és a kód futtatása közötti időt. A docker ezt egy könnyű konténervirtualizáló platform segítségével valósítja meg, mely folyamatokat és eszközöket használ az alkalmazások kezelésében és kiadásában.
A docker alapvetően lehetővé teszi szinte bármely alkalmazás biztonságos, konténerbe zárt futtatását. A biztonságos izoláció lehetővé teszi, hogy egy hoston több konténert is egyidejűleg futtasson. A konténer könnyű természetének köszönhetően, amely további hipervizor terhelés nélkül indul el, többet hozhat ki a hardveréből.
A konténervirtualizáló platform és eszközök hasznosak lehetnek a következő esetekben:
- az alkalmazása (és az abban használt összes komponens) csomagolására docker konténerekbe;
- ezeknek a konténereknek a megosztására és szállítására csapataik számára a fejlesztéshez és teszteléshez;
- ezeknek a konténereknek a kiadására a produkciós környezetükbe, legyen szó adatközpontokról vagy felhőről.
Mire használhatom a dockert?
Alkalmazásaink gyors kiadása
A docker kiválóan alkalmas a fejlesztési ciklus megszervezésére. A docker lehetővé teszi a fejlesztők számára, hogy helyi konténereket használjanak az alkalmazásaikkal és szolgáltatásaikkal. Ez lehetővé teszi a folyamatos integrációs és kiadási folyamatba (CI/CD) való integrációt.
Például a fejlesztőink helyben írják a kódot, és megosztják fejlesztési stackjüket (docker képekből álló készlet) kollégáikkal. Amikor készen állnak, elküldik a kódot és a konténereket a tesztelési környezetbe, és elindítanak minden szükséges tesztet. A tesztkörnyezetből a kódot és a képeket a produkcióba küldhetik.
Egyszerűbb kiadás és telepítés
A konténeralapú Docker platform lehetővé teszi a terhelés könnyű portálását. A Docker konténerek a helyi gépén, valós gépén, virtuális gépen a datacenterben vagy a felhőben is működhetnek.
A Docker hordozhatósága és könnyűsége lehetővé teszi a terhelés dinamikus kezelését. Használhatja a Dockert alkalmazása vagy szolgáltatása telepítésére vagy leállítására. A Docker sebessége ezt szinte valós időben lehetővé teszi.
Magas terhelések és nagyobb hasznos terhelések
A Docker könnyű és gyors. Tartós, költséghatékony alternatívát nyújt a hipervizor alapú virtuális gépekhez képest. Különösen hasznos nagy terhelések mellett, például saját felhő létrehozásakor vagy platformszolgáltatásként (platform-as-service). Ugyanakkor kis- és közepes alkalmazásokhoz is hasznos, amikor maximálisan ki szeretné használni a meglévő erőforrásokat.
A Docker fő komponensei
A Docker két fő komponensből áll:
- Docker: nyílt forráskódú virtualizációs platform;
- Docker Hub: a Docker konténerek terjesztésére és kezelésére szolgáló platformszolgáltatás.
Megjegyzés! A Docker az Apache 2.0 licenc szerint terjesztésre kerül.
A Docker architektúrája
A Docker kliens-szerver architektúrát használ. A Docker kliens kommunikál a Docker démonnal, amely felelős a konténerek létrehozásáért, indításáért és elosztásáért. Mind a kliens, mind a szerver működhet ugyanazon a rendszeren, de a kliens kapcsolódhat egy távoli Docker démonhoz is. A kliens és a szerver socketen vagy RESTful API-n keresztül kommunikálnak.

Docker démon
A diagramon látható módon a démon a gazdagépen fut. A felhasználó nem közvetlenül lép kapcsolatba a szerverrel, hanem a kliens programon keresztül teszi azt.
Docker kliens
A Docker kliens, a Docker program — a fő interfész a Docker-hez. Parancsokat kap a felhasználótól és kommunikál a Docker démonnal.
A Docker belsejében
Ahhoz, hogy megértsük, miből áll a Docker, tudnunk kell három komponensről:
- képek (images)
- regiszterek (registries)
- konténerek
Képek
A Docker image is a read-only template. For example, an image can contain the Ubuntu operating system with Apache and an application running on it. Images are used to create containers. Docker makes it easy to create new images, update existing ones, or you can download images created by others. Images are a component of Docker assembly.
Regiszter
A Docker-regiszter tárolja az images. Vannak nyilvános és privát regiszterek, ahonnan letölthetünk vagy feltölthetünk imaget. A nyilvános Docker-regiszter az . Itt hatalmas gyűjtemény található az imagetekből. Ahogy tudjuk, az images lehetnek a sajátjaink, vagy használhatunk mások által készített képeket. A regiszterek a terjesztés egy alkotóelemei.
Konténerek
A konténerek hasonlítanak a könyvtárakra. A konténerek tartalmazzák mindazt, amire az alkalmazás működéséhez szükség van. Minden konténer egy image-ből készül. A konténereket létrehozzák, elindítják, leállítják, áthelyezik vagy törlik. Minden konténer elszigetelt és biztonságos platform az alkalmazások számára. A konténerek a működés egyik alkotóelemei.
Hogyan működik a Docker?
Eddig azt tudjuk, hogy:
- képesek vagyunk imaget létrehozni, amelyek tartalmazzák az alkalmazásainkat;
- képesek vagyunk konténereket létrehozni imaget-ból az alkalmazások futtatására;
- képesek vagyunk terjeszteni az images-t a Docker Hub-on vagy más image-regisztereken.
Nézzük meg, hogyan illeszkednek ezek az összetevők egymáshoz.
Hogyan működik az image?
Már tudjuk, hogy az image egy read-only sablon, amelyből konténer készül. Minden image egy szintkészletből áll. A Docker a -ot használja ezen szintek egy képpé való kombinálására. A union file system lehetővé teszi, hogy fájlok és könyvtárak különböző fájlrendszerekből (különböző ágakból) átláthatóan ráhelyeződjenek, így koherens fájlrendszert alkotva.
Az egyik oka, amiért a Docker könnyű — a szintek használata. Amikor módosítja az image-t, például frissíti az alkalmazást, létrejön egy új szint. Így nem szükséges az egész imaget cserélni vagy újra építeni, mint ami a virtuális géppel szükséges lenne, csak a szint kerül hozzáadásra vagy frissítésre. Nem kell az egész új imaget terjeszteni, csak a frissítést, ami megkönnyíti és felgyorsítja az images terjesztését.
Minden kép alapja egy alapkép. Például, az ubuntu, az Ubuntu alapképe, vagy a fedora, a Fedora elosztás alapképe. Szintén használhat képeket alapként új képek létrehozásához. Például, ha van egy apache kép, ezt használhatja alapképként webalkalmazásaihoz.
Megjegyzés! A Docker általában a képeket a Docker Hub regiszterből szerzi be.
A Docker képek ezekből az alapképekből készülhetnek, és a képek létrehozásának lépéseit utasításokként nevezik. Minden utasítás új képet vagy réteget hoz létre. Az utasítások a következő műveletek lesznek:
- parancs futtatása
- fájl vagy könyvtár hozzáadása
- környezeti változó létrehozása
- utasítás megadása, hogy mit kell futtatni, amikor a konténer elindul ebből a képből
Ezek az utasítások egy fájlban tárolódnak Dockerfile. A Docker ezt beolvassa, Dockerfile, amikor összegyűjti a képet, végrehajtja ezeket az utasításokat, és visszaadja a végső képet.
Hogyan működik a docker regiszter?
A regiszter a docker képek tárolója. A kép létrehozása után közzéteheti azt a nyilvános Docker Hub regiszterben vagy a saját személyes regiszterében.
A docker kliens segítségével már közzétett képeket kereshet, és letöltheti őket a docker gépére konténerek létrehozásához.
A Docker Hub nyilvános és privát képtárolókat biztosít. A nyilvános tárolókból való keresés és letöltés mindenki számára elérhető. A privát tárolók tartalma nem kerül be a keresési találatokba. Csak Ön és felhasználói érhetik el ezeket a képeket és hozhatnak létre belőlük konténereket.
Hogyan működik a konténer?
A konténer operációs rendszert, felhasználói fájlokat és metaadatokat tartalmaz. Mint tudjuk, minden konténer egy képből készül. Ez a kép megmondja a dockernak, mi található a konténerben, mely folyamatot kell futtatni, amikor a konténer elindul, és más konfigurációs adatokat. A Docker kép csak olvasható. Amikor a docker konténert indít, egy írás-/olvasási szintet hoz létre a kép fölött (az unió fájlrendszer használatával, ahogy korábban említettük), amelyben alkalmazás futtatható.
Mi történik, amikor indítunk egy konténert?
Vagy program segítségével, docker, vagy RESTful API használatával, a docker kliens megmondja a docker démonnak, hogy indítson egy konténert.
$ sudo docker run -i -t ubuntu /bin/bash
Nézzük meg ezt a parancsot. A kliens a dockerparancs segítségével, a "run" opcióval indul el., amely azt mondja, hogy új konténer fog indulni. A konténer indításának minimális követelményei a következő attribútumok:
- milyen képet használjunk a konténer létrehozásához. A mi esetünkben
ubuntu - a parancsot, amelyet futtatni szeretne, amikor a konténer elindul. A mi esetünkben
/bin/bash
Mi történik a háttérben, amikor elindítjuk ezt a parancsot?
A Docker a következőket teszi:
- letölt egy ubuntu: képet. a Docker ellenőrzi a kép meglétét
ubuntua helyi gépen, és ha az nem található, letölti azt a . Ha a kép megvan, akkor azt használja a konténer létrehozásához; - a konténert létrehozza: amikor a kép megérkezik, a docker azt használja a konténer létrehozásához;
- inizializálja a fájlrendszert és mountolja a csak olvasható szintet: a konténer létrejött a fájlrendszerben, és a csak olvasható szint hozzá lett adva a képhez;
- inizializálja a hálózat/híd: létrehoz egy hálózati interfészt, amely lehetővé teszi a docker számára, hogy kommunikáljon a gazdagéppel;
- IP-cím beállítása: megtalálja és beállítja a címet;
- A megadott folyamat elindítása: elindítja az alkalmazását;
- Feldolgozza és megjeleníti az alkalmazás kimenetét: csatlakozik és naplózza az alkalmazás standard bemenetét, kimenetét és hibakimenetét, hogy nyomon követhesse, hogyan működik az alkalmazása.
Most már van egy működő konténere. Kezelheti a konténerét, interakcióba léphet az alkalmazásával. Amikor úgy dönt, hogy leállítja az alkalmazást, törölje a konténert.
Használni kívánt technológiák
A Docker Go nyelven íródott, és használja a Linux kernel néhány funkcióját a fent említett funkció végrehajtásához.
Névterek (namespaces)
A Docker a technológiát használja namespace-ek izolált munkaterületek szervezésére, amelyeket konténereknek nevezünk. Amikor konténert indítunk, a docker létrehoz egy névterekből álló készletet a konténer számára.
Ez egy izolált szintet hoz létre, ahol a konténer minden aspektusa a saját névtérben fut, és nem fér hozzá a külső rendszerhez.
A docker által használt néhány névtér listája:
- pid: a folyamatok elkülönítésére;
- net: a hálózati interfészek kezelésére;
- ipc: az IPC erőforrások kezelésére. (IPC: InterProcess Communication);
- mnt: a csatolási pontok kezelésére;
- utc: a kernel izolálására és a verziógenerálás ellenőrzésére (UTC: Unix timesharing system).
Vezérlőcsoportok (control groups)
A Docker szintén a technológiát használja cgroups vagy ellenőrző csoportok. A kulcs az alkalmazás elszigeteltségében az, hogy csak azokat az erőforrásokat biztosítjuk az alkalmazás számára, amelyeket szeretnénk. Ez biztosítja, hogy a konténerek jó szomszédok legyenek. Az ellenőrző csoportok lehetővé teszik a rendelkezésre álló erőforrások elkülönítését, és ha szükséges, korlátok és határok beállítását. Például korlátozhatjuk a konténerben lévő memória mennyiségét.
Union File System
A Union File System vagy UnionFS egy fájlrendszer, amely rétegeket hoz létre, így nagyon könnyű és gyors. A Docker az UnionFS-t használja a konténer felépítéséhez szükséges blokkok létrehozására. A Docker több UnionFS lehetőséget is használhat, beleértve: AUFS, btrfs, vfs és DeviceMapper.
Konténerformátumok
A Docker ezeket az összetevőket egy olyan burkolatba összerakja, amelyet konténerformátumnak nevezünk. Az alapértelmezett formátum neve libcontainer. A Docker támogatja a hagyományos konténerformátumokat is Linuxban . A jövőben a Docker más konténerformátumokat is támogathat. Például integrálva a BSD Jails vagy a Solaris Zones szolgáltatásaival.
Forrás: habr.com
