Docker leren: Containerisatie
Wat is het?
Docker is een open-source platform voor het ontwikkelen, verzenden en draaien van applicaties in containers. Het lost het klassieke probleem op van "het werkt op mijn machine wel" door een gestandaardiseerde eenheid te creëren.
Zo draait je applicatie overal hetzelfde, of dat nu op je laptop is, een testserver of in de cloud.
Een container is een lichtgewicht, standalone, uitvoerbaar softwarepakket dat alles bevat wat nodig is om een stuk software te draaien: code, runtime, systeemtools, systeemlibraries en instellingen. Het deelt de kernel van het host-besturingssysteem, maar draait geïsoleerd van andere processen. Dit maakt containers veel efficiënter dan traditionele virtuele machines.
De kern van Docker is de Docker Engine, een client-server applicatie met een daemon (server), een REST API en een command-line interface (CLI). Je definieert je applicatie en haar afhankelijkheden in een simpel tekstbestand, een Dockerfile. Dit is de blauwprint voor het bouwen van een onveranderlijke (immutable) container image.
Hoe werkt het precies?
Je begint met het schrijven van een Dockerfile. Dit bestand bevat een reeks instructies, zoals welke basis-image je gebruikt (bijvoorbeeld Ubuntu of Node.js), welke commando's je uitvoert om je applicatie te installeren en welke poorten je beschikbaar stelt.
Elke instructie creëert een nieuwe laag in het image. Vervolgens bouw je met het commando docker build een image op basis van die Dockerfile.
Dit image is een sjabloon, een onveranderlijke snapshot van je complete applicatie-omgeving. Je kunt dit image uploaden naar een registry zoals Docker Hub of een privé-registry, zodat anderen het kunnen gebruiken. Vanuit dat image start je met docker run één of meerdere containers.
Een container is de daadwerkelijk draaiende instantie van je image. Je kunt containers starten, stoppen, verplaatsen en verwijderen. Ze communiceren met elkaar via netwerken en kunnen data persistent opslaan met volumes.
- Image: De onveranderlijke blauwprint (zoals een ISO-bestand).
- Container: De draaiende instantie van die blauwprint (zoals een draaiende VM).
- Dockerfile: Het instructiebestand om het image te bouwen.
- Registry: Een opslagplaats voor images (zoals GitHub voor code).
De wetenschap erachter
Docker maakt gebruik van kernelfunctionaliteiten van het Linux-besturingssysteem om containers te isoleren en beveiligen, wat je kunt leren in onze cursus voor beginners. De twee belangrijkste technologieën zijn namespaces en cgroups.
Namespaces zorgen voor isolatie. Ze creëren een afgesloten zicht op het systeem voor een proces. Zo heeft elke container zijn eigen proces-ID (PID), netwerkinterface (NET), bestandssysteem (MNT) en hostname.
Vanuit de container lijkt het alsof het een eigen, volledig systeem is.
Control groups (cgroups) beheren en beperken het resourcegebruik van een container. Je kunt hiermee limieten instellen voor het CPU-geheugen, het netwerk-I/O en het schijfgebruik. Dit voorkomt dat één container alle resources van de host opslokt en zorgt voor eerlijke verdeling. Een derde, cruciaal onderdeel is het Union File System (zoals OverlayFS).
Dit systeem maakt de efficiënte laag-op-laag structuur van images mogelijk. Wijzigingen in een draaiende container worden opgeslagen in een bovenste, schrijfbare laag, terwijl de onderliggende image-lagen gedeeld en onveranderd blijven. Dit bespaart enorme hoeveelheden schijfruimte en versnelt het opstarten.
Voordelen en nadelen
Voordelen
- Consistentie: De container draait overal hetzelfde, van ontwikkeling tot productie.
- Efficiëntie: Containers zijn lichtgewicht, delen de OS-kernel en starten in seconden.
- Isolatie: Processen en applicaties zijn van elkaar gescheiden, wat de stabiliteit en veiligheid ten goede komt.
- Schaalbaarheid: Het is eenvoudig om meerdere kopieën van een container te draaien voor load balancing.
- Microservices: Docker is ideaal voor het ontwikkelen van applicaties als een verzameling kleine, onafhankelijke diensten.
Nadelen
- Complexe persistentie: Data in een container is tijdelijk. Je moet bewust volumes of externe databases gebruiken voor dataopslag.
- Beveiliging: Containers delen de kernel, dus een kwetsbaarheid in de kernel kan alle containers beïnvloeden. Goed beheer is essentieel.
- Leercurve: Het concept van containerisatie, Dockerfiles en orchestratie (zoals Kubernetes) vereist een investering in tijd om te leren.
- Grafische applicaties: Het draaien van GUI-applicaties in containers is mogelijk maar complexer dan command-line tools.
Voor wie relevant?
Docker is relevant voor iedereen die moderne software ontwikkelt, test of deployt. Het is een fundamentele vaardigheid geworden in de IT-sector. Softwareontwikkelaars gebruiken Docker om een identieke ontwikkelomgeving te creëren, ongeacht hun lokale setup.
Ze kunnen complexe stacks (zoals een database, cache en webserver) met één commando opstarten.
DevOps- en SRE-teams zijn de grootste gebruikers. Zij beheren de deployment pipeline, schaalbaarheid en monitoring van containergebaseerde applicaties in productie. Leer DevOps-tools beheersen.
Kennis van Docker is hierbij een harde vereiste. Systeembeheerders en Cloud Engineers gebruiken Docker om infrastructuren efficiënter en voorspelbaarder te beheren. Het maakt het eenvoudig om diensten te migreren tussen cloudservers of on-premise hardware.
Data Scientists en Machine Learning Engineers pakken hun modellen en afhankelijkheden in een container, zodat de trainingsomgeving reproduceerbaar is en het model eenvoudig als API kan worden ontsloten.
Voor studenten en professionals die zich willen omscholen is Docker een uitstekende investering. Het toont praktische kennis van moderne software-ontwikkelprocessen en is een opstap naar geavanceerde onderwerpen als container orchestratie met Kubernetes en cloud-native architecturen.