Terug naar blog
DevOps

Docker voor beginners: je eerste container

Koen Vorsters

Koen Vorsters

Developer & Engineer

14 april 202510 min leestijd

"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:

dockerfile
# 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:

bash
# 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 api

Docker 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:

yaml
# 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:
bash
# Start alles
docker compose up -d

# Bekijk status
docker compose ps

# Stop alles
docker compose down

Best 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.

Vond je dit artikel nuttig?

Ik schrijf regelmatig over AI, IoT, web development en DevOps. Neem gerust contact op als je vragen hebt.