Wat is Docker en waarom zouden developers het leren?
Een praktische uitleg van Docker voor developers: containers vs VMs, kerncommando's, Dockerfiles, en hoe je het in echte projecten gaat gebruiken.
Docker duikt steeds vaker op in vacatures en setup-handleidingen, en als je nog nooit met containers hebt gewerkt kan het voelen als een muur die je moet overklimmen voordat je echte code mag schrijven. Het is niet ingewikkeld als je eenmaal voorbij de vakjargon bent.
Wat een container eigenlijk is
Een container verpakt je applicatie met alles wat nodig is om het uit te voeren: de code, runtime, systeembibliotheken en configuratiebestanden. Het is geen virtuele machine. Een VM virtualiseert een volledig besturingssysteem, kernel inbegrepen, dus het starten ervan kan een minuut duren en enkele gigabytes RAM gebruiken. Een container deelt de kernel van de hostmachine en isoleert alleen het proces, dus het start in minder dan een seconde en gebruikt doorgaans tientallen megabytes in plaats van gigabytes.
Die verschillen zijn waarom Docker lokale ontwikkeling en CI-pijplijnen zo snel overgenomen heeft. Je kunt een Postgres-database, een Redis-cache en je appserver op één laptop draaien zonder ze direct op je OS te installeren.
De kernonderdelen die je moet kennen
Er zijn vier termen die het meeste van wat je dagelijks doet dekken:
- Image: een read-only sjabloon gebouwd uit een Dockerfile. Zie het als een snapshot van een bestandssysteem plus metadata over hoe het uit te voeren.
- Container: een draaiende instantie van een image. Je kunt containers starten, stoppen en verwijderen zonder de image waarvan ze afkomstig zijn aan te raken.
- Dockerfile: een tekstbestand met instructies voor het bouwen van een image, regel voor regel.
- Registry: waar images opgeslagen zijn en vandaan gehaald worden, meestal Docker Hub.
Een minimale Dockerfile voor een Node.js-app ziet er zo uit:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Bouw het met docker build -t my-app . en voer het uit met docker run -p 3000:3000 my-app. De -p vlag mappt een poort op je machine naar een poort in de container, zo bereik je de app vanuit je browser.
Commando's die je voortdurend gebruikt
Een handvol commando's dekt het meeste dagelijkse werk:
docker ps— stop actieve containers opdocker ps -a— stop alle containers op, inclusief gestoptedocker images— stop images op je machine opdocker logs <container>— controleer output van een actieve of gecrasht containerdocker exec -it <container> sh— open een shell in een draaiende containerdocker rm/docker rmi— ruim containers en images op die je niet meer nodig hebt
Dat laatste paar is belangrijker dan mensen verwachten. Docker laat je zonder enige moeite schijfruimte verdwijnen in oude images en gestopte containers. docker system prune uitvoeren claims regelmatig een verbazingwekkende hoeveelheid ruimte terug.
Waarom docker-compose de workflow verandert
De meeste echte projecten hebben meer dan één container nodig: een appserver, een database, misschien een cache. Voor elk docker run commando uitschrijven wordt snel saai. docker-compose.yml laat je de hele stack in één bestand definiëren:
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: devpassword
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:
Voer docker compose up uit en beide services starten samen, netwerked zodat web db kan bereiken op servicenaam. Dit is de setup die je in bijna elke open-source repo's README ziet, en het begrijpen betekent dat je een project kunt klonen en het in minuten draaiend hebt in plaats van handmatig Postgres, Redis en wat de app nog meer nodig heeft te installeren.
Waar mensen vroeg vastlopen
Volumes verwarren bijna iedereen in eerste instantie. Zonder een volume verdwijnt alles wat in een container geschreven is als de container verwijderd is, wat een probleem is voor databases. De volumes sectie in het compose-bestand hierboven mappt een benoemde volume naar een pad in de container zodat gegevens restarts overleven.
Een ander veelgemaakte fout is node_modules of .git in de image kopiëren omdat er geen .dockerignore bestand is. Voeg er een toe zoals een .gitignore:
node_modules
.git
.env
Dat houdt builds sneller en images kleiner, wat belangrijk is als je images naar een registry pusht of naar Kubernetes deployment.
Waar je na de basis heen gaat
Zodra het bouwen en draaien van containers normaal voelt, zijn de volgende nuttige vaardigheden multi-stage builds voor kleinere productieimages, Docker-netwerkmodi begrijpen en een docker inspect output lezen als iets niet goed verbonden is. Niets ervan is moeilijk, het is alleen onbekend de eerste keer.
Voor meer over het containeriseren van echte applicaties en ze verbinden met cloud deployment-pijplijnen, check de DevOps en Cloud-segmenten op Korra Studio.
Geschreven met AI-ondersteuning, herzien en gepubliceerd door Michal Pilch (CISSP), Korra Studio.
Dit is één aantekening uit de kennisbasis van Korra Studio — het platform koppelt elk onderwerp aan 1-op-1 mentoring.
Gratis beginnenarrow_forward