Wat is Docker Compose en hoe werkt het?

Auteur: Gepubliceerd

In het kort: Docker Compose is een tool om applicaties met meerdere containers van Docker te definiëren en te starten. In één bestand beschrijf je de services, hun configuratie, onderlinge verbindingen en de opslag van gegevens. Vervolgens start je ze met het commando docker compose up. Dat is bijvoorbeeld handig wanneer een project een applicatie, een database en een extra beheerpaneel nodig heeft.

Hoe Docker Compose samenwerkt met Docker

Docker draait programma’s in containers: geïsoleerde omgevingen met de applicatie en de afhankelijkheden die deze nodig heeft. Een container wordt aangemaakt vanuit een image, een kant-en-klaar pakket dat bepaalt wat er wordt uitgevoerd. Compose vervangt Docker niet, maar gebruikt het om een groep samenhangende containers te beheren.

Zonder Compose kun je elke container starten met een afzonderlijk docker run-commando, waarbij je de poorten, omgevingsvariabelen en het netwerk handmatig opgeeft. Met Compose kun je deze instellingen opslaan in het bestand compose.yaml. Zo kun je de configuratie samen met de projectcode bewaren en op een andere computer opnieuw gebruiken.

Het centrale begrip is de service: de definitie van een specifiek onderdeel van de omgeving, bijvoorbeeld een database. Compose maakt containers aan op basis van deze definities. Standaard maakt het ook een projectnetwerk aan waarin services elkaar via hun naam kunnen vinden.

Wat staat er in het bestand compose.yaml

Je schrijft de configuratie in YAML, een tekstformaat dat inspringing gebruikt om de structuur vast te leggen. De inspringing moet consistent zijn; gebruik hiervoor spaties, geen tabs.

De volgende onderdelen kom je het vaakst tegen:

Dat de containers zijn gestart, betekent nog niet dat de applicatie goed werkt. De database kan tijd nodig hebben om te initialiseren, en de applicatie moet een verbindingspoging kunnen herhalen. depends_on kan de opstartvolgorde bepalen, maar garandeert in de basisvorm niet dat een service klaar is voor gebruik. Daarvoor moet je een statuscontrole, oftewel healthcheck, en de bijbehorende afhankelijkheidsvoorwaarde correct configureren.

Voorbeeld: PostgreSQL en een databasebeheerpaneel

Stel dat je PostgreSQL lokaal wilt testen zonder de database rechtstreeks op je systeem te installeren. Daarnaast wil je het beheerpaneel Adminer gebruiken om gegevens via de browser te bekijken. Maak een projectmap aan en sla daarin het bestand compose.yaml op:

services:
  db:
    image: postgres:17
    environment:
      POSTGRES_USER: demo
      POSTGRES_PASSWORD: lokaal_demo_wachtwoord
      POSTGRES_DB: demo
    volumes:
      - db_data:/var/lib/postgresql/data

  adminer:
    image: adminer:5
    ports:
      - "127.0.0.1:8080:8080"

volumes:
  db_data:

Start de omgeving vanuit deze map:

docker compose up -d

De optie -d start de containers op de achtergrond. Bij de eerste start downloadt Docker de images als ze nog niet lokaal aanwezig zijn.

Open het adres http://localhost:8080 in je browser. Kies in het paneel PostgreSQL en vul als server db in, als gebruiker demo, als wachtwoord lokaal_demo_wachtwoord en als database demo. Als de database nog wordt geïnitialiseerd, wacht dan even en probeer opnieuw in te loggen.

De naam db werkt binnen het Compose-netwerk. Gebruik daar niet localhost: vanuit de Adminer-container zou die naam naar de Adminer-container zelf verwijzen, niet naar de database. In dit voorbeeld is er geen poort van PostgreSQL beschikbaar gesteld op de computer. Het beheerpaneel is alleen bereikbaar via de lokale netwerkinterface van de computer.

Dit is een configuratie om mee te leren, geen kant-en-klare productieomgeving. Gebruik het voorbeeldwachtwoord niet voor echte gegevens en sla geen echte geheimen op in de repository.

Commando’s voor dagelijks gebruik

Het huidige commando is docker compose, met een spatie. De schrijfwijze docker-compose, die je in oudere handleidingen tegenkomt, hoort bij een oudere installatiemethode van de tool. Met docker compose version controleer je of Compose beschikbaar is. Werkt dat commando niet, raadpleeg dan de officiële documentatie van Docker voor de installatiemethode voor jouw systeem.

CommandoGebruik
docker compose psToont de containers van het project en hun status.
docker compose logs -fToont de logs en blijft nieuwe berichten weergeven.
docker compose stopStopt de containers zonder ze te verwijderen.
docker compose downVerwijdert de containers en het projectnetwerk, maar behoudt standaard de benoemde volumes.
docker compose configControleert de configuratie en toont de uiteindelijke versie.

Wees voorzichtig met docker compose down -v: de optie -v verwijdert ook de volumes die het project beheert. In dit voorbeeld worden daardoor de databasegegevens gewist. Een volume houdt gegevens intact nadat een container is verwijderd, maar vervangt geen back-up.

Wanneer Compose volstaat en wanneer niet

Compose is geschikt voor lokale applicatieontwikkeling, integratietests en eenvoudige deployments op één server. Het is vooral handig wanneer meerdere mensen dezelfde set services moeten starten zonder de instellingen handmatig opnieuw in te voeren.

Compose biedt op zichzelf geen beheer van een cluster met meerdere servers of hoge beschikbaarheid. Voor een productieomgeving moet je beveiliging, back-ups, monitoring en updates van images afzonderlijk plannen. Een image-tag zoals postgres:17 kan naar opeenvolgende releases binnen dezelfde versie-reeks verwijzen. Als je exact reproduceerbare resultaten nodig hebt, overweeg dan de image vast te pinnen op een specifieke digest: een identificatie van de inhoud ervan.

Begin door het voorbeeld te starten, de logs te controleren en docker compose down uit te voeren, gevolgd door opnieuw docker compose up -d. Zo ervaar je het verschil tussen een container die opnieuw wordt aangemaakt en gegevens die bewaard blijven.

Lees ook

Lees hoe PHP-FPM PHP-verzoeken verwerkt, verschilt van een webserver en hoe je processen afstemt op verkeer en hostingcapaciteit.
Ontdek hoe BIND als open DNS-serversoftware domeinen beheert, welke rollen het vervult en wanneer zelf beheren zinvol is.
Lees wat het Poolse REGON-register en -nummer betekenen, hoe ze verschillen van NIP en KRS en hoe je bedrijfsgegevens controleert.