Het kortste antwoord op de vraag wat is Docker luidt: het is een tool die je applicatie samen met alles wat ze nodig heeft om te draaien (code, bibliotheken, runtime, systeemtools) in één draagbaar pakket stopt. Dat pakket draait in een container en gedraagt zich hetzelfde op jouw machine, op een server, op de laptop van een collega of bij een cloudprovider. Het klassieke probleem "bij mij werkte het, maar op de server niet" verdwijnt grotendeels.
Wat is Docker, en waarom is het ontstaan?
De klassieke manier om een applicatie uit te rollen is om afhankelijkheden één voor één op de server te installeren: de juiste PHP-versie, de juiste Node.js-versie, de juiste bibliotheken, de juiste omgevingsvariabelen. Dat is traag en foutgevoelig. Wanneer twee projecten verschillende versies nodig hebben, wordt het al snel een rommeltje.
Docker lost dit op via standaardisatie. Je verpakt je applicatie en haar afhankelijkheden in een image en start vervolgens zoveel containers van die image als je wilt. Elke container draait in zijn eigen geïsoleerde ruimte, maar ze delen allemaal dezelfde kernel van het besturingssysteem. Het resultaat: snelle start, laag verbruik van resources en consistentie in elke omgeving.
Het verschil tussen containers en virtuele machines
Beide bieden isolatie, maar ze werken op verschillende lagen. Een virtuele machine (VM) draait een volledig besturingssysteem bovenop een hypervisor die hardware nabootst. Elke VM heeft een eigen kernel, dus ze kan gigabytes innemen en minuten nodig hebben om op te starten.
Een container daarentegen draait geen apart besturingssysteem; ze deelt de Linux-kernel van de host en isoleert alleen de applicatielaag. De isolatie steunt op de kernelfuncties namespaces (scheiden wat een proces kan zien) en cgroups (beperken hoeveel resources het gebruikt) van Linux.
- Grootte: containers worden meestal in megabytes gemeten, VM's in gigabytes.
- Opstarten: een container start in seconden, vaak in milliseconden; een VM is veel trager.
- Isolatie: VM's bieden sterkere isolatie op hardwareniveau; containers zijn lichter maar delen de kernel.
In de praktijk zijn het geen rivalen: je draait containers vaak binnen een VM. Op macOS en Windows gebruikt Docker al een kleine Linux-VM op de achtergrond, omdat containers een Linux-kernel nodig hebben om te draaien.
Images, containers en het lagenmodel
Het is belangrijk om twee begrippen niet te verwarren. Een image is een alleen-lezen sjabloon: het bestandssysteem, de afhankelijkheden en het startcommando liggen erin vast. Een container is een draaiende instantie van die image. Zie het als een klasse en een object: uit één image kun je tientallen containers maken.
Images zijn opgebouwd uit lagen. Elke instructie in een Dockerfile voegt een nieuwe laag toe, en die lagen worden gecachet. Projecten die dezelfde basisimage gebruiken, delen deze lagen, wat zowel schijfruimte als downloadtijd bespaart. Als je iets verandert, worden alleen de lagen na dat punt opnieuw gebouwd.
Je eerste Dockerfile: een klein Node.js-voorbeeld
Laten we zien hoe je een image definieert. Voor een eenvoudige Node.js-applicatie kan een Dockerfile er zo uitzien:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Regel voor regel: FROM kiest de basisimage (hier het lichte, op Alpine gebaseerde Node 20). WORKDIR stelt de werkmap in. Eerst alleen de package.json-bestanden kopiëren en npm ci draaien voor de rest is een bewuste techniek om de lagencache te benutten: zelfs als je code verandert, wordt deze laag niet opnieuw gebouwd zolang de afhankelijkheden gelijk blijven. EXPOSE documenteert de poort, en CMD is het commando dat draait wanneer de container start.
Essentiële Docker-commando's
Dit zijn de commando's die je dagelijks het vaakst gebruikt:
# Bouw de image vanuit de Dockerfile in deze map en label hem
docker build -t mijn-app .
# Start een container vanuit de image en koppel poort 3000 aan de host
docker run -p 3000:3000 mijn-app
# Toon draaiende containers
docker ps
# Stop een container
docker stop <container-id>
# Volg de logs van een container
docker logs -f <container-id>
Wanneer je meerdere services samen wilt beheren (bijvoorbeeld een app plus een database), komt Docker Compose in beeld. Je definieert alle services in één compose.yaml-bestand en start ze met docker compose up.
Wanneer moet je Docker gebruiken?
Docker is niet altijd nodig, maar loont in gevallen zoals deze:
- Consistente omgevingen: wanneer je wilt dat iedereen in het team en de server identieke versies draaien.
- Eenvoudige uitrol: je kunt dezelfde image ongewijzigd naar test, staging en productie sturen.
- Microservices: elke service in een eigen container draaien houdt de verantwoordelijkheden helder.
- Snel experimenteren: je kunt een database of tool met één commando opstarten en daarna weggooien.
Voor één eenvoudige statische site kan Docker onnodige complexiteit toevoegen; kies de tool op basis van het probleem dat hij echt oplost.
Veelgestelde vragen
Moet ik Linux kennen om Docker te leren?
Het is niet vereist, maar het helpt enorm. Omdat containers op de Linux-kernel zijn gebouwd, maakt kennis van basis-terminalcommando's, bestandsrechten en omgevingsvariabelen je leven veel makkelijker. Op Windows en macOS biedt Docker Desktop een Linux-omgeving op de achtergrond, wat genoeg is om te beginnen.
Zijn containers veilig?
Goed geconfigureerd zijn ze redelijk veilig, maar omdat ze de kernel delen, is de isolatie niet zo sterk als die van een VM. Bij het draaien van niet-vertrouwde code zijn goede gewoonten: officiële basisimages gebruiken, de container als niet-root-gebruiker draaien en images up-to-date houden.
Wat is het verschil tussen een image en een container?
Een image is een alleen-lezen sjabloon (zoals een klasse), terwijl een container een draaiende instantie van die image is (zoals een object). Je kunt zoveel containers van één image starten als je wilt, en elk draait onafhankelijk.
Wil je je project naar containers verhuizen? Om je applicatie met Docker te verpakken, je deployproces te automatiseren of je infrastructuur op te ruimen, neem contact met me op — laten we samen een eenvoudige, onderhoudbare opzet ontwerpen.