
Wat is Docker en hoe werkt het?
docker-client verzendt opdrachten via een REST API naar de dockerd-daemon, die
bouwt afbeeldingen en voert er containers van uit.Waarom het bestaat. Met Docker kunt u een applicatie met al zijn afhankelijkheden (bibliotheken, configuratie, runtime) in één enkel artefact (een image) verpakken en deze op dezelfde manier uitvoeren op een ontwikkelaarslaptop, in CI en in productie. Dit lost het klassieke probleem van "werkt op mijn machine" op.
Containers versus virtuele machines. Een VM virtualiseert hardware en levert een volledig gastbesturingssysteem met zijn eigen kernel. Een container is een geïsoleerd proces dat de hostkernel gebruikt. Als gevolg hiervan zijn containers lichter, starten ze in fracties van een seconde en gebruiken ze minder hulpbronnen. Maar een container is geen lichtgewicht VM: hij is gekoppeld aan de hostkernel en de isolatiegrens ervan is zwakker dan die van een VM. Een VM heeft door hardware afgedwongen isolatie, terwijl een kwetsbaarheid in de gedeelde kernel mogelijk uit een container kan worden ontsnapt - dat is de afweging voor snelheid en dichtheid. De host moet overeenkomen met het containertype: Linux-containers hebben een Linux-kernel nodig, Windows-containers hebben een Windows-kernel nodig. Op macOS en Windows draait Docker Desktop op transparante wijze een kleine Linux VM (bijvoorbeeld via WSL2), zodat Linux-containers daar de kernel van die VM delen, niet de kernel van uw besturingssysteem.
Architectuur (client-server). Volgens Docker-documentatie:
- De
docker-client is de belangrijkste manier waarop gebruikers met Docker communiceren; opdrachten zoalsdocker runworden naar de daemon verzonden. - De
dockerd-daemon "doet het zware werk" van het bouwen, uitvoeren en distribueren van containers en beheert objecten zoals afbeeldingen, containers, netwerken en volumes. - De client praat met de daemon via een REST API via een UNIX-socket of een netwerkinterface, zodat ze op verschillende machines kunnen draaien.
- Een register slaat afbeeldingen op; de standaard openbare is Docker Hub.
Afbeeldingen en containers. Een handige analogie: een afbeelding is als een klasse (of een programma op schijf), en een container is er een exemplaar van (een lopend proces); u kunt vanaf één afbeelding veel containers starten.
- Een afbeelding is een alleen-lezen sjabloon met instructies voor het maken van een container, opgebouwd uit lagen. Het wordt gedefinieerd door een Dockerfile; wanneer u dit wijzigt, worden alleen de gewijzigde lagen opnieuw opgebouwd.
- Een container is een uitvoerbaar exemplaar van een afbeelding. Bovenop de alleen-lezen lagen van de afbeelding wordt een dunne schrijfbare laag toegevoegd (copy-on-write); alles wat daar geschreven is, gaat verloren als de container wordt verwijderd – en dat is precies waarom persistente gegevens volumes nodig hebben.
Hoe isolatie werkt (onder de motorkap). dockerd roept de kernel niet rechtstreeks aan; het delegeert het beheer van de containerlevenscyclus aan containerd, dat een OCI-runtime aanroept; in Docker is de standaard runc, maar de runtime is plug-in (crun, gVisor, Kata, enz.). De daadwerkelijke isolatie komt van de Linux-kernelfuncties:
- naamruimten isoleren bronnen (volgens de man7-pagina zijn er 8 typen: PID, netwerk, mount, UTS, IPC, gebruiker, cgroup, tijd). Een proces 'ziet' alleen zijn eigen PID's, zijn eigen netwerkstack, enzovoort.
- cgroups (controlegroepen) beperken en houden rekening met het gebruik van bronnen (CPU, geheugen, I/O).
Veel voorkomende vervolgacties. Afbeeldingslagen worden in de cache opgeslagen; docker compose voert apps met meerdere containers uit; gegevens blijven bestaan via volumes (een container is standaard kortstondig); en OCI standaardiseert het afbeeldingsformaat (image-specificatie), de runtime (runtime-specificatie) en het registerdistributieprotocol (distributie-specificatie) – deze drie specificaties zorgen ervoor dat het ecosysteem interoperabel blijft.
