Compose förenklar skalning och dis­tri­bu­tion av ap­pli­ka­tio­ner i Docker genom att au­to­ma­ti­se­ra con­tai­ner­han­te­ring­en. Vår hand­led­ning ger en djup­gå­en­de inblick i hur du kon­fi­gu­re­rar och använder Docker Compose för att ef­fek­ti­vi­se­ra din ap­pli­ka­tions­dis­tri­bu­tions­pro­cess.

Vad är Docker Compose?

Docker Compose används för att hantera ap­pli­ka­tio­ner och öka ef­fek­ti­vi­te­ten i con­tai­ner­ut­veck­ling. Kon­fi­gu­ra­tio­ner de­fi­nie­ras i en enda YAML-fil, vilket gör ap­pli­ka­tio­ner lätta att bygga och skala. Docker Compose används ofta för att kon­fi­gu­re­ra en lokal miljö. Det kan dock också ingå i ett ar­bets­flö­de för kon­ti­nu­er­lig in­teg­ra­tion/kon­ti­nu­er­lig leverans (CI/CD). Ut­veck­la­re kan definiera en specifik container-version för testning eller specifika pipeline-faser. Detta gör det enklare att iden­ti­fi­e­ra problem och åtgärda buggar innan ap­pli­ka­tio­nen går i pro­duk­tion.

Krav för Docker Compose

För con­tai­ne­ror­kest­re­ring behöver du både Docker Engine och Docker Compose. Se till att du har något av följande in­stal­le­rat på ditt system:

  • Docker Engine och Docker Compose: Kan in­stal­le­ras som fri­ståen­de bi­när­fi­ler.
  • Docker Desktop: Ut­veck­lings­mil­jö med grafiskt an­vän­dar­gräns­snitt inklusive Docker Engine och Docker Compose.
Tips

Läs mer om hur du in­stal­le­rar Docker Compose på olika ope­ra­tiv­sy­stem i våra hand­led­ning­ar:

Steg-för-steg-guide för hur man använder Docker Compose

Nedan visar vi hur man använder Docker Compose med en enkel Python-web­bap­pli­ka­tion som använder en träff­räk­na­re. För detta använder vi Python Flask-ramverket och Redis-databasen i minnet. Du behöver inte in­stal­le­ra Python eller Redis, eftersom de till­han­da­hålls som Docker-bilder.

Steg 1: Skapa pro­jekt­fi­ler

Starta ter­mi­na­len och skapa en ny mapp för projektet.

$ mkdir composedemo
shell

Byt till katalogen.

$ cd composedemo
shell

Skapa filen app.py i den här mappen och lägg till följande kod 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 vår kon­fi­gu­ra­tion använder vi redis som värdnamn och stan­dard­por­ten 6379 för an­slut­ning till Redis-tjänsten. Dessutom anger vi att funk­tio­nen get_hit_count() ska göra flera an­slut­nings­för­sök till tjänsten. Detta re­kom­men­de­ras om Redis inte är ome­del­bart till­gäng­ligt när ap­pli­ka­tio­nen startar eller om det kan uppstå till­fäl­li­ga an­slut­nings­pro­blem under körning.

Skapa filen requi­re­ments.txt med beroenden:

flask
redis
plaintext

Steg 2: Kon­fi­gu­re­ra Doc­ker­fi­le

Doc­ker­fi­le används för Docker-bilden. Den spe­ci­fi­ce­rar alla beroenden 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­rar Docker att använda Python 3.7-bilden. Dessutom ställer vi in nöd­vän­di­ga mil­jö­va­ri­ab­ler för flask-kommandot. Med hjälp av apk add in­stal­le­rar vi viktiga beroenden, inklusive gcc. För att con­tai­nern ska kunna övervaka port 5000 anger vi EXPOSE. Med hjälp av COPY överför vi in­ne­hål­let i den aktuella mappen till ar­betska­ta­lo­gen /code i con­tai­nern. Slutligen väljer vi flask run som stan­dard­kom­man­do för con­tai­nern.

Kon­trol­le­ra att Doc­ker­fi­le har sparats utan fi­län­del­se, eftersom vissa re­di­ge­rings­pro­gram au­to­ma­tiskt lägger till suffixet .txt.

Steg 3: Skapa YAML-fil

I docker-compose.yml kon­fi­gu­re­rar vi tjäns­ter­na ”redis” och ”web”.

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

Webb­tjäns­ten är byggd med hjälp av Docker-bilden som skapats av Doc­ker­fi­le. Den kopplar samman con­tai­nern och värd­da­torn med port 8000, medan Flask-webb­ser­vern körs på port 5000. Redis-bilden hämtas däremot direkt från den of­fi­ci­el­la Docker Hub.

Steg 4: Kör ap­pli­ka­tio­nen med Compose

Starta ap­pli­ka­tio­nen från din pro­jekt­mapp.

docker compose up
shell

Öppna http://localhost:8000 i din webb­lä­sa­re. Du kan också ange http://127.0.0.1:8000.

Du bör se följande med­de­lan­de:

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

Uppdatera sidan. Antalet visningar bör nu ha ökat med 1.

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

Avsluta pro­gram­met med:

$ docker compose down
shell

För att avsluta pro­gram­met trycker du bara på Ctrl + C i ter­mi­na­len.

Steg 5: Lägg till en bindmount

Om du vill lägga till en bind­nings­mon­te­ring för webb­tjäns­ten kan du göra det i docker-compose.yml.

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

Under avsnittet Volumes anger vi att den aktuella pro­jekt­map­pen ska kopplas till katalogen /code i con­tai­nern. Detta möjliggör smidiga ko­dänd­ring­ar utan att bilden behöver skapas om. Variabeln FLASK_DEBUG anger att flask run ska köras i ut­veck­lings­lä­ge.

Steg 6: Bygg om och kör ap­pli­ka­tio­nen

Ange följande kommando i ter­mi­na­len för att återskapa Compose-filen:

docker compose up
shell

Steg 7: Uppdatera ap­pli­ka­tio­nen

Nu när du använder en bind-mount för din ap­pli­ka­tion kan du ändra din kod och au­to­ma­tiskt se änd­ring­ar­na utan att behöva bygga om bilden.

Skriv ett nytt väl­komst­test i app.py.

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

Uppdatera webb­lä­sa­ren för att testa om änd­ring­ar­na har tilläm­pats.

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

Steg 8: andra kommandon

Al­ter­na­ti­vet --help listar till­gäng­li­ga Docker Compose-kommandon:

docker compose --help
shell

För att köra Docker Compose i bak­grun­den kan du lägga till ar­gu­men­tet -d:

docker compose up -d
shell

Använd down för att ta bort alla behållare. Al­ter­na­ti­vet --volumes raderar de volymer som används av Redis-be­hål­la­ren.

docker compose down --volumes
shell
Gå till huvudmeny