Compose po­e­no­sta­vlja pri­la­ga­ja­nje zmo­glji­vo­sti in uvajanje aplikacij v Dockerju z av­to­ma­ti­za­ci­jo upra­vlja­nja kon­tej­ner­jev. V našem vodiču bomo podrobno obrav­na­va­li na­sta­vi­tev in uporabo Docker Compose za po­e­no­sta­vi­tev postopka uvajanja vaših aplikacij.

Kaj je Docker Compose?

Docker Compose se uporablja za upra­vlja­nje aplikacij in povečanje učin­ko­vi­to­sti pri razvoju kon­tej­ner­jev. Kon­fi­gu­ra­ci­je so opre­de­lje­ne v eni sami datoteki YAML, kar omogoča enostavno se­sta­vlja­nje in pri­la­ga­ja­nje obsega aplikacij. Docker Compose se pogosto uporablja za vzpo­sta­vi­tev lokalnega okolja. Lahko pa je tudi del delovnega toka ne­pre­ki­nje­ne in­te­gra­ci­je in ne­pre­ki­nje­ne dostave (CI/CD). Raz­vi­jal­ci lahko določijo posebno različico kon­tej­ner­ja za te­sti­ra­nje ali določene faze poteka. To olajša pre­po­zna­va­nje težav in od­pra­vlja­nje napak, preden apli­ka­ci­ja preide v pro­duk­ci­jo.

Zahteve za Docker Compose

Za upra­vlja­nje kon­tej­ner­jev po­tre­bu­je­te tako Docker Engine kot Docker Compose. Preverite, ali imate v sistemu nameščen enega od na­sle­dnjih programov:

  • Docker Engine in Docker Compose: Lahko ju namestite kot sa­mo­stoj­ni iz­ve­dlji­vi datoteki.
  • Docker Desktop: razvojno okolje z grafičnim upo­rab­ni­škim vmesnikom, ki vključuje Docker Engine in Docker Compose.
Tip

V naših navodilih si oglejte, kako namestiti Docker Compose na različnih ope­ra­cij­skih sistemih:

Podroben vodnik za uporabo Docker Compose

V na­da­lje­va­nju bomo prikazali, kako upo­ra­blja­ti Docker Compose s preprosto spletno apli­ka­ci­jo v jeziku Python, ki uporablja število ogledov. Za to bomo uporabili ogrodje Python Flask in po­dat­kov­no bazo v po­mnil­ni­ku Redis. Python in Redis vam ni treba namestiti, saj sta na voljo kot slike Dockerja.

1. korak: Ustvarite projektne datoteke

Zaženi terminal in ustvari novo mapo za projekt.

$ mkdir composedemo
shell

Pre­klo­pi­te v imenik.

$ cd composedemo
shell

V tej mapi ustvarite datoteko app.py in vanjo vnesite naslednjo kodo:

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

V naši kon­fi­gu­ra­ci­ji za povezavo s sto­ri­tvi­jo Redis upo­ra­blja­mo ime go­sti­te­lja redis in privzeto vrata 6379 «. Poleg tega določimo, da mora funkcija get_hit_count() opraviti več poskusov povezave s sto­ri­tvi­jo. To je pri­po­ro­člji­vo v primerih, ko Redis ob zagonu apli­ka­ci­je morda ni takoj na voljo ali pa med iz­va­ja­njem pride do občasnih težav s povezavo.

Ustvarite datoteko re­qui­re­ments.txt z od­vi­snost­mi:

flask
redis
plaintext

Korak 2: Nastavite datoteko Doc­ker­fi­le

Datoteka Doc­ker­fi­le se uporablja za sliko Dockerja. V njej so navedene vse od­vi­sno­sti, ki jih potrebuje apli­ka­ci­ja v jeziku Python.

# 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

Dockerju naročimo, naj uporabi sliko Python 3.7. Poleg tega nastavimo potrebne spre­men­ljiv­ke okolja za ukaz flask. Z ukazom apk add namestimo nujne od­vi­sno­sti, vključno z gcc. Da bi kon­tej­ner­ju omogočili spre­mlja­nje vrat 5000, določimo EXPOSE. Z COPY prenesemo vsebino trenutne mape v delovni imenik /code znotraj kon­tej­ner­ja. Nazadnje kot privzeti ukaz za kontejner izberemo flask run.

Preverite, ali je bil datoteka Doc­ker­fi­le shranjena brez končnice, saj nekateri ure­je­val­ni­ki samodejno dodajo končnico .txt.

Korak 3: Ustvarite datoteko YAML

V datoteki docker-compose.yml kon­fi­gu­ri­ra­mo storitvi »redis« in »web«.

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

Spletna storitev je zgrajena z uporabo slike Docker, ki jo ustvari datoteka Doc­ker­fi­le. Ta poveže kontejner in go­sti­telj­ski ra­ču­nal­nik s vratom 8000, medtem ko spletni strežnik Flask deluje na vratih 5000. Slika Redis pa se pridobi ne­po­sre­dno iz uradnega Docker Hub.

Korak 4: Zaženi apli­ka­ci­jo s Compose

Zaženite apli­ka­ci­jo iz mape s projektom.

docker compose up
shell

V br­skal­ni­ku odprite stran http://localhost:8000. Lahko vnesete tudi http://127.0.0.1:8000.

Prikazalo se bo naslednje sporočilo:

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

Osvežite stran. Število ogledov bi se zdaj moralo povečati za 1.

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

Uporabite naslednje za ustavitev programa:

$ docker compose down
shell

Če želite ustaviti delovanje apli­ka­ci­je, v terminalu preprosto vtipkajte Ctrl + C.

Korak 5: Dodajte vezavo

Če želite dodati vezano vpetje za spletno storitev, lahko to storite v datoteki docker-compose.yml.

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

V razdelku »Volumes« določimo, da se trenutna projektna mapa priključi na imenik /code znotraj kon­tej­ner­ja. To omogoča nemoteno spre­mi­nja­nje kode, ne da bi bilo treba ponovno ustvariti sliko. Spre­men­ljiv­ka FLASK_DEBUG naroča flask run, naj deluje v razvojnem načinu.

Korak 6: Ponovna sestava in zagon apli­ka­ci­je

V terminalu vnesite naslednji ukaz, da ponovno ustvarite datoteko Compose:

docker compose up
shell

7. korak: Posodobi apli­ka­ci­jo

Sedaj, ko za svojo apli­ka­ci­jo upo­ra­blja­te vezavo, lahko spre­mi­nja­te kodo in spremembe vidite takoj, brez da bi morali ponovno zgraditi sliko.

V datoteki app.py napišite nov test za do­bro­do­šli­co.

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

Osvežite brskalnik, da preverite, ali so bile spremembe upo­šte­va­ne.

Image: Docker Compose application: modified welcome text
The welcome text in the Python appli­ca­ti­on has been modified

Korak 8: drugi ukazi

Na voljo je --help seznamov možnosti za ukaze Docker Compose:

docker compose --help
shell

Če želite Docker Compose zagnati v ozadju, lahko dodate argument -d:

docker compose up -d
shell

Z ukazom down od­stra­ni­te vse kon­tej­ner­je. Možnost --volumes izbriše prostore, ki jih uporablja kontejner Redis.

docker compose down --volumes
shell
Go to Main Menu