Compose gør det nemmere at skalere og im­ple­men­te­re ap­pli­ka­tio­ner i Docker ved at au­to­ma­ti­se­re con­tai­ner­hånd­te­rin­gen. I vores vej­led­ning ser vi nærmere på, hvordan du kon­fi­gu­re­rer og bruger Docker Compose til at strømline im­ple­men­te­rin­gen af dine ap­pli­ka­tio­ner.

Hvad er Docker Compose?

Docker Compose bruges til at ad­mi­ni­stre­re ap­pli­ka­tio­ner og øge ef­fek­ti­vi­te­ten i con­tai­ner­ud­vik­lin­gen. Kon­fi­gu­ra­tio­ner­ne defineres i en enkelt YAML-fil, hvilket gør det nemt at opbygge og skalere ap­pli­ka­tio­ner. Docker Compose bruges ofte til at opsætte et lokalt miljø. Det kan dog også indgå i et Con­ti­nuous In­te­gra­tion / Con­ti­nuous Delivery (CI/CD)-ar­bejds­for­løb. Udviklere kan definere en specifik con­tai­ner­ver­sion til test eller spe­ci­fik­ke pipe­li­ne­fa­ser. Dette gør det lettere at iden­ti­fi­ce­re problemer og rette fejl, inden ap­pli­ka­tio­nen går i pro­duk­tion.

Krav til Docker Compose

Til con­tai­ner­or­ke­stre­ring skal du bruge både Docker Engine og Docker Compose. Sørg for, at du har en af følgende pro­gram­mer in­stal­le­ret på din computer:

  • Docker Engine og Docker Compose: Kan in­stal­le­res som selv­stæn­di­ge binære filer.
  • Docker Desktop: Ud­vik­lings­mil­jø med grafisk bru­ger­græn­se­fla­de, der in­klu­de­rer Docker Engine og Docker Compose.
Tip

Se vores vej­led­nin­ger for at finde ud af, hvordan du in­stal­le­rer Docker Compose på for­skel­li­ge ope­ra­tiv­sy­ste­mer:

Trin-for-trin-vej­led­ning i, hvordan man bruger Docker Compose

I det følgende viser vi, hvordan man bruger Docker Compose med en enkel Python-we­bap­pli­ka­tion, der benytter en be­søgstæl­ler. Til dette bruger vi Python-ram­me­vær­ket Flask og in-memory-databasen Redis. Du behøver ikke at in­stal­le­re Python eller Redis, da de leveres som Docker-billeder.

Trin 1: Opret pro­jekt­fi­ler

Åbn ter­mi­na­len, og opret en ny mappe til projektet.

$ mkdir composedemo
shell

Skift til mappen.

$ cd composedemo
shell

Opret filen app.py i denne mappe, og indsæt følgende kode i den:

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

I vores opsætning bruger vi redis som værtsnavn og stan­dard­por­ten 6379 til at oprette for­bin­del­se til Redis-tjenesten. Derudover angiver vi, at funk­tio­nen get_hit_count() skal foretage flere for­bin­del­ses­for­søg til tjenesten. Dette anbefales, hvis Redis ikke er til­gæn­ge­lig med det samme, når ap­pli­ka­tio­nen starter, eller hvis der kan opstå pe­ri­o­di­ske for­bin­del­ses­pro­ble­mer under kørsel.

Opret filen requi­re­ments.txt med af­hæn­gig­he­der­ne:

flask
redis
plaintext

Trin 2: Opret en Do­ck­er­fi­le

Do­ck­er­fi­len bruges til Docker-billedet. Den angiver alle de af­hæn­gig­he­der, som Python-ap­pli­ka­tio­nen kræver.

# 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

Vi in­stru­e­rer Docker om at bruge Python 3.7-billedet. Desuden indstil­ler vi de nød­ven­di­ge mil­jøva­ri­ab­ler til flask-kom­man­do­en. Ved hjælp af apk add in­stal­le­rer vi vigtige af­hæn­gig­he­der, herunder gcc. For at con­tai­ne­ren kan overvåge port 5000, angiver vi EXPOSE. Ved hjælp af COPY overfører vi indholdet af den aktuelle mappe til ar­bejds­map­pen /code i con­tai­ne­ren. Til sidst vælger vi flask run som stan­dard­kom­man­do for con­tai­ne­ren.

Kon­trol­ler, at Do­ck­er­fi­len er gemt uden fil­ty­pe­navn, da nogle tek­stre­di­ge­rings­pro­gram­mer au­to­ma­tisk tilføjer fil­ty­pe­nav­net .txt.

Trin 3: Opret en YAML-fil

I filen docker-compose.yml kon­fi­gu­re­rer vi tje­ne­ster­ne »redis« og »web«.

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

Web­tje­ne­sten er opbygget ved hjælp af det Docker-billede, der er oprettet med Do­ck­er­fi­le. Den knytter con­tai­ne­ren og vært­scom­pu­te­ren til port 8000, mens Flask-web­ser­ve­ren kører på port 5000. Redis-billedet hentes derimod direkte fra den of­fi­ci­el­le Docker Hub.

Trin 4: Kør ap­pli­ka­tio­nen med Compose

Start pro­gram­met fra din pro­jek­t­map­pe.

docker compose up
shell

Åbn http://localhost:8000 i din browser. Du kan også indtaste http://127.0.0.1:8000.

Du bør se følgende med­del­el­se:

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

Opdater siden. Antallet af visninger bør nu være steget med 1.

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

Afslut pro­gram­met ved at:

$ docker compose down
shell

For at afslutte pro­gram­met skal du blot trykke på Ctrl + C i ter­mi­na­len.

Trin 5: Opret en bind-mount

Hvis du vil tilføje en bind-mount til web­ser­vi­cen, kan du gøre det i filen docker-compose.yml.

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

Under afsnittet »Volumes« angiver vi, at den aktuelle pro­jek­t­map­pe skal til­knyt­tes mappen /code inde i con­tai­ne­ren. Dette gør det muligt at foretage ændringer i koden uden problemer, uden at det er nød­ven­digt at genop­ret­te billedet. Variablen FLASK_DEBUG angiver, at flask run skal køre i ud­vik­lings­mo­dus.

Trin 6: Gen­kom­pi­ler og kør ap­pli­ka­tio­nen

Indtast følgende kommando i ter­mi­na­len for at genop­byg­ge Compose-filen:

docker compose up
shell

Trin 7: Opdater ap­pli­ka­tio­nen

Nu hvor du bruger en bind-mount til din ap­pli­ka­tion, kan du ændre din kode og au­to­ma­tisk se æn­drin­ger­ne uden at skulle gen­kom­pi­le­re billedet.

Skriv en ny vel­komst­test i app.py.

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

Opdater browseren for at kon­trol­le­re, om æn­drin­ger­ne er blevet gemt.

Billede: Docker Compose application: modified welcome text
The welcome text in the Python ap­pli­ca­tion has been modified

Trin 8: Andre kom­man­do­er

De --help til­gæn­ge­li­ge Docker Compose-kom­man­do­er:

docker compose --help
shell

For at køre Docker Compose i bag­grun­den kan du tilføje ar­gu­men­tet -d:

docker compose up -d
shell

Brug down til at fjerne alle con­tai­ne­re. Med indstil­ling --volumes slettes de di­sken­he­der, der bruges af Redis-con­tai­ne­ren.

docker compose down --volumes
shell
Gå til ho­ved­me­nu­en