← Vissza a bloghoz Alapok

Konténer vs. virtuális gép: mi a különbség?

A konténerek és a virtuális gépek is izolációt adnak, de teljesen máshogyan. Megnézzük a különbségeket, az előnyöket és hogy mikor melyiket érdemes választani.

Amikor először találkozol a Dockerrel, jogosan merül fel a kérdés: „de hiszen virtuális gépeket már régóta használunk, miben más ez?” A konténerek és a virtuális gépek (VM-ek) első ránézésre hasonló problémát oldanak meg: izolált környezetet adnak, amelyben az alkalmazás biztonságosan futtatható. A működésük azonban gyökeresen eltér, és ennek komoly gyakorlati következményei vannak. Nézzük meg, mi a különbség, és mikor melyiket érdemes választanod.

Hogyan működik egy virtuális gép?

A virtuális gép lényege, hogy egy fizikai szerver hardverét szoftveresen szimulálja. A folyamat középpontjában a hypervisor áll (például VMware, VirtualBox, KVM vagy Hyper-V), amely a fizikai gép erőforrásait felosztja több virtuális gép között.

Minden egyes virtuális gép tartalmaz:

  • egy teljes vendég operációs rendszert (guest OS), saját kernellel,
  • a szükséges rendszereszközöket és könyvtárakat,
  • végül magát az alkalmazást.

Ez azt jelenti, hogy ha öt virtuális gépet futtatsz, akkor öt teljes operációs rendszer fut egyszerre, mindegyik saját memóriával, saját kernellel. Ez erős izolációt ad, hiszen a VM-ek gyakorlatilag különálló számítógépek, de cserébe jelentős erőforrást igényel, és a VM-ek indítása lassú, gyakran percekig tart.

Hogyan működik egy konténer?

A konténer egészen más megközelítést használ. Nincs vendég operációs rendszer és nincs hypervisor. Ehelyett az összes konténer megosztja a gazdagép kernelét, és a Linux kernel beépített izolációs mechanizmusaira támaszkodik:

  • namespace-ek – Ezek gondoskodnak arról, hogy minden konténer a sajátjának lássa a folyamatokat, a hálózatot, a fájlrendszert és a felhasználókat. Egy konténer nem látja a másik konténer folyamatait.
  • cgroups (control groups) – Ezek korlátozzák és számolják el az erőforrás-felhasználást, például hogy egy konténer mennyi CPU-t vagy memóriát használhat.

Mivel nincs külön kernel és nincs teljes OS minden példányban, a konténer csak az alkalmazást és annak közvetlen függőségeit tartalmazza. Ezért indul el másodpercek, sőt tört másodpercek alatt, és ezért fér el sokkal több konténer ugyanazon a hardveren. Ha érdekel a részletes működés, olvasd el a Hogyan működik oldalt.

💡 Tipp: Mivel a konténerek a gazdagép kernelét használják, egy Linux-alapú konténer natívan Linux kernelt igényel. Windowson és macOS-en a Docker Desktop egy könnyű virtuális gépet futtat a háttérben, amely biztosítja ezt a Linux kernelt.

A két megközelítés összehasonlítása

Az alábbi táblázat összefoglalja a legfontosabb különbségeket:

SzempontVirtuális gépKonténer
Izoláció szintjeHardver szintű, nagyon erősFolyamat szintű, kernel-megosztott
Indítási időPercekMásodpercek vagy kevesebb
MéretGigabájtok (teljes OS)Megabájtok (csak az app)
Erőforrás-igényMagasAlacsony
Sűrűség (egy gépen)Néhány tucatSok száz is lehet
KernelSaját, külön kernelMegosztott gazdagép-kernel
HordozhatóságNehézkesebbKiváló

A számok jól mutatják a lényeget: a konténerek gyorsabbak, kisebbek és sűrűbben telepíthetők, míg a virtuális gépek erősebb, hardver szintű izolációt adnak.

Mikor melyiket válaszd?

A választás nem arról szól, hogy melyik a „jobb”, hanem hogy melyik illik a feladatodhoz.

Konténert érdemes választanod, ha:

  • gyors indítás és skálázás a cél,
  • microservice architektúrát építesz,
  • CI/CD folyamatban egységes build- és tesztkörnyezetre van szükséged,
  • sok hasonló alkalmazáspéldányt szeretnél futtatni minimális erőforrásból,
  • a hordozhatóság (gépek és felhők között) fontos.

Virtuális gépet érdemes választanod, ha:

  • különböző operációs rendszereket kell futtatnod ugyanazon a hardveren (például Windows és Linux egyszerre),
  • erős, hardver szintű izolációra van szükséged biztonsági okokból,
  • olyan régi (legacy) alkalmazást üzemeltetsz, amely teljes OS-környezetet igényel,
  • kernelszintű beavatkozásra vagy egyedi kernelmodulra van szükséged.

⚠️ Figyelem: A konténerek izolációja gyengébb, mint a VM-eké, mert a kernel megosztott. Ha kevéssé megbízható, harmadik féltől származó kódot futtatsz, fontold meg a kettő kombinálását vagy további biztonsági rétegek bevezetését.

Lehet a kettőt kombinálni?

Igen, és a gyakorlatban gyakran így is történik. Nagyon elterjedt minta, hogy virtuális gépeken futtatnak konténereket. Ilyenkor a VM adja az erős, hardver szintű izolációt és a kernel testreszabhatóságát, a konténerek pedig a gyors telepíthetőséget és a hordozhatóságot.

A nagy felhőszolgáltatók kezelt Kubernetes-megoldásai is gyakran így működnek: a háttérben virtuális gépek futnak, ezeken pedig a te konténereid. Így a két technológia előnyei összeadódnak. Ez azt is megmutatja, hogy a konténer és a VM nem egymás versenytársai, hanem inkább kiegészítik egymást.

Összefoglalás

  • A virtuális gép teljes operációs rendszert futtat hypervisor felett, erős izolációval, de nagy erőforrásigénnyel.
  • A konténer a gazdagép kernelét osztja meg, namespace-ekkel és cgroups-szal izolál, ezért gyors, kicsi és sűrűn telepíthető.
  • A konténer az ideális választás skálázáshoz, microservice-ekhez és CI/CD-hez; a VM az erős izolációhoz és a vegyes OS-környezetekhez.
  • A kettő kombinálható, és a gyakorlatban gyakran kombinálják is.

Most, hogy érted a különbséget, ideje a gyakorlatra térni. Kezdd a Kezdő lépések útmutatóval, vagy ismerd meg a legfontosabb fogalmakat a Mi az a Docker? cikkben. Ha pedig már mélyebbre néznél, a Docker alapfogalmak kisszótár segít eligazodni a kifejezések között.