"Het werkt op mijn machine" — de meest gevreesde zin in software development. Docker lost dit probleem elegant op door je applicatie samen met al zijn afhankelijkheden te verpakken in een container die overal identiek draait. In deze tutorial neem ik je stap voor stap mee door je eerste Docker-ervaring.
Wat is Docker (en wat is het niet)?
Docker is een tool die je applicatie isoleert van het besturingssysteem. Anders dan een virtuele machine deelt een container de kernel van het host-systeem, waardoor containers in milliseconden starten en amper resources verbruiken. Denk eraan als een lichtgewicht, reproduceerbare "doos" voor je software.
- Container ≠ virtuele machine — containers zijn sneller en lichter
- Image = de blauwdruk, Container = de draaiende instantie
- Dockerfile = het recept om een image te bouwen
- Docker Compose = meerdere containers orchestreren
Je eerste Dockerfile
Laten we een simpele Python API containerizen. Maak een Dockerfile aan in de root van je project:
# Gebruik een lichtgewicht Python base image
FROM python:3.12-slim
# Stel de werkdirectory in
WORKDIR /app
# Kopieer en installeer dependencies eerst (voor caching)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Kopieer de applicatie code
COPY . .
# Start de applicatie
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]Bouwen en draaien
Met twee commando's bouw en start je je container:
# Bouw het image
docker build -t mijn-api .
# Start een container
docker run -d -p 8000:8000 --name api mijn-api
# Bekijk logs
docker logs -f api
# Stop en verwijder
docker stop api && docker rm apiDocker Compose voor meerdere services
De echte kracht van Docker komt naar boven wanneer je meerdere services combineert. Met Docker Compose definieer je je hele stack in één YAML-bestand:
# docker-compose.yml
services:
api:
build: .
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/app
depends_on:
- db
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: app
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:# Start alles
docker compose up -d
# Bekijk status
docker compose ps
# Stop alles
docker compose downBest practices
- Gebruik .dockerignore om node_modules, .git en andere grote mappen uit te sluiten
- Multi-stage builds voor kleinere productie-images
- Kopieer requirements/package.json eerst voor betere layer caching
- Gebruik geen root-gebruiker in je container (USER directive)
- Pin je base image versies (python:3.12-slim, niet python:latest)
Mijn setup
In mijn eigen projecten gebruik ik Docker Compose met 7+ services: PostgreSQL, Redis, Keycloak, FastAPI, Ollama, en meer. Alles start met make up en stopt met make down. Nieuwe teamleden zijn in minuten productief, ongeacht hun besturingssysteem.
Docker is als lego voor je infrastructuur: elke service is een blokje dat je onafhankelijk kunt bouwen, testen en vervangen. Begin met twee blokjes en bouw van daaruit.
Wil je Docker in actie zien? Bekijk mijn Container Infrastructure project voor een volledig werkende multi-service setup met health checks, volume management en Makefile automation.
