Compose vienkāršo lie­to­jum­prog­ram­mu mē­ro­go­ša­nu un iz­vie­to­ša­nu Docker vidē, au­to­ma­ti­zē­jot kon­tei­ne­ru pār­val­dī­bu. Mūsu apmācībā tiek sīki izskatīta Docker Compose kon­fi­gu­rē­ša­na un iz­man­to­ša­na, lai op­ti­mi­zē­tu lie­to­jum­prog­ram­mu iz­vie­to­ša­nas procesu.

Kas ir Docker Compose?

Docker Compose tiek izmantots, lai pār­val­dī­tu lie­to­jum­prog­ram­mas un pa­augst­i­nā­tu efek­ti­vi­tā­ti kon­tei­ne­ru izstrādē. Kon­fi­gu­rā­ci­jas tiek definētas vienā YAML failā, kas atvieglo lie­to­jum­prog­ram­mu izveidi un mē­ro­go­ša­nu. Docker Compose bieži izmanto vietējās vides kon­fi­gu­rē­ša­nai. Tomēr tas var būt arī daļa no ne­pār­trauk­tas in­teg­rā­ci­jas/ne­pār­trauk­tas piegādes (CI/CD) darba plūsmas. Iz­strā­dā­tā­ji var definēt konkrētu kon­tei­ne­ru versiju tes­tē­ša­nai vai konkrētām procesa fāzēm. Tas atvieglo problēmu iden­ti­fi­cē­ša­nu un kļūdu novēršanu, pirms lie­to­jum­prog­ram­ma tiek nodota eks­plua­tā­ci­jā.

Docker Compose prasības

Lai no­dro­ši­nā­tu kon­tei­ne­ru koor­di­nā­ci­ju, ir ne­pie­cie­šams gan Docker Engine, gan Docker Compose. Pār­lie­ci­nie­ties, ka jūsu sistēmā ir instalēta viena no šīm prog­ram­mām:

  • Docker Engine un Docker Compose: var instalēt kā at­se­viš­ķas binārās prog­ram­mas.
  • Docker Desktop: at­tīs­tī­bas vide ar grafisko lietotāja saskarni, kas ietver Docker Engine un Docker Compose.
Tip

Uzziniet, kā instalēt Docker Compose dažādās ope­rē­tājsis­tē­mās, iz­man­to­jot mūsu apmācības:

Soli pa solim: kā lietot Docker Compose

Tur­pi­nā­ju­mā parādīsim, kā izmantot Docker Compose, iz­man­to­jot vienkāršu Python tīmekļa lie­to­jum­prog­ram­mu, kurā ir iebūvēts ap­mek­lē­ju­mu skai­tī­tājs. Šim nolūkam iz­man­to­sim Python Flask rāmi un Redis atmiņas datubāzi. Python vai Redis nav jāinstalē, jo tie ir pieejami kā Docker attēli.

1. solis: Iz­vei­do­jiet projekta failus

Atveriet termināli un iz­vei­do­jiet jaunu mapi projektam.

$ mkdir composedemo
shell

Pāriet uz di­rek­to­ri­ju.

$ cd composedemo
shell

Iz­vei­do­jiet šajā mapē failu app.py un pie­vie­no­jiet tam šādu kodu:

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

Mūsu kon­fi­gu­rā­ci­jā iz­man­to­jam hostvārdu redis un no­klu­sē­ju­ma portu 6379, lai izveidotu sa­vie­no­ju­mu ar Redis pa­kal­po­ju­mu. Turklāt norādām, ka funkcijai get_hit_count() jāveic vairāki mē­ģi­nā­ju­mi izveidot sa­vie­no­ju­mu ar pa­kal­po­ju­mu. Tas ir ieteicams gadījumos, kad Redis var nebūt uzreiz pieejams lie­to­jum­prog­ram­mas pa­lai­ša­nas brīdī vai ja darbības laikā var rasties pār­trau­ku­mi sa­vie­no­ju­mā.

Iz­vei­do­jiet failu requi­re­ments.txt ar atkarībām:

flask
redis
plaintext

2. solis: Dockerfi­le kon­fi­gu­rē­ša­na

Dockerfi­le tiek izmantots Docker attēlam. Tajā ir norādītas visas atkarības, kas ne­pie­cie­ša­mas Python lie­to­jum­prog­ram­mai.

# 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

Mēs norādām Docker izmantot Python 3.7 attēlu. Turklāt mēs iestatām ne­pie­cie­ša­mos vides mainīgos lielumus komandai flask. Iz­man­to­jot apk add, mēs in­sta­lē­jam būtiskās atkarības, tostarp gcc. Lai kon­tei­ners varētu uzraudzīt 5000. portu, mēs norādām EXPOSE. Iz­man­to­jot COPY, mēs pārnesam pa­šrei­zē­jās mapes saturu uz darba di­rek­to­ri­ju /code kon­tei­ne­ra iekšienē. Vis­bei­dzot, kā kon­tei­ne­ra no­klu­sē­ju­ma komandu mēs iz­vē­la­mies flask run.

Pār­lie­ci­nie­ties, ka faila „Dockerfi­le“ no­sau­ku­mam nav pie­vie­no­ta faila pa­pla­ši­nā­ju­ma, jo daži teksta redaktori au­to­mā­tis­ki pievieno pa­pla­ši­nā­ju­mu .txt.

3. solis: Iz­vei­do­jiet YAML failu

Failā docker-compose.yml mēs kon­fi­gu­rē­jam pa­kal­po­ju­mus „redis“ un „web“.

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

Tīmekļa pa­kal­po­jums ir izveidots, iz­man­to­jot Docker failā „Dockerfi­le“ izveidoto Docker attēlu. Tas savieno kon­tei­ne­ru un uz­ņē­mēj­da­to­ru ar 8000. portu, savukārt Flask tīmekļa serveris darbojas 5000. portā. Savukārt Redis attēls tiek iegūts tieši no oficiālā Docker Hub.

4. solis: Palaižiet lie­to­jum­prog­ram­mu ar Compose

Palaižiet lie­to­jum­prog­ram­mu no sava projekta mapes.

docker compose up
shell

Atveriet pār­lūkprog­ram­mā vietni http://localhost:8000. Varat arī ievadīt http://127.0.0.1:8000.

Jums vajadzētu redzēt šādu ziņojumu:

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

At­jau­no­jiet lapu. Skatījumu skaitam tagad vajadzētu būt pa­lie­li­nā­ju­ša­mies par 1.

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

Pār­trau­ciet lie­to­jum­prog­ram­mas darbību, iz­man­to­jot:

$ docker compose down
shell

Lai pār­trauk­tu prog­ram­mas darbību, terminālī vienkārši no­spie­diet Ctrl + C.

5. solis: Pie­vie­no­jiet saistīto montējumu

Ja vēlaties pievienot saistītu montējumu tīmekļa pa­kal­po­ju­mam, to var izdarīt failā docker-compose.yml.

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

Sadaļā „Volumes“ mēs norādām, ka pa­šrei­zē­jā projekta mape tiek pie­vie­no­ta kon­tei­ne­rā esošajam /code katalogam. Tas ļauj vienkārši veikt izmaiņas kodā, ne­iz­vei­do­jot attēlu no jauna. Mainīgais FLASK_DEBUG norāda flask run, ka jā­dar­bo­jas izstrādes režīmā.

6. solis: Pār­kom­pi­lē­jiet un palaidiet lie­to­jum­prog­ram­mu

Lai pār­kom­pi­lē­tu Compose failu, terminālī ievadiet šādu komandu:

docker compose up
shell

7. solis: At­jau­ni­niet lie­to­jum­prog­ram­mu

Tagad, kad savai lie­to­jum­prog­ram­mai iz­man­to­jat „bind mount“, varat veikt izmaiņas kodā un au­to­mā­tis­ki redzēt šīs izmaiņas, ne­iz­vei­do­jot attēlu no jauna.

Izveido jaunu sākuma testu failā app.py.

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

At­jau­ni­niet pārlūku, lai pār­bau­dī­tu, vai izmaiņas ir stājušās spēkā.

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

8. solis: citas komandas

--help pieejamās Docker Compose komandu opcijas:

docker compose --help
shell

Lai palaistu Docker Compose fonā, varat pievienot argumentu -d:

docker compose up -d
shell

Iz­man­to­jiet down, lai izdzēstu visus kon­tei­ne­rus. Komanda --volumes dzēš sējumus, kurus izmanto Redis kon­tei­ners.

docker compose down --volumes
shell
Go to Main Menu