Virtuele machine versus container: virtualisatielaag, kernel, opstarttijd, isolatie en wanneer welke

Met allebei kan één computer meerdere applicaties van elkaar geïsoleerd draaien, maar ze virtualiseren een andere laag. Een virtuele machine steunt op een hypervisor die virtuele hardware maakt, zoals CPU's, geheugen, schijven en netwerkapparaten, en elke virtuele machine draait daarop een volledig besturingssysteem, inclusief kernel. Een container deelt de kernel van het besturingssysteem van de host en gebruikt kernelfuncties zoals namespaces en cgroups om te scheiden wat processen kunnen zien en welke resources ze mogen gebruiken. Containers starten geen besturingssysteem op, dus ze zijn lichter en starten sneller, terwijl virtuele machines winnen op sterkte van de isolatie en op het aantal besturingssystemen dat ze kunnen draaien. In de cloud worden de twee meestal gecombineerd, met containers die binnen virtuele machines draaien.

KenmerkVirtuele machineContainer
VirtualisatielaagHardware: de hypervisor maakt virtuele CPU's, geheugen, schijven en netwerkapparaten en deelt ze uitBesturingssysteem: op de kernel van de host wordt gescheiden wat processen kunnen zien (proces-ID's, netwerk, bestandssysteem enz.) en welke resources ze mogen gebruiken
OS-kernelElke virtuele machine draait een eigen besturingssysteem (gast-OS), met een eigen kernelAlle containers delen de kernel van de host; containerimages bevatten geen kernel
Besturingssystemen die kunnen draaienOok een ander soort OS dan de host (bijvoorbeeld Windows op een Linux-host)Alleen wat op de kernel van de host draait; Linux-containers hebben een Linux-kernel nodig
ImagegrootteBevat een volledig OS, dus doorgaans in gigabytes uitgedruktAlleen de applicatie en de bibliotheken die ze nodig heeft, dus doorgaans veel kleiner dan een virtuele machine
OpstarttijdStart door een OS op te starten, dus duurt vaak tientallen seconden tot enkele minutenStart alleen processen, dus snel: doorgaans draait hij binnen enkele seconden
Sterkte van de isolatieSterk: scheiding op hardwareniveau, dus problemen in één gastkernel bereiken zelden andere virtuele machinesZwakker dan een virtuele machine: de kernel wordt gedeeld, dus een misbruikte kwetsbaarheid in de kernel kan de host en andere containers treffen
Efficiënt gebruik van resourcesElk gast-OS gebruikt eigen geheugen en CPU, dus er passen er minder op één machineGeen gedupliceerde besturingssystemen, dus er passen er meer in dezelfde resources
Typische toepassingenVerschillende soorten OS naast elkaar draaien, serverconsolidatie, virtuele machines bij IaaS, omgevingen die sterke isolatie vereisenMicroservices, testen en uitleveren in CI/CD, grootschalig beheer met Kubernetes, ontwikkel- en productieomgeving gelijk houden

De getalswaarden zijn typische ordegroottes en variëren per procesgeneratie en product.

Wanneer welke variant?

Virtuele machine
Wanneer je een ander soort OS dan de host moet draaien, de kernelversie en -instellingen vrij wilt kiezen, of sterke isolatie nodig hebt, bijvoorbeeld wanneer je een fysieke server met andere gebruikers deelt.
Container
Wanneer je veel kopieën van dezelfde applicatie snel wilt starten en stoppen, hetzelfde image van ontwikkeling tot productie wilt draaien, of veel kleine services op één machine wilt onderbrengen.

Veelgestelde vragen

Heb ik met containers nog virtuele machines nodig?

Dat hangt af van het gebruik. Om Linux-applicaties te draaien volstaan containers vaak. Om een ander soort OS te draaien, de kernel te wijzigen of sterke isolatie te krijgen, heb je virtuele machines nodig. In de cloud draaien containers meestal op virtuele machines van de cloudaanbieder, dus de twee worden gecombineerd in plaats van dat de ene de andere vervangt.

Waarom draaien Linux-containers op een pc met Windows of macOS?

Linux-containers hebben een Linux-kernel nodig. Tools die Linux-containers op Windows of macOS draaien, starten daarom op de achtergrond een lichte virtuele Linux-machine en draaien de containers daarin. Containers delen nog steeds de kernel van de host; in dit geval is de host het Linux-systeem binnen de virtuele machine.

Hoe kan de isolatie van containers worden versterkt?

De processen in een container als gebruiker zonder rootrechten draaien, overbodige rechten afnemen en de systeemaanroepen die ze mogen doen beperken: dat alles verkleint de gevolgen van een aanval. Is nog sterkere isolatie nodig, dan geven sommige benaderingen elke container een eigen lichte virtuele machine en draaien de container daarin.

Wat is het verschil tussen type-1- en type-2-hypervisors?

Een type-1-hypervisor (bare metal) draait direct op de hardware en draait daarop virtuele machines. Zonder extra laag biedt hij betere prestaties en isolatie en wordt hij gebruikt in servers en de cloud. Een type-2-hypervisor (hosted) draait als applicatie op een gewoon besturingssysteem; hij is eenvoudig te gebruiken en gangbaar voor ontwikkelen en testen op pc's.

Test uw begrip

Welke uitleg over de typen hypervisor is juist?

  1. AEr is een type dat rechtstreeks op de hardware draait en een type dat als toepassing op een gewoon besturingssysteem draait
  2. BHij draait altijd als toepassing op een gewoon besturingssysteem en nooit rechtstreeks op de hardware
  3. CEr is geen verschil tussen typen en alle werken uitsluitend met software zonder hardware te gebruiken
Antwoord en toelichting tonen

Antwoord: A. Er is een type dat rechtstreeks op de hardware draait en een type dat als toepassing op een gewoon besturingssysteem draait

Hypervisors zijn er in een type dat rechtstreeks op de hardware draait en besturingssystemen beheert (type 1, bare metal) en een type dat als toepassing op een gewoon besturingssysteem zoals Windows of Linux draait (type 2, hosted). Type 1 heeft geen extra laag en is uitstekend in prestaties en isolatie, dus wordt gebruikt voor servers en cloud; type 2 is gemakkelijk te gebruiken en wordt vaak gebruikt voor ontwikkeling en tests op pc's. Beide gebruiken hardware zoals CPU-virtualisatieondersteuning.

Welk verschil tussen containers en virtuele machines is juist?

  1. AContainers hebben elk een eigen besturingssysteemkernel, virtuele machines delen de kernel
  2. BContainers draaien op een hypervisor en virtuele machines alleen met functies van het besturingssysteem
  3. CContainers delen de kernel en virtuele machines draaien een eigen besturingssysteem
Antwoord en toelichting tonen

Antwoord: C. Containers delen de kernel en virtuele machines draaien een eigen besturingssysteem

Containers delen de kernel van één besturingssysteem en isoleren per groep onder meer de weergave van bestanden, processen, netwerk en bruikbare resources. Omdat niet een heel besturingssysteem wordt opgestart, zijn ze licht en starten ze snel. Virtuele machines draaien op een hypervisor elk een besturingssysteem met een eigen kernel; ze zijn zwaarder, maar de isolatie is sterker en ook andere soorten besturingssystemen kunnen draaien. Het delen van de kernel geldt voor containers; let op de keuzemogelijkheid waarin de uitleg omgekeerd is.

Welke combinatie van de Linux-kernelfuncties waarop containers berusten, namespaces en cgroups (control groups), met hun taak is juist?

  1. ANamespaces: scheiden wat een proces ziet (proces-ID's, netwerk, mounts enz.); cgroups: beperken en meten het gebruik van resources zoals CPU en geheugen
  2. BNamespaces: beperken en meten het gebruik van resources zoals CPU en geheugen; cgroups: scheiden wat een proces ziet (proces-ID's, netwerk, mounts enz.)
  3. CNamespaces: starten voor elke container een eigen kernel om de containers van elkaar te isoleren; cgroups: maken voor elke container een virtuele CPU en emuleren de hardware
Antwoord en toelichting tonen

Antwoord: A. Namespaces: scheiden wat een proces ziet (proces-ID's, netwerk, mounts enz.); cgroups: beperken en meten het gebruik van resources zoals CPU en geheugen

Een container is een gewoon proces dat op de kernel van de host draait en met twee mechanismen wordt geïsoleerd. Namespaces verdelen proces-ID's, het netwerk, mounts (de weergave van het bestandssysteem), de hostnaam enz. in groepen, zodat de processen in een container alleen hun eigen deel zien. Cgroups beperken de CPU-tijd en de hoeveelheid geheugen die een groep processen kan gebruiken, en meten het gebruik. Beide zijn kernelfuncties; een container start dus geen eigen kernel en emuleert ook geen hardware.

  1. Op een Linux-host wordt met Docker een container gestart uit een image dat op een andere distributie dan die van de host is gebaseerd, en daarin worden uname -r (een opdracht die de release van de kernel toont) en cat /etc/os-release (een opdracht die informatie over de distributie toont) uitgevoerd. Welke beschrijving van de resultaten is juist?
  2. Welke beschrijving van de relatie tussen een containerimage en een container is juist?
  3. Wat is een geschikte manier om de software op productieservers bij te werken volgens het idee van immutable infrastructure?

Oefenvragen over Basis van cloud en containers

Belangrijke termen uitgelegd

Container
Een uitvoeringseenheid die een applicatie bundelt met de bibliotheken en instellingen die ze nodig heeft, en haar geïsoleerd van andere processen uitvoert terwijl de kernel van het besturingssysteem van de host wordt gedeeld. Op Linux is ze opgebouwd uit namespaces, die de weergave van proces-ID's, het netwerk, mounts enz. scheiden, en cgroups, die het gebruik van CPU en geheugen beperken. Ze is lichter en start sneller dan een virtuele machine die een volledig besturingssysteem opstart, maar omdat ze de kernel deelt, kan ze geen kernel van een ander soort besturingssysteem dan dat van de host draaien. Containers worden gemaakt uit containerimages en aangemaakt en beheerd met tools zoals Docker en Kubernetes.
Containerimage
Een alleen-lezen sjabloon waaruit containers worden gemaakt. Het stapelt de bestanden van een applicatie, zoals uitvoerbare bestanden, bibliotheken en instellingen, in lagen en voegt configuratie toe zoals de opdracht die bij het starten wordt uitgevoerd; het bevat geen kernel van een besturingssysteem. Images worden gebouwd uit een Dockerfile of iets vergelijkbaars en via registries opgeslagen en verspreid. Een image wordt aangeduid met de naam van de repository en een tag (bijvoorbeeld web:1.4), of eenduidig met een digest die uit de inhoud wordt berekend (sha256:…). Identieke lagen worden tussen images gedeeld.
Hypervisor
Software om meerdere virtuele machines op één computer te laten draaien. Verdeelt CPU, geheugen en apparaten over het OS van elke virtuele machine en isoleert ze van elkaar. Ook virtual machine monitor genoemd.
Docker
Een veelgebruikt softwarepakket om containerimages te bouwen, images met registries uit te wisselen en containers te starten en te beheren. Het bouwt images uit de instructies in een Dockerfile en start containers met docker run. Het kan poorten publiceren met -p, gegevens bewaren in volumes en bind mounts, en het netwerk configureren. De formaten van images en containers zijn gestandaardiseerd als specificaties van het OCI (Open Container Initiative); dezelfde images kunnen dus ook met andere tools dan Docker worden gebruikt.
Kubernetes
Een orkestratieplatform dat containers op een cluster van vele machines (nodes) plaatst, hun aantal op peil houdt, ze bijwerkt en er aanspreekpunten voor biedt. Gebruikers declareren een gewenste toestand met resources zoals Deployments en Services, en controllers bekijken de werkelijke toestand en brengen die dichter bij de declaratie (reconciliatie). De kleinste eenheid is de Pod; verloren Pods worden automatisch opnieuw gemaakt, en rolling updates en autoscaling naar gelang de belasting worden ondersteund. Het wordt ook afgekort tot K8s.
Immutable infrastructure (onveranderlijke infrastructuur)
Een beheeraanpak waarbij servers (virtuele machines of containers) na het aanmaken nooit meer worden gewijzigd; als er een update nodig is, worden nieuwe gemaakt uit een image dat de wijziging bevat en in de plaats gezet, en worden de oude weggegooid. Omdat elke server uit hetzelfde image wordt gemaakt, lopen configuraties niet uiteen door opgestapelde handmatige verschillen, en teruggaan naar het vorige image herstelt eenvoudig de oude toestand. Alles wat bewaard moet blijven, zoals logs en gegevens, wordt in opslag of databases buiten de servers geplaatst.

Verwante vergelijkingen