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.
🎯 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:
- Het wachtwoord staat in platte tekst in het bestand (→ Secrets, les 11).
depends_onwacht alleen tot de container gestart is, niet tot PostgreSQL klaar is (→ healthchecks, les 2 en 14).- Er draait precies één webcontainer. Valt die om, dan ligt alles plat (→ Deployments, les 8).
Oefenen
- Bekijk de logs van alleen de database met
docker compose logs db. - Voer
docker compose exec db psql -U teller -c '\dt'uit en zoek de tabel van de app. - 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 -vgebruikt. Zonder-vblijft 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.