Compose ver­een­vou­digt het schalen en im­ple­men­te­ren van ap­pli­ca­ties in Docker door het beheer van con­tai­ners te au­to­ma­ti­se­ren. In onze tutorial gaan we dieper in op het instellen en gebruiken van Docker Compose om het im­ple­men­ta­tie­pro­ces van uw ap­pli­ca­ties te stroom­lij­nen.

Wat is Docker Compose?

Docker Compose wordt gebruikt om ap­pli­ca­ties te beheren en de ef­fi­ci­ën­tie bij de ont­wik­ke­ling van con­tai­ners te verhogen. Con­fi­gu­ra­ties worden ge­de­fi­ni­eerd in één YAML-bestand, waardoor ap­pli­ca­ties eenvoudig te bouwen en te schalen zijn. Docker Compose wordt vaak gebruikt om een lokale omgeving in te richten. Het kan echter ook deel uitmaken van een Con­ti­nuous In­te­gra­ti­on / Con­ti­nuous Delivery (CI/CD)-workflow. Ont­wik­ke­laars kunnen een spe­ci­fie­ke con­tai­ner­ver­sie de­fi­ni­ë­ren voor het testen of voor spe­ci­fie­ke pijp­lijn­fa­sen. Dit maakt het ge­mak­ke­lij­ker om problemen te iden­ti­fi­ce­ren en bugs te verhelpen voordat de ap­pli­ca­tie in productie gaat.

Vereisten voor Docker Compose

Voor con­tai­ner­or­kestra­tie hebt u zowel Docker Engine als Docker Compose nodig. Zorg ervoor dat een van de volgende programma’s op uw systeem is ge­ïn­stal­leerd:

  • Docker Engine en Docker Compose: kunnen als zelf­stan­di­ge binaire bestanden worden ge­ïn­stal­leerd.
  • Docker Desktop: ont­wik­kelom­ge­ving met grafische ge­brui­kers­in­ter­fa­ce, inclusief Docker Engine en Docker Compose.
Tip

Ontdek hoe u Docker Compose op ver­schil­len­de be­stu­rings­sys­te­men kunt in­stal­le­ren in onze tutorials:

Staps­ge­wij­ze hand­lei­ding voor het gebruik van Docker Compose

Hieronder laten we zien hoe je Docker Compose kunt gebruiken met een een­vou­di­ge Python-we­bap­pli­ca­tie die ge­bruik­maakt van een hit­coun­ter. Hiervoor gebruiken we het Python Flask-framework en de Redis-database in het geheugen. Je hoeft Python of Redis niet te in­stal­le­ren, omdat deze worden geleverd als Docker-images.

Stap 1: Pro­ject­be­stan­den aanmaken

Start de terminal en maak een nieuwe map voor het project aan.

$ mkdir composedemo
shell

Ga naar de map.

$ cd composedemo
shell

Maak het bestand app.py in deze map aan en voeg de volgende code toe:

import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)
@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I was here {} times.\n'.format(count)
python

In onze con­fi­gu­ra­tie gebruiken we redis als hostnaam en de stan­daard­poort 6379 voor ver­bin­ding met de Redis-service. Daarnaast spe­ci­fi­ce­ren we dat de functie get_hit_count() meerdere ver­bin­dings­po­gin­gen met de service moet doen. Dit wordt aan­be­vo­len wanneer Redis mogelijk niet on­mid­del­lijk be­schik­baar is wanneer de ap­pli­ca­tie start of wanneer er tijdens de uit­voe­ring van de ap­pli­ca­tie af en toe ver­bin­dings­pro­ble­men kunnen optreden.

Maak het bestand re­qui­re­ments.txt aan met de af­han­ke­lijk­he­den:

flask
redis
plaintext

Stap 2: Doc­ker­fi­le instellen

Het Doc­ker­fi­le wordt gebruikt voor de Docker-image. Hierin worden alle af­han­ke­lijk­he­den ge­spe­ci­fi­ceerd die de Python-ap­pli­ca­tie nodig heeft.

# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
shell

We geven Docker de opdracht om de Python 3.7-image te gebruiken. Verder stellen we de benodigde om­ge­vings­va­ri­a­be­len in voor het flask-commando. Met behulp van apk add in­stal­le­ren we es­sen­ti­ë­le af­han­ke­lijk­he­den, waaronder gcc. Om de container poort 5000 te laten monitoren, spe­ci­fi­ce­ren we EXPOSE. Met behulp COPY zetten we de inhoud van de huidige map over naar de werk­di­rec­to­ry /code binnen de container. Ten slotte kiezen we flask run als stan­daard­com­man­do voor de container.

Con­tro­leer of het Doc­ker­fi­le zonder be­stands­ex­ten­sie is op­ge­sla­gen, aangezien sommige editors au­to­ma­tisch de extensie .txt toevoegen.

Stap 3: Maak een YAML-bestand aan

In docker-compose.yml con­fi­gu­re­ren we de services ‘redis’ en ‘web’.

version: "3.9"
services:
    web:
        build: .
        ports:
            - "8000:5000"
    redis:
        image: "redis:alpine"
yaml

De web­ser­vi­ce is gebouwd met behulp van de Docker-image die is gemaakt door het Doc­ker­fi­le. Deze koppelt de container en de host­com­pu­ter aan poort 8000, terwijl de Flask-webserver op poort 5000 draait. De Redis-image wordt daar­en­te­gen recht­streeks verkregen van de officiële Docker Hub.

Stap 4: Voer de ap­pli­ca­tie uit met Compose

Start de ap­pli­ca­tie vanuit uw pro­ject­map.

docker compose up
shell

Ga naar http://localhost:8000 in uw browser. U kunt ook http://127.0.0.1:8000 invoeren.

U zou het volgende bericht moeten zien:

Afbeelding: Docker Compose Application: Output the number of visits in the browser
You’ll see the number of times you have visited the browser.

Ververs de pagina. Het aantal weergaven zou nu met 1 moeten zijn toe­ge­no­men.

Afbeelding: Calling the Docker Compose application again
The number of visits increased by 1.

Stop de toe­pas­sing met behulp van:

$ docker compose down
shell

Om de ap­pli­ca­tie te stoppen, kunt u gewoon Ctrl + C indrukken in de terminal.

Stap 5: Voeg een bindmount toe

Als u een bind mount voor de web­ser­vi­ce wilt toevoegen, kunt u dit doen in docker-compose.yml.

version: "3.9"
services:
    web:
        build: .
        ports:
            - "8000:5000"
        volumes:
            - .:/code
        environment:
            FLASK_DEBUG: "true"
    redis:
        image: "redis:alpine"
yaml

Onder het gedeelte Volumes spe­ci­fi­ce­ren we de koppeling van de huidige pro­ject­map aan de map /code in de container. Hierdoor kunnen co­de­wij­zi­gin­gen naadloos worden door­ge­voerd zonder dat de image opnieuw hoeft te worden aan­ge­maakt. De variabele FLASK_DEBUG geeft flask run de opdracht om in de ont­wik­ke­lings­mo­dus te draaien.

Stap 6: Bouw de ap­pli­ca­tie opnieuw op en voer deze uit

Voer de volgende opdracht in de terminal in om het Compose-bestand opnieuw op te bouwen:

docker compose up
shell

Stap 7: Werk de ap­pli­ca­tie bij

Nu u een bind mount voor uw ap­pli­ca­tie gebruikt, kunt u uw code aanpassen en au­to­ma­tisch wij­zi­gin­gen zien zonder de image opnieuw te bouwen.

Schrijf een nieuwe wel­komst­test in app.py.

return 'Hello from Docker! I was here {} times.\n'.format(count)
python

Vernieuw de browser om te con­tro­le­ren of de wij­zi­gin­gen zijn door­ge­voerd.

Afbeelding: Docker Compose application: modified welcome text
The welcome text in the Python ap­pli­ca­ti­on has been modified

Stap 8: andere commando’s

De --help op­tie­lijs­ten bevatten be­schik­ba­re Docker Compose-op­drach­ten:

docker compose --help
shell

Om Docker Compose op de ach­ter­grond uit te voeren, kunt u het argument -d toevoegen:

docker compose up -d
shell

Gebruik down om alle con­tai­ners te ver­wij­de­ren. De optie --volumes ver­wij­dert de volumes die door de Redis-container worden gebruikt.

docker compose down --volumes
shell
Ga naar hoofdmenu