Docker Basics
Een complete beginnersgids over Docker: leer containerization voor consistente ontwikkelomgevingen, snellere deployments en het elimineren van "works on my machine" problemen.
Definitie
Docker is een open-source platform voor het ontwikkelen, verzenden en uitvoeren van applicaties in containers. Containers laten je applicatie en alle dependencies verpakken in een standaard eenheid voor software development, wat zorgt voor consistentie across verschillende omgevingen.
Waarom Docker?
Docker lost kritieke problemen op in moderne software ontwikkeling:
- Consistentie: Elimineert "works on my machine" problemen
- Isolatie: Applicaties draaien in geïsoleerde omgevingen
- Efficiëntie: Containers zijn licht en snel (MB's vs GB's van VM's)
- Portabiliteit: Draait overal: laptop, on-prem, cloud
- Microservices: Ideaal voor gedistribueerde architectuur
- CI/CD: Stroomlijnt development en deployment pipelines
Belangrijkste Inzicht
Docker is niet alleen een technologie - het is een paradigmaverschuiving in hoe we software ontwikkelen en deployen. Het stelt ontwikkelaars in staat om te focussen op code, niet op omgevingsconfiguratie. "Build once, run anywhere" is niet langer een slogan maar realiteit met Docker.
Docker vs. Virtuele Machines
Virtuele Machines
Zwaar, traag, volledige OS virtualisatie
Docker Containers
Licht, snel, OS-level virtualisatie
| Aspect | Virtuele Machines | Docker Containers |
|---|---|---|
| Grootte | GB's (volledig OS) | MB's (alleen app + dependencies) |
| Starttijd | Minuten | Seconden |
| Performance | Zwaar, overhead | Native, bijna 0 overhead |
| Isolatie | Hardware-level | OS-level |
| Portabiliteit | Beperkt | Hoog ("run anywhere") |
Docker Architecture
Host Machine
Node.js App
PostgreSQL DB
Redis Cache
Meerdere geïsoleerde containers draaien op één host
Kerncomponenten
- Docker Daemon: Achtergrondproces dat containers beheert
- Docker Client: CLI voor communicatie met de daemon
- Docker Images: Read-only templates voor containers
- Docker Containers: Uitvoerbare instanties van images
- Docker Registry: Opslag voor images (Docker Hub, private registries)
Docker Workflow
Dockerfile Schrijven
Definieer je applicatie en dependencies in een Dockerfile
Image Bouwen
Build een Docker image van je Dockerfile: docker build -t mijn-app .
Container Runen
Start een container van je image: docker run -d -p 8080:80 mijn-app
Deployen
Push naar registry en pull/run op productie server
Dockerfile Voorbeelden
Basis Dockerfile voor Python App
# Dockerfile
# Gebruik officiële Python runtime als parent image
FROM python:3.9-slim
# Stel werkdirectory in
WORKDIR /app
# Kopieer requirements.txt
COPY requirements.txt .
# Installeer dependencies
RUN pip install --no-cache-dir -r requirements.txt
# Kopieer applicatie code
COPY . .
# Maak poort 8000 beschikbaar
EXPOSE 8000
# Definieer environment variabelen
ENV PYTHONUNBUFFERED=1
# Run de applicatie
CMD ["python", "app.py"]
Multi-stage Dockerfile voor Go App
# Multi-stage Dockerfile voor kleinere images
# Build stage
FROM golang:1.19-alpine AS builder
WORKDIR /app
COPY . .
RUN go mod download
RUN go build -o main .
# Runtime stage
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
# Kopieer alleen het binary van builder stage
COPY --from=builder /app/main .
EXPOSE 8080
CMD ["./main"]
Docker Compose voor Multi-container Apps
# docker-compose.yml
version: '3.8'
services:
webapp:
build: .
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
depends_on:
- db
volumes:
- ./app:/app
- static_volume:/app/static
db:
image: postgres:14
environment:
- POSTGRES_DB=mydb
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
volumes:
- postgres_data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
postgres_data:
static_volume:
Essentiële Docker Commando's
| Commando | Beschrijving | Voorbeeld |
|---|---|---|
| docker build | Bouw image van Dockerfile | docker build -t mijn-app . |
| docker run | Start container van image | docker run -d -p 8080:80 mijn-app |
| docker ps | Toon draaiende containers | docker ps -a (alle containers) |
| docker images | Toon beschikbare images | docker images |
| docker logs | Toon container logs | docker logs container-id |
| docker exec | Voer commando uit in container | docker exec -it container-id bash |
| docker-compose up | Start multi-container app | docker-compose up -d |
| docker push/pull | Deel images via registry | docker push mijn-repo/mijn-app:tag |
Docker voor Data Engineering
Data Pipeline Containers
Docker is ideaal voor data engineering workloads:
- Apache Spark: Gedistribueerde data processing
- Apache Airflow: Workflow orchestration
- Jupyter Notebooks: Data science omgeving
- PostgreSQL/MySQL: Databases voor development
- ELT Tools: dbt, Apache NiFi, Talend
Data Science Dockerfile
# Dockerfile voor Data Science
FROM jupyter/datascience-notebook:latest
# Installeer extra Python packages
RUN pip install --no-cache-dir \
pandas-profiling \
scikit-learn \
xgboost \
mlflow \
great-expectations
# Installeer system dependencies
USER root
RUN apt-get update && apt-get install -y \
curl \
git \
vim
# Stel werkdirectory in
WORKDIR /home/jovyan/work
# Kopieer Jupyter config
COPY jupyter_notebook_config.py /etc/jupyter/
# Start Jupyter Lab
CMD ["start-notebook.sh", "--NotebookApp.token=''"]
Docker Leerpad
Week 1: Fundamentals
Installeer Docker, begrijp images vs containers, oefen basis commando's, run je eerste container.
Week 2: Dockerfile Mastery
Leer Dockerfile syntax, schrijf je eigen Dockerfiles, begrijp layers en caching, gebruik multi-stage builds.
Week 3: Docker Compose
Beheer multi-container apps, configureer netwerken en volumes, implementeer development workflows.
Week 4: Advanced Topics
Dive into Docker networking, security best practices, CI/CD integration, production deployment patterns.
Docker Ecosystem
Docker Hub
Registry met miljoenen public images voor snelle ontwikkeling
Docker Compose
Tool voor het definiëren en runnen van multi-container Docker applicaties
Docker Security
Built-in security features: namespaces, cgroups, seccomp, AppArmor
Docker Swarm
Native clustering en orchestration voor Docker containers
Real-world Case Study: E-commerce Data Platform
Uitdaging: Een e-commerce bedrijf had inconsistente data science omgevingen, moeilijke dependency management en trage onboarding van nieuwe data scientists.
Oplossing: Docker implementatie met:
- Gestandaardiseerde data science images met alle benodigde tools
- Docker Compose voor complete data pipelines (Jupyter + Postgres + Redis)
- Versioned Docker images voor reproduceerbare analyses
- CI/CD pipeline voor automatisch bouwen van images
Resultaat: 80% reductie in onboarding tijd, 100% consistente omgevingen, en reproduceerbare data analyses.
Veelgemaakte Docker Fouten
Beginners Valkuilen
- Images als VM's behandelen: Containers zijn ephemeral, geen persistent servers
- Root in containers runnen: Gebruik niet-root users voor security
- Geen .dockerignore: Onnodige bestanden in context verhogen build tijd
- Grote images: Gebruik multi-stage builds en alpine base images
- Data in containers opslaan: Gebruik volumes voor persistente data
- Geen resource limits: Containers kunnen alle resources gebruiken
Docker Best Practices
Development Best Practices
- Gebruik .dockerignore om build context te minimaliseren
- Implementeer multi-stage builds voor kleinere images
- Gebruik specifieke image tags (niet 'latest')
- Scan images voor security vulnerabilities
- Test containers in CI/CD pipeline
Production Best Practices
- Run containers als niet-root user
- Configureer resource limits (CPU, memory)
- Implementeer health checks
- Gebruik private registry voor productie images
- Monitor containers en orchestration platform
Docker en Kubernetes
Van Docker naar Kubernetes
Docker en Kubernetes vullen elkaar perfect aan:
- Docker: Containerization platform (bouw en run containers)
- Kubernetes: Orchestration platform (beheer en schaal containers)
- Workflow: Docker bouwt containers → Kubernetes beheert ze in productie
Kubernetes Deployment met Docker Images
apiVersion: apps/v1
kind: Deployment
metadata:
name: data-api
spec:
replicas: 3
selector:
matchLabels:
app: data-api
template:
metadata:
labels:
app: data-api
spec:
containers:
- name: data-api
image: myregistry.azurecr.io/data-api:v1.2.3
ports:
- containerPort: 8000
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: db-secret
key: url