Skip to main content

Docker-Compose

Op dit moment in de workshop kan je met je opgebouwde kennis van docker vooral individuele containers en images configueren. Wil je interactie tussen de verschillende containers dan moeten deze hiervoor manueel op elkaar afgestemd worden door ze bijvoorbeeld in eenzelfde geïsoleerd netwerk te plaatsen of hen manueel eenzelfde volume te laten gebruiken.

Heel dikwijls wil je immers volledige applicaties actief brengen die uit verschillende componenten bestaan. Denk maar aan een webshop-applicatie waarin je sowieso een front-end website zal hebben en een back-end database. Het zou uiteraard veel makkelijker zijn mochten we deze aparte elementen (containers, images, netwerken, volumes,...) als één geheel kunnen beschrijven, configureren en runnen. docker compose zal hierop een antwoord bieden.

Inleiding tot Docker Compose

Docker Compose is een tool voor het definiëren en het uitvoeren van multi-container Docker-toepassingen. Met Docker Compose kunnen services, netwerken en volumes van een volledige applicatie in één YAML-bestand gedefinieerd worden. Alle configuratie voor een applicatie, die uit meerdere componenten bestaat (vb. front-end, back-end api, database,...), kan opgenomen worden in het docker-compose.yml bestand.

Services definiëren met Docker Compose

In Docker Compose worden er services geconfigureerd in het YAML-bestand. Elke service is een onderdeel van de applicatie en wordt gedefinieerd als een apart blok van YAML-code met een naam en configuratieopties. Hieronder vind je een eenvoudig Docker Compose-bestand dat twee services, een webserver en een database, definieert:

services:
web:
image: my-web-app
ports:
- "5000:5000"
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: mydb

Gebruik van bestaande images

Keyword image:. In bovenstaande voorbeeld wordt de web service gedefinieerd met behulp van een bestaande docker image genaamd "my-web-app" en toegewezen aan poort 5000 op de host.
De db service wordt gedefinieerd met behulp van de "mysql image" van Docker Hub en stelt omgevingsvariabelen in voor het root wachtwoord en de naam van de database.

Images builden op basis van Dockerfile

Keyword build:. Als alternatief kan een service gedefinieerd worden met behulp van een Dockerfile door de build sectie in de service-definitie te specificeren. Hiermee kunnen er specifiekere instellingen toegepast worden. Hieronder een voorbeeld met een Dockerfile om de web service te definiëren:

services:
web:
build:
context: .
dockerfile: Dockerfile
ports:
- "5000:5000"

In dit voorbeeld zal Docker Compose een nieuwe image bouwen met behulp van de Dockerfile in de huidige directory en deze gebruiken om de web service uit te voeren.

Het uitvoeren van een Docker Compose-toepassing

Om een Docker Compose-toepassing uit te voeren, navigeert je naar de directory waar het docker-compose.yml bestand zich bevindt en voert je het commando uit:

docker compose up

Dit commando start alle gedefinieerde services en geeft de logs voor elke service weer in het terminalvenster. Als de images nog niet voor handen zijn, dan worden deze eerst binnengehaald of gebuild en dan gestart.

Als de toepassing in de achtergrond moet draaien, gebruik je het volgende commando:

docker compose up -d

Dit commando start de services in detached-modus, wat betekent dat de applicatie, met zijn verschillende componenten, op de achtergrond wordt uitgevoerd. De status van de uitgevoerde services kan bekeken worden met het commando:

docker compose ps

Dit toont de status van elke service, inclusief de container-ID, de status en de poorten die zijn toegewezen aan elke service.

De toepassing stoppen en alle containers verwijderen, gebeurt met het volgende commando:

docker compose down

Dit commando stopt en verwijdert alle containers, netwerken en volumes die zijn gedefinieerd in het docker-compose.yml bestand.

Een Docker Compose applicatie schalen

Een van de grote voordelen van Docker Compose is dat een applicatie (met meerdere componenten) makkelijk kan opgeschaald worden door meerdere containers toe te voegen.

docker compose up -d --scale web=5

Uiteraard moet er dan wel op voorhand bepaald worden welke unieke poorten mogen toegewezen worden aan die verschillende nodes van de service. Dit kan ook in de docker-compose.yml file.

services:
web:
image: "nginx:latest"
ports:
- "80-85:80"

Analogie met basis Docker commando

Heel wat commando's die je in deze workshop met standaard docker leerde kunnen ook toegepast worden bij docker-compose. Het enige verschil is dat de uitwerking van het commando zal toegepast worden op alle services, images, containers... die deel uit maken van de docker-compose.yml file. (zie ook)

docker compose build
docker compose exec
docker compose ps
docker compose push
docker compose rm

Conclusie

Docker Compose is een krachtige tool voor het beheren en implementeren van multi-container Docker-toepassingen. Met behulp van een enkel YAML-bestand kunnen de services, netwerken en volumes van een toepassing gedefinieerd worden en gemakkelijk worden opgeschaald. Door het gebruik van Docker Compose kunnen complexe Docker-toepassingen vereenvoudigd worden en het ontwikkelingsproces gestroomlijnder maken.