Een inleiding tot containers, VM’s en Docker

Blog | Cloud Managed Services Een inleiding tot containers, VM’s en Docker

Als je een developer of engineer bent, is de kans groot dat je op zijn minst gehoord hebt van Docker: een handig hulpmiddel voor het verpakken, verzenden en runnen van applicaties in ‘containers’.

Ongeacht of je een onmiddellijke toepassing voor Docker in gedachten hebt, is het belangrijk om een aantal fundamentele concepten te begrijpen rondom ‘containers’ en hoe dit zich verhoudt tot een Virtuele Machine (VM).

Wat zijn VM’s en Containers?

VM’s en Containers zijn gelijkwaardig in hun doel: het isoleren van een applicatie en haar afhankelijkheden in een zelfstandige unit die overal kan draaien. Daarnaast maken containers en VM’s de noodzaak van fysieke hardware overbodig, waardoor computerresources efficiënter benut kunnen worden.

“Maar, is Docker een virtuele machine?”

Docker oogt in eerste instantie weliswaar op een virtuele machine, maar de functionaliteiten zijn niet hetzelfde. Anders dan Docker bevat een virtuele machine een compleet besturingssysteem. Het functioneert onafhankelijk en gedraagt zich als een computer. Docker deelt enkel de resources van de hostmachine om zijn omgeving te laten draaien.

Het belangrijkste verschil tussen containers en VM’s ligt in de architecturale opzet. Onderstaand worden de concepten nader toegelicht. 

Virtuele machines

Een ‘virtuele machine‘ werd oorspronkelijk door Popek en Goldberg gedefinieerd als een efficiënte, geïsoleerde kopie van een echte computer. VM’s vormen een soort virtualisatie van servers. Met betrekking tot VM’s bestaan enkele belangrijke aspecten:

  • Hypervisor
  • Host machine

Een hypervisor is een stukje software, firmware of hardware waar VM’s op draaien. De hypervisors zelf draaien op fysieke computers, de zogenaamde ‘host machine’. De hostmachine voorziet de VM’s van resources, waaronder RAM en CPU. Deze resources zijn verdeeld over VM’s en worden naar gelang van de behoeften verdeeld.

De VM die op de host machine draait (wederom met hypervisor) wordt veelal aangeduid als ‘Guest machine‘. De host machine bevat zowel de applicatie als alles wat nodig is om die applicatie te draaien (e.g. system binaries and libraries). Het draagt ook een volledige eigen gevirtualiseerde hardwarestack, inclusief gevirtualiseerde netwerkadapters, opslag en CPU – wat betekent dat het een eigen volwaardig guest operaringsystem bezit.

Van binnenuit gedraagt de host machine zich als een eigen unit, met eigen dedicated resources. Van de buitenkant weten we dat het een VM betreft – die resources uitwisselt die door de hostmachine worden geleverd.
Je vraagt je misschien af waarom deze extra ‘hypervisor’ -laag tussen de VM en de host machine überhaupt nodig is.
Aangezien de VM een eigen virtueel besturingssysteem heeft, speelt de hypervisor een essentiële rol om de VM’s te voorzien van een platform om Guest OS te beheren en uit te voeren. Het maakt het mogelijk dat de host machines hun resources delen tussen de virtuele machines die als ‘guest’ hierop draaien.

Landing page elements 960 x 620 (14)

Containers

In tegenstelling tot een VM die hardwarevirtualisatie biedt, biedt een container virtualisatie op systeemniveau door de ‘user space’ te onttrekken. Je zult zien wat de term ‘container’ betekent als we naar verschillende definities van het begrip kijken.
Er zijn een hele reeks definities van wat een container is.

  • In het Unix/Linux System Admin boek wordt een container gedefinieerd als een geïsoleerde groep van processen die beperkt zijn tot hun eigen filesystemen en proces namespaces.
  • Docker beschrijft een container als een standaardeenheid van software die code en al zijn afhankelijkheden verpakt zodat een applicatie snel en betrouwbaar van de ene naar de andere computing omgeving verplaatst kan worden.

Containers lijken in principe op een VM. Ze hebben bijvoorbeeld private ruimte voor gegevensverwerking, kunnen commando’s als root uitvoeren, hebben een private netwerkinterface en IP-adres, staan aangepaste routes en iptable rules toe, kunnen bestandssystemen managen, enz.
Het enige grote verschil tussen containers en VM’s is dat containers de kernel van het hostsysteem delen met andere containers.

De architectuur op het niveau van het besturingssysteem wordt verspreid over de containers. Containers nemen alleen de user space in en niet de kernel of de virtuele hardware, zoals bij een VM het geval is. Elke container krijgt zijn eigen geïsoleerde user space om meerdere containers op één enkele host machine te laten draaien. De enige aspecten die vanaf de grond worden gecreëerd zijn de binaire bestanden en de libraries. Hierom zijn de containers zo licht in gebruik.

Landing page elements 960 x 620 (15)

Waar komt Docker vandaan?

Docker is een tool die ontworpen is om het creëren, implementeren en uitvoeren van applicaties te vereenvoudigen door gebruik te maken van containers. Het is een open-source project gebaseerd op Linux containers. Het maakt gebruik van Linux Kernel functies zoals namespaces en control groups om containers te creëren bovenop een operating system.

Waarom zou je Docker als developer gebruiken

Docker heeft het voor iedereen – developers, systeembeheerders, architecten en anderen – veel gemakkelijker gemaakt om gebruik te maken van containers, om snel en efficient draagbare applicaties te ontwikkelen, testen en te implemtenteren.

Docker doet zijn slogan: “Build once, run everywhere”, niet tekort aangezien het ongemodificeerd kan draaien op elke gewenste cloud en in combinatie met elke gewenste public cloud-provider. Hieronder staan een aantal voordelen waarom Docker zo geweldig is om toe te passen. 

  • Docker is een multi-platform — containers kun je installeren op elk gewenst systeem.
  • Docker is snel — aangezien containers gewoon een sandbox-omgeving vormen die op de kernel draaien, nemen zij minder resources in beslag.
  • Docker is modulair en schaalbaar — Docker maakt het eenvoudig om de functionaliteit van een applicatie op te splitsen in individuele containers. Zo kan het zijn dat je Postgres database in de ene container draait, je Redis server in een andere, terwijl ook je Node.js applicatie in een andere container draait.
  • Geen moeilijkheden meer bij het inrichten van een werkomgeving. Zodra Docker is geconfigureerd, hoeft je nooit meer handmatig je afhankelijkheden opnieuw te installeren.
  • Je houdt je werkomgeving schoon, aangezien elke omgeving geïsoleerd is kun je deze op elk gewenst moment verwijderen, zonder dat dit gevolgen heeft voor andere omgevingen.

Fundamentele Docker begrippen

Nu het grote geheel duidelijk is geworden, bekijken we de fundamentele elementen van Docker.

Docker engine is de laag waarop Docker draait. Het biedt tooling voor het beheren van containers, images, build, en nog veel meer. Het draait van nature op Linux-systemen en bestaat o.a. uit:

  1. Een Docker Daemon die actief is op de host computer.
  2. Een Docker Client die vervolgens met de Docker Daemon communiceert om commando’s uit te voeren.
  3. Een REST API voor interactie met de Docker Daemon op afstand.

De Docker Client is datgene waarmee je zelf, als eindgebruiker van Docker communiceert. Beschouw het als de gebruikersinterface voor Docker. Als je bijvoorbeeld het onderstaade commando uitvoert dan communiceer je met de Docker Client, die vervolgens je opdracht doorgeeft aan de Docker Daemon.

De Docker daemon voert de opdrachten uit die naar de docker-client worden gestuurd, zoals het opbouwen, uitvoeren en distribueren van je containers. De Docker Daemon draait op de host machine, maar als gebruiker schakel je nooit rechtstreeks met de Daemon.

Elk Dockerfile is een script, samengesteld uit verschillende commando’s (instructies). Deze worden gebruikt voor het organiseren van zaken en helpen enorm bij deployments, doordat het proces van begin tot eind wordt vereenvoudigd. Als je Dockerfile is opgezet, dan gebruik je het Build commando om de image te creëeren.

Een Docker image is een bestand, bestaande uit meerdere lagen, dat wordt gebruikt om code uit te voeren in een Docker-container. Een image is in principe opgebouwd uit de instructies voor een volledige en uitvoerbare versie van een applicatie.

Images definiëren wat je verlangt van jouw packaged applicatie en haar afhankelijkheden en welke processesen worden uitgevoerd wanneer het gelanceerd wordt. De opgebouwde lagen in de image bevatten de kern van Docker’s lichtgewicht, maar toch zeer krachtige structuur. Docker maakt gebruik van een Union File System om dit te verwezenlijken.

Docker gebruikt Union File Systems om een image samen te stellen. Een Union File System is te beschouwen als een opgestapeld bestandssysteem, wat betekent dat bestanden en mappen van afzonderlijke bestandssystemen (bekend als branches) transparant over elkaar heen geplaatst kunnen worden om zodoende één enkel bestandssysteem te vormen.

Volumes zijn het ‘data’ deel van een container, geconfigureerd wanneer een container wordt gecreëerd. Volumes stellen gebruikers in staat om de gegevens van een container te behouden en te delen. De ‘volumes’ zijn afgescheiden van het standaard Union File System en bestaan als normale directories en bestanden op het host-bestandssysteem.

Dus zelfs als je een container vernietigt, bijwerkt of opnieuw opbouwt, blijven de datavolumes ongewijzigd. Daarnaast kunnen volumes gedeeld en hergebruikt worden onder meerdere containers.

Docker containers

Een Docker-container, zoals eerder vermeld, verpakt de software van een applicatie in een onzichtbare doos met alles wat de applicatie nodig heeft om te functioneren. Dat omvat het besturingssysteem, broncode, runtime, systeemtools, libraries, enz. Docker containers zijn opgebouwd uit Docker images.

Docker creëert een netwerkinterface zodat de container kan communiceren met de local host, voegt een beschikbaar IP-adres toe aan de container en voert het proces uit dat is opgegeven voor het uitvoeren van de applicatie bij het definiëren van de image.
Als een container eenmaal succesvol is ontworpen, kan deze in elke omgeving worden uitgevoerd zonder wijzigingen aan te brengen.

Docker hub

Docker gebruikers profiteren daarnaast van het steeds rijker wordende ecosysteem van Docker Hub, dat je kunt beschouwen als een app-store voor Docker images. Docker Hub heeft vele duizenden images die door de community zijn ontwikkeld en die direct beschikbaar zijn voor gebruik.
Het is ongelooflijk eenvoudig om te zoeken naar images die voldoen aan jouw behoeften, gereed voor gebruik en met weinig tot geen aanpassingen te implementeren.