Leerpad
De meeste moderne applicaties van vandaag vertrouwen op virtualisatie, een technique waarmee je meerdere omgevingen op één fysieke server kunt draaien. Virtualisatie heeft de manier waarop engineeringteams applicaties bouwen en uitrollen veranderd door de resourceverdeling te verbeteren, de beveiliging te versterken en de kosten te verlagen.
Virtualisatie wordt vooral gerealiseerd met twee technologieën: virtual machines en containers. Hoewel beide krachtig zijn, verschillen ze aanzienlijk in voordelen en use-cases.
In deze blogpost duiken we in de ins en outs van virtual machines en containers en helpen we je de beste technologie te kiezen om virtualisatie te implementeren, afhankelijk van jouw use-case.
Kort antwoord: containers vs virtual machines
Containers en virtual machines (VM's) maken meerdere omgevingen op één server mogelijk. Containers zijn lichtgewicht en delen het host-OS, ideaal voor snelle deployment. VM's zijn sterker geïsoleerd met een eigen OS, wat meer isolatie biedt maar meer resources kost.
Wil je meer weten? Lees dan vooral verder!
Wat zijn virtual machines?
Een virtual machine (VM) is een technologie die virtualisatie op hardwareniveau mogelijk maakt, zodat meerdere besturingssystemen op één machine kunnen draaien. Elke VM fungeert als een geïsoleerd systeem met een eigen besturingssysteem, applicatie en afhankelijkheden. Dit wordt mogelijk gemaakt door “hypervisor”-software, die verantwoordelijk is voor het toewijzen van hardwarebronnen zoals CPU-cores en opslag aan elke VM.
Een VM-architectuur bestaat doorgaans uit de volgende componenten:
- Hardware: De fysieke machine.
- Besturingssysteem: Het besturingssysteem dat op de fysieke machine is geïnstalleerd.
- Hypervisor: De software die resources aan de VM's toewijst.
- Guest OS: Het besturingssysteem dat op elke VM is geïnstalleerd.
- Applicatie: De software die in de VM draait.
- Afhankelijkheden: De libraries/binaries die nodig zijn om de applicatie te draaien.

Architectuurschema van een server met drie virtual machines. Afbeelding door de auteur.
Je kunt virtual machines configureren op basis van het aantal cores, de hoeveelheid geheugen en andere factoren. Deze flexibiliteit maakt het mogelijk om meerdere omgevingen te creëren met specifieke OS-configuraties die zijn afgestemd op je applicaties.
Wil je meer leren over de basis van virtual machines, containers, Docker en Kubernetes? Bekijk dan onze cursus Containerization and Virtualization Concepts!
Wat zijn containers?
Een container is een vorm van virtualisatie op besturingssysteemniveau, waarmee meerdere applicaties op dezelfde OS-kernel kunnen draaien. In tegenstelling tot VM's bevatten containers geen eigen OS; ze delen het host-OS, waardoor ze aanzienlijk lichter en efficiënter zijn.
Containers bestaan uit een applicatie met de bijbehorende afhankelijkheden. Ze zijn ontworpen om overal op dezelfde manier te draaien, ongeacht waar ze worden uitgerold.
Een typische containerarchitectuur bestaat uit de volgende componenten:
- Hardware: De fysieke machine.
- Host-OS: Het besturingssysteem op de fysieke machine (of VM).
- Container-engine: Software die het aanmaken en beheer van containers regelt.
- Applicatie: De software die in de container draait.
- Afhankelijkheden: De libraries/binaries die nodig zijn om de applicatie te draaien.

Architectuurschema van een server met drie containers. Afbeelding door de auteur.
Omdat containers alleen de applicatie en de afhankelijkheden inpakken, zijn ze veel kleiner en draagbaarder dan VM's. Hierdoor kun je containers eenvoudig tussen verschillende omgevingen verplaatsen (bijv. van development naar productie) zonder compatibiliteit op te offeren.
Docker is het toonaangevende platform waarmee developers containerapplicaties bouwen en draaien. Wil je ermee aan de slag, bekijk dan onze cursus Introduction to Docker.
Verschillen tussen containers en virtual machines
Hoewel het verschil op basis van de eerdere definities duidelijk lijkt, komt er meer bij kijken. In deze sectie verkennen we grondig de factoren die VM's en containers onderscheiden, waaronder architectuur, resourcegebruik, opstarttijd, isolatie en beveiliging, en portabiliteit.
Architectuur
VM's en containers verschillen in architectuur vanwege de laag waarop ze virtualiseren. Zoals we zagen, draaien VM's bovenop hypervisors en bevatten ze hun eigen besturingssysteem, applicaties en afhankelijkheden. Containers daarentegen delen de kernel van het host-besturingssysteem en pakken alleen de applicatie en de afhankelijkheden in.
Resourcegebruik
Omdat VM's een eigen OS hebben, verbruiken ze meer resources, waaronder CPU en RAM. De OS-laag verhoogt het totale resourcegebruik. Containers hebben daarentegen geen apart OS per instantie nodig. Daardoor hebben ze een veel kleinere geheugendruk en lager CPU-verbruik.
Opstarttijd
VM's hebben een langere opstarttijd, omdat hun eigen OS moet worden opgestart, wat meer overhead geeft. Omdat containers hun eigen OS niet hoeven te emuleren, hebben ze veel minder overhead en starten ze in seconden. Deze snelle opstarttijd maakt containers populair in Continuous Integration/Continuous Deployment (CI/CD)-pijplijnen, waar snelheid en efficiëntie belangrijk zijn.
Isolatie en beveiliging
Over het algemeen bieden VM's meer beveiliging dan containers door het isolatieniveau. VM's bieden volledige isolatie, omdat elke VM een eigen besturingssysteem heeft. Een beveiligingsdreiging in de ene VM heeft daardoor geen invloed op andere VM's, wat ze veiliger maakt. Containers bieden slechts gedeeltelijke isolatie omdat ze de OS-kernel delen. Een gedeelde kernel introduceert een potentieel beveiligingsrisico: als de kernel wordt gecompromitteerd, zijn alle containers kwetsbaar.
Portabiliteit
VM's zijn log en lastiger te verplaatsen tussen omgevingen. Er is ook risico op compatibiliteitsproblemen als ze worden gedraaid in een omgeving die het OS van de VM niet ondersteunt. Containers zijn door hun lichtgewicht karakter juist zeer draagbaar. Ze zijn met minimale moeite tussen omgevingen te verplaatsen. Bovendien zijn ze ontworpen om consistent te draaien in verschillende omgevingen, waardoor compatibiliteitsproblemen verdwijnen.
Hier is een tabel met de belangrijkste verschillen tussen containers en virtual machines:
|
Containers |
Virtual Machines (VM's) |
|
|
Architectuur |
Delen de host-OS-kernel; verpakken alleen applicatie en afhankelijkheden |
Draaien bovenop hypervisors; bevatten OS, applicaties en afhankelijkheden |
|
Resourcegebruik |
Lager resourcegebruik (CPU en RAM) dankzij gedeeld OS |
Hoger resourcegebruik door een apart OS voor elke VM |
|
Opstarttijd |
Snelle start (seconden), ideaal voor CI/CD-pijplijnen |
Langere opstarttijd door OS-setup, wat meer overhead geeft |
|
Isolatie en beveiliging |
Gedeeltelijke isolatie; beveiligingsrisico als de gedeelde kernel wordt gecompromitteerd |
Grotere veiligheid met volledige isolatie (elke VM heeft een eigen OS) |
|
Portabiliteit |
Zeer draagbaar tussen omgevingen; minder compatibiliteitsissues |
Log en minder draagbaar; compatibiliteitsproblemen kunnen optreden tussen omgevingen |
Use-cases voor virtual machines
Het lijkt misschien dat VM's in het algemeen meer nadelen hebben dan containers. Wat zijn dan hun use-cases? In deze sectie bespreken we een aantal belangrijke, waaronder het draaien van legacy-applicaties, ondersteuning van multi-OS-omgevingen en het afhandelen van beveiligingskritische workloads.
Legacy-applicaties draaien
VM's zijn ideaal voor het draaien van legacy-applicaties die oudere of verouderde besturingssystemen vereisen. Omdat VM's hun eigen OS-omgeving kunnen hebben, kunnen teams oudere applicaties blijven gebruiken die mogelijk niet compatibel zijn met moderne besturingssystemen.
Multi-OS-omgevingen
VM's zijn zeer effectief wanneer applicaties op meerdere besturingssystemen moeten draaien. Je kunt bijvoorbeeld VM's opzetten om Linux, Windows en andere besturingssystemen op dezelfde fysieke machine te draaien. Containers kunnen echter geen verschillende besturingssystemen op dezelfde host draaien, omdat ze de OS-kernel delen.
Beveiligingskritische workloads
Zoals je je kunt voorstellen, excelleren VM's in het afhandelen van beveiligingskritische workloads dankzij hun volledige isolatie. Elke VM werkt onafhankelijk; als één VM wordt gecompromitteerd, blijven de andere onaangetast. Containers bieden niet hetzelfde beveiligingsniveau als VM's, omdat ze het host-OS delen en daardoor samen kwetsbaarder zijn.
Use-cases voor containers
Door hun lichtgewicht karakter zijn containers krachtige troeven in moderne softwareontwikkeling. In deze sectie verkennen we use-cases waarin containers uitblinken, waaronder microservices-architectuur, CI/CD- en DevOps-pijplijnen, en portabiliteit over verschillende omgevingen.
Microservices-architectuur
Containers zijn ideaal voor applicaties met een microservices-architectuur, waarbij elke microservice een specifieke functie vervult (bijv. dataopslag, gebruikersauthenticatie).
Omdat containers applicatie-onafhankelijk zijn, kunnen microservices naast elkaar bestaan terwijl problemen in de ene service geen impact hebben op andere. Naarmate microservices populairder zijn geworden, vertrouwen engineeringteams steeds meer op containers voor het uitrollen van hun applicaties.
CI/CD- en DevOps-pijplijnen
Moderne CI/CD-pijplijnen omvatten meerdere developers die gelijktijdig aan verschillende onderdelen van een applicatie werken, met continu testen, integreren en uitrollen.
Containers zijn ideaal voor deze pijplijnen, omdat hun lage resource-overhead zorgt voor snelle opstarttijden, waardoor je eenvoudig omgevingen kunt opzetten, tests kunt draaien en code-updates kunt deployen. Deze efficiëntie heeft containers tot een vaste waarde in DevOps gemaakt, waar snelle en continue softwarelevering centraal staat.
Portabiliteit tussen omgevingen
Containers maken het eenvoudig voor developers om code te verplaatsen van development naar testing naar productie. Ze zijn ontworpen om applicaties te verpakken die succesvol draaien op verschillende systemen, wat compatibiliteitsproblemen vermindert. Daarnaast zijn containers platformonafhankelijk en kun je ze uitrollen in diverse omgevingen, zoals on-premises servers en cloudplatforms, waardoor ze geschikt zijn voor cloud-native applicaties.
Samengevat, dit zijn de aanbevolen technologieën per situatie:
|
Use-case |
Aanbevolen technologie |
Toelichting |
|
Legacy-applicaties draaien |
Virtual machines (VM's) |
VM's kunnen oudere of verouderde besturingssystemen draaien, ideaal voor legacy-compatibiliteit. |
|
Ondersteuning van multi-OS-omgevingen |
Virtual machines (VM's) |
VM's ondersteunen meerdere besturingssystemen op één fysieke machine, handig bij multi-OS-behoeften. |
|
Beveiligingskritische workloads |
Virtual machines (VM's) |
VM's bieden sterke isolatie en beschermen beveiligingskritische workloads tegen risico's uit andere omgevingen. |
|
Microservices-architectuur |
Containers |
Containers maken onafhankelijke deployment van microservices mogelijk en sluiten goed aan bij de architectuur. |
|
CI/CD- en DevOps-pijplijnen |
Containers |
Containers starten snel en hebben weinig overhead, ideaal voor snelle omgevingsopzet in CI/CD. |
|
Portabiliteit tussen omgevingen |
Containers |
Containers zijn platformonafhankelijk en draagbaar, zodat applicaties consistent draaien in diverse omgevingen. |
Kiezen tussen containers en virtual machines
De keuze tussen containers en virtual machines hangt af van je specifieke behoeften en applicatie. In deze sectie bespreken we wanneer je beter voor VM's of juist containers kunt kiezen.
Wanneer gebruik je virtual machines
Virtual machines zijn ideaal voor applicaties die multi-OS-omgevingen vereisen. Meerdere omgevingen met verschillende besturingssystemen (zoals Windows en Linux) kunnen op dezelfde fysieke hardware draaien.
Ze zijn ook bijzonder geschikt voor legacy-applicaties die draaien op oude of verouderde besturingssystemen. Tot slot: omdat VM's volledige isolatie bieden, zijn ze de beste optie voor applicaties met hoge beveiligingseisen.
Wanneer gebruik je containers
Containers zijn geschikter voor applicaties die zijn ontworpen met een microservices-architectuur, waarbij componenten onafhankelijk werken. Daarnaast maken hun snelle opstarttijden en minimale resourceverbruik ze ideaal voor CI/CD-pijplijnen, die frequente code-tests en deployments vereisen.
Dankzij hun portabiliteit zijn containers ook een uitstekende keuze voor developers die hun applicaties tussen verschillende omgevingen moeten verplaatsen.
Tot slot betekent hun platformonafhankelijke karakter dat ze eenvoudig in cloudomgevingen zijn te deployen, wat extra waardevol is nu bedrijven cloud- en hybride oplossingen omarmen.
Containers en VM's combineren
Hoewel containers en virtual machines fundamenteel verschillende virtualisatietechnologieën zijn, kun je ze effectief samen gebruiken!
De VM's bieden robuuste isolatie die een extra beveiligingslaag toevoegt en het risico op bedreigingen voor de applicatie verlaagt. Door containers in VM's te plaatsen, heb je meer controle over de toewijzing van resources, waardoor het eenvoudiger wordt om te garanderen dat elke groep containers voldoende resources heeft voor hun applicatie.
Bovendien maakt deze combinatie het eenvoudiger om op te schalen en deployments te beheren over verschillende omgevingen.

Architectuur met containers en VM's samen. Bron: Docker.
Conclusie
Virtualisatie is essentieel om resource-efficiëntie te maximaliseren en softwareontwikkelprocessen te verbeteren. Virtual machines en containers zijn twee van de populairste implementaties van virtualisatie en worden breed ingezet door teams om applicaties te ontwikkelen en uit te rollen. Een goed begrip van beide helpt je om veilige, efficiënte en schaalbare oplossingen te bouwen.
Klaar om te beginnen? Bekijk de skill track Containerization and Virtualization with Docker and Kubernetes. Deze bevat 4 essentiële cursussen die je zeker op weg helpen!
FAQs
Kan ik containers in virtual machines draaien?
Ja, je kunt containers binnen virtual machines draaien. Deze opzet komt vaak voor in productieomgevingen, waar de VM extra isolatie en beveiliging biedt, terwijl de containers efficiënt resourcegebruik en snellere deployment mogelijk maken.
Zijn er beperkingen aan het gebruik van containers in plaats van virtual machines?
Containers delen de host-OS-kernel, waardoor ze geen verschillende besturingssystemen op dezelfde host kunnen draaien. Deze beperking maakt containers minder flexibel voor applicaties die meerdere OS-omgevingen nodig hebben, vergeleken met virtual machines.
Hebben containers en virtual machines verschillende beheerhulpmiddelen nodig?
Ja, hoewel sommige tools beide kunnen beheren, gebruiken containers doorgaans tools zoals Docker en Kubernetes, die specifiek zijn ontworpen voor containerorchestratie. Virtual machines worden vaak beheerd met hypervisors (bijv. VMware, Hyper-V) en infrastructuurplatforms zoals OpenStack.
Hoe gaan containers anders met updates om dan virtual machines?
Containers zijn ontworpen voor snelle iteratie, dus updates worden vaak toegepast door nieuwe containerimages te redeployen. Virtual machines vereisen daarentegen mogelijk aparte updates voor het guest-OS en de applicaties, wat langzamer en potentieel complexer is.
Zijn containers altijd de betere keuze voor cloudomgevingen?
Niet per se. Containers zijn uitstekend voor cloud-native applicaties vanwege hun portabiliteit en efficiëntie, maar virtual machines kunnen nog steeds de voorkeur hebben voor applicaties met strikte isolatie- of multi-OS-vereisten. De keuze hangt af van de specifieke behoeften en architectuur van de applicatie.
Hoe verschilt networking tussen containers en virtual machines?
Containers gebruiken doorgaans gedeelde networking van de host, waardoor communicatie tussen containers op hetzelfde netwerk eenvoudig is. Virtual machines hebben geïsoleerde netwerkconfiguraties, wat gunstig kan zijn voor strengere beveiligingseisen maar meer setup kan vereisen voor communicatie tussen VM's.
Kan ik een applicatie van een virtual machine naar een container verplaatsen?
Het is mogelijk, maar het kan herconfiguratie vereisen. Omdat containers het host-OS delen, moet je ervoor zorgen dat de applicatie in de OS-omgeving van de container kan draaien. Legacy- of OS-afhankelijke applicaties hebben mogelijk aanpassingen nodig om correct in een container te functioneren.
Als beginnend data scientist blink ik uit in het omzetten van ruwe data in toepasbare strategieën. Ik ben gespecialiseerd in het inzetten van Python, SQL en machinelearning-technieken om impactvolle oplossingen te creëren voor data-analyse, en in het ontwerpen van robuuste ETL-pijplijnen die grote hoeveelheden data inladen en verwerken.

