Wat is Docker Compose en hoe werkt het?
Auteur: Redactie Domeny.ForSale 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:
services— de lijst met services die samen de omgeving vormen.image— de image waaruit de container wordt gestart; een alternatief isbuild, dat aangeeft hoe je een eigen image bouwt.ports— de koppeling van een poort op de computer aan een poort in de container, zodat de service van buiten het containernetwerk bereikbaar is.environment— omgevingsvariabelen waarmee je het programma configureert.volumes— de koppeling van mappen of volumes: opslaglocaties voor gegevens die blijven bestaan onafhankelijk van de container.
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.
| Commando | Gebruik |
|---|---|
docker compose ps | Toont de containers van het project en hun status. |
docker compose logs -f | Toont de logs en blijft nieuwe berichten weergeven. |
docker compose stop | Stopt de containers zonder ze te verwijderen. |
docker compose down | Verwijdert de containers en het projectnetwerk, maar behoudt standaard de benoemde volumes. |
docker compose config | Controleert 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.
