Beetje Coderen

Les 1 · Module 1 · Compose goed onder de knie

Een multi-container-app met Docker Compose

Een webapp met database opzetten in Docker Compose. Dit is het vertrekpunt voor de rest van de cursus.

⏱ 60–90 minuten leestijd + oefenen

🎯 Na deze les kun je

  • een compose.yml schrijven met een app en een database
  • services laten praten via hun servicenaam
  • gegevens bewaren met een named volume

In Een beetje Linux & Docker draaide je losse containers en een eerste Compose-bestand. In deze cursus neem je één concrete app mee, van Compose naar Kubernetes. Die app zet je in deze les neer: een kleine webapp met een PostgreSQL-database. Alles wat later in Kubernetes terugkomt (netwerk, opslag, configuratie, health checks) zie je hier eerst in de eenvoudige vorm.

Wat je nodig hebt

  • Docker Desktop of Docker Engine met de Compose-plugin (docker compose version)
  • De Linux- en Docker-basis uit het voortraject

Uitgewerkt voorbeeld

Maak een map teller met compose.yml:

services:
  web:
    image: ghcr.io/beetjecoderen/teller:1.0   # voorbeeldimage (nog te publiceren); het lab levert de actuele naam
    ports:
      - "8080:8080"
    environment:
      DATABASE_URL: postgres://teller:geheim@db:5432/teller
    depends_on:
      - db

  db:
    image: postgres:16
    environment:
      POSTGRES_USER: teller
      POSTGRES_PASSWORD: geheim
      POSTGRES_DB: teller
    volumes:
      - dbdata:/var/lib/postgresql/data

volumes:
  dbdata:

Voorspel eerst: de webapp verbindt met host db. Waarom werkt dat, terwijl er nergens een IP-adres staat?

docker compose up -d
docker compose ps
curl http://localhost:8080

Compose maakt een eigen netwerk voor dit project en elke service is daarin bereikbaar onder zijn naam. db is dus een hostnaam die Docker's interne DNS vertaalt naar het IP-adres van de databasecontainer. In Kubernetes doet een Service hetzelfde (les 9).

Opslag die blijft

docker compose down
docker compose up -d
curl http://localhost:8080      # de teller loopt door
docker compose down -v          # -v verwijdert ook het volume: teller weer op 0

Het named volume dbdata leeft los van de container. Kubernetes heeft hiervoor PersistentVolumes (les 12).

Wat hier nog niet goed is

Schrijf deze lijst op. Elk punt los je later in de cursus op:

  1. Het wachtwoord staat in platte tekst in het bestand (→ Secrets, les 11).
  2. depends_on wacht alleen tot de container gestart is, niet tot PostgreSQL klaar is (→ healthchecks, les 2 en 14).
  3. Er draait precies één webcontainer. Valt die om, dan ligt alles plat (→ Deployments, les 8).

Oefenen

  1. Bekijk de logs van alleen de database met docker compose logs db.
  2. Voer docker compose exec db psql -U teller -c '\dt' uit en zoek de tabel van de app.
  3. Verander de poort naar 8081:8080. Welke kant van de dubbele punt is de host?

Typische fouten

  • port is already allocated: iets anders gebruikt poort 8080. Kies een andere hostpoort.
  • Web start eerder dan db en crasht: herstart met docker compose restart web, of wacht op les 2.
  • Data kwijt: je hebt down -v gebruikt. Zonder -v blijft het volume bestaan.

Samenvatting

Je hebt een app met database, intern netwerk en blijvende opslag. In de volgende les maak je deze opzet robuuster met healthchecks en een eigen netwerk, voordat je de overstap naar Kubernetes maakt.