Virtuele machines en Docker: een zwaar huis en een lichte tent

“Installeer een Linux-virtuele machine en bouw exact dezelfde omgeving na.”

Drie maanden nadat ik bij het bedrijf was begonnen, hing er een onrustige sfeer op kantoor. De enige senior developer van het team was overgeplaatst naar een ander project en had het zo druk met zijn eigen spullen inpakken dat er nauwelijks sprake was van overdracht, terwijl de teamlead al lang was afgehaakt van de dagelijkse ontwikkelpraktijk en behoorlijk ver afstond van recente technologische trends.

Op een dag riep de teamlead me bij zich. “Als je senior weg is, ben jij de enige die nog de servers kan beheren. Zelfs als de server eruit ligt, moet je hem zelfstandig kunnen herstellen. Installeer Linux als virtuele machine, VM, op je huidige ontwikkellaptop, Windows, en probeer precies dezelfde omgeving op te bouwen als op de productie-server.”

Vanaf die dag begon mijn geploeter. Ik installeerde VMware, downloadde het Ubuntu-ISO-bestand, en alleen dat installeren kostte me al een halve dag. Ik groef door de bedrijfswiki om Java, Node.js en PostgreSQL te installeren. Ik dacht: “Nieuw is vast beter,” dus ik installeerde Java 17, maar ontdekte vervolgens dat de legacy-code nog van Java 8 uitging en niet eens wilde builden. Dus moest ik alles verwijderen en opnieuw installeren. Telkens als ik één regel code veranderde, moest ik mvn build draaien, het jar-bestand naar de VM verplaatsen en het daar uitvoeren. Het was pure ellende.

Toen schoot er ineens een vraag door mijn hoofd. “Wacht even. De vorige keer dat we naar productie deployden, was het toch gewoon klaar na één enkele docker service update-opdracht?”

Mijn lokale virtuele machine was zó zwaar en vereiste een berg aan configuratie, dus wat was dat ding genaamd Docker op de productie-server eigenlijk, dat een update met maar één opdracht kon afhandelen?

Docker is de lichtste manier om een hele omgeving te verplaatsen.

De zware oplossing: de virtuele machine

De aanpak die mijn teamlead mij opdroeg, Linux bovenop Windows installeren, is precies wat een virtuele machine, VM, is. Het is alsof je een compleet ‘virtueel huis’, een guest OS, bouwt boven op een fysieke computer, de host.

Uiteindelijk isoleert een VM de omgeving wel degelijk betrouwbaar, maar voor ontwikkeling of deployment is ze simpelweg te zwaar en te traag om telkens heen en weer te blijven verplaatsen.

De lichte revolutie: Docker

Daarom verscheen Docker, oftewel containertechnologie. Docker bouwt niet een volledig huis zoals een VM dat doet. In plaats daarvan zet het een tent op.

De update-opdracht die ik op de productie-server uitvoerde, installeerde dus geen zwaar besturingssysteem opnieuw. Ze deed alleen maar “de oude tent afbreken en een nieuwe tent opzetten met de nieuwe versie van de code erin.” Natuurlijk kon dat alleen maar razendsnel klaar zijn.

[Code Verification] Is Docker echt zo licht?

Laten we niet alleen maar zeggen dat Docker licht is, maar het ook echt controleren. Als het doel is om een Linux-, Ubuntu-, omgeving te draaien, dan is het verschil tussen een VM en Docker enorm.

# Ubuntu draaien via Docker (image wordt gedownload indien nodig)
$ docker run -it ubuntu:latest /bin/bash

Resultaat:

Op het moment dat ik op Enter drukte, zat ik al in een Ubuntu-omgeving. Dat is mogelijk omdat een Docker-container geen echt besturingssysteem is. Het is slechts “een geïsoleerde ruimte die de kernel van het host-OS, mijn computer, leent terwijl het doet alsof het een apart OS is.”

Praktisch advies: de echte reden om Docker te gebruiken

Sinds we Docker op het werk hebben ingevoerd, is mijn leven compleet veranderd.

Tot slot: we leveren geen uitvoerbaar bestand, maar een omgeving

Met de komst van Docker is het ontwikkelparadigma veranderd. We sturen niet langer alleen broncode, .java, naar de server. We vriezen ook de OS-instellingen, libraries en omgevingsvariabelen die die code nodig heeft in als één ‘image’ en versturen het hele pakket.

Maar hoe wordt deze magische ‘Docker image’ eigenlijk gemaakt? Is het gewoon een gecomprimeerd bestand? Verrassend genoeg blijkt een Docker image uit meerdere lagen, layers, opgestapeld te zijn, net als een taart.

Laten we de volgende keer het geheim achter Dockers efficiëntie uitpluizen: images en hun gelaagde structuur.

Plaats een reactie