Waarom containers geen virtuele machines zijn

Kubernetes, Docker, het Open Container platform: om containers kan je niet meer heen. Wat zijn de dingen nu precies, en hoe verschillen ze van gewone applicaties of virtuele machines?

Containers zijn hip. Soms lijkt het wel dat wie vandaag applicaties uitrolt en daar geen containers voor gebruikt, uit het stenen tijdperk komt. Zoals vaak bij een hip IT-concept, is het soms moeilijk om een stapje achteruit te zetten en eens te kijken waar het nu precies om gaat. In dit stuk gaan we back to basics.

Docker

Vandaag staan containers min of meer synoniem met Docker. Het concept ‘container’ startte zijn offensief op servers wereldwijd in 2013, toen Docker Inc. de eerste versie van zijn containervirtualisatiesoftware lanceerde. In amper zes jaar tijd evolueerde de Docker-versie van containers tot een standaard, ondersteund door alle grote organisaties. Van Microsoft over Amazon en Google tot IBM en VMware: allemaal zetten ze hun schouders onder het Open Container Initiative.

Containers bieden een vorm van virtualisatie die doet denken aan virtuele machines, maar er toch sterk van verschilt. Ter opfrissing: virtuele machines (VM’s) zijn, kort door de bocht, gedigitaliseerde computers. Een besturingssysteem op een virtuele machine draait op virtuele (dus digitale) hardware. Die hardware wordt gevirtualiseerd door een softwarelaag genaamd de hypervisor, die op zijn beurt op de echte fysieke hardware draait. Dankzij virtualisatie kunnen verschillende virtuele machines op één fysieke server draaien.

 

Containers bieden een vorm van virtualisatie die doet denken aan virtuele machines, maar er toch sterk van verschilt.

 

Virtuele machines zijn relatief logge dingen. Naast de applicatie(s) die ze draaien, bevatten ze een volledig besturingssysteem inclusief de nodige drivers. Zo is een VM al snel enkele gigabytes groot. Een VM verbruikt naast die opslagruimte ook geheugen en cpu-kracht van de hostserver om de hele virtuele computer te ondersteunen.

Wel virtueel, geen machine

Een container lijkt op een VM omdat het ook een vorm van virtualisatie is. Een applicatie die in een container draait, draait dus evenmin rechtstreeks op fysieke hardware. In tegenstelling tot een VM bevat een container echter geen volledig besturingssysteem. In de container vind je één applicatie, die verder omringd is door alle dependencies: alle bibliotheken, drivers en stukken software die de applicatie in kwestie effectief nodig heeft. Een container heeft geen hypervisor nodig, maar praat rechtstreeks met de kernel van het besturingssysteem waar hij op draait. In casu is dat doorgaans een Linux-kernel. Een Linux-systeem kan meerdere containers draaien.

Een gecontaineriseerde Python-applicatie zit bij wijze van voorbeeld in een container samen met Python en eventuele relevante bibliotheken die nodig zijn om de app te draaien. De container zelf draait vervolgens op een versie van Linux, die op zijn beurt op een server staat. Als een ontwikkelaar de app heeft gebouwd met Python 2.7, dan zit die exacte versie mee in de container. De container is dus volledig onafhankelijk van eventuele software die op het gastbesturingssysteem draait. Python hoeft met andere woorden niet geïnstalleerd te staan op het host-OS, en als er een verkeerde versie op geïnstalleerd staat, is dat evenmin een probleem.

Linux op dieet

In de praktijk zijn volledige versies van Linux doorgaans te zwaar en nodeloos uitgebreid om containers te ondersteunen. Afgeslankte versies zijn de norm. Container Linux is, zoals de originele naam suggereert, erg geschikt, net als Ubuntu Core of Rancher OS. Red Hats versie heet Project Atomic en is gebaseerd op CentOS en Fedora, terwijl de variant van VMware door het leven gaat als Photon OS.

 

Dankzij de open standaard zijn containers extreem draagbaar.

 

Dankzij de open standaard zijn containers extreem draagbaar. Een container draait probleemloos op een server in de cloud, on premises, op een desktop-workstation, de laptop van een ontwikkelaar, een krachtige NAS… Zolang de computer of server Docker-compatibel is, kan een container er probleemloos op draaien. Het is daarom veel eenvoudiger om containers uit te rollen waar ze nodig zijn in vergelijking met virtuele machines.

Vederlicht en supersnel

Bovendien zijn containers een stuk lichter. Omdat ze enkel een app en de relevante dependencies bevatten, zijn ze vaak slechts enkele megabytes groot. Daardoor starten ze veel sneller op dan virtuele machines, waarbij een heel OS mee moet opstarten. Een bijkomend logisch gevolg is natuurlijk dat een app in een container veel minder hardwarekracht opeist van de computer of server waarop hij uiteindelijk draait, dan diezelfde app in een virtuele machine.

Containers werken zoals gezegd zonder hypervisor, maar moeten natuurlijk wel beheerd worden. Dat gebeurt door specifieke software. Kubernetes is het bekendste voorbeeld van zo’n containerorchestratieplatform. Dergelijke software maakt het eenvoudig om vliegensvlug honderden of duizenden containers op te starten om tegemoet te komen aan actuele noden. De software helpt je bovendien om te bepalen hoe de container zich verhoudt tot het netwerk, welke data toegankelijk is… Op Kubernetes gingen we in een ander artikel al dieper in.


Lees dit: Kubernetes: wat is het en waarom verovert het in snel tempo de wereld?


In combinatie met de cloud is de schaalbaarheid van een containergebaseerde infrastructuur enorm. Onder andere Google is een grote fan van containers, vooral omwille van die reden. Apps in containers kunnen opgestart worden wanneer nodig, en als de hoeveelheid containers de limieten van de hardware van een server bereikt, is het eenvoudig om een nieuwe server op te starten.

Geen concurrentie met VM’s

Omwille van bovenstaande vergelijkingen kan je de indruk krijgen dat containers de opvolger zijn van virtuele machines, maar dat is te kort door de bocht. In sommige scenario’s zijn containers inderdaad geschikter dan VM’s, maar in de praktijk zijn ze complementair. Containers kunnen perfect op een gevirtualiseerd Linux-systeem draaien, dat dan op zijn beurt op een fysieke server draait. Een dergelijke aanpak biedt extra isolatie van server en netwerk, wat doorgaans als veiliger wordt gezien.

 

Virtuele machines en containers zijn complementair.

 

Hoewel Docker-containers veruit de populairste containers zijn, zijn het niet de enige. Het concept bestaat al veel langer dan Docker Inc. Zo lanceerde Sun Microsystems in 2005 al Solaris Containers en zagen Linux Containers (LSX) in 2008 het levenslicht. Ook vandaag hebben containers buiten Docker nog een nut.

Meer dan alleen Docker

Een bekende implementatie vind je onder andere in de nieuwste versies van Ubuntu Linux. Daar kan je applicaties samen met hun dependencies downloaden in zogenaamde snaps. Snaps hebben erg gelijkaardige voordelen. Doordat ze hun dependencies mee hebben, zijn ze minder afhankelijk van de specifieke Linux-versie waar ze op draaien. Zo kunnen ontwikkelaars de stabiliteit van hun apps beter garanderen. Snaps draaien echter op het besturingssysteem van de gebruiker, en worden daar ook bediend. Docker-containers zijn eigenlijk niet bedoeld voor lokaal gebruik. Ze worden doorgaans over het netwerk benaderd.

De essentie

Vatten we al het bovenstaande zo kort mogelijk samen, dan kan je onthouden dat containers gevirtualiseerde applicaties zijn die samen met hun dependencies verpakt zitten volgens een populaire opensourcestandaard. Dat maakt ze efficiënt, licht, snel, flexibel en onafhankelijk van het OS waarop ze staan. Die voordelen, gecombineerd met de schaalbaarheid, maken containers zo populair vandaag.