Compose zjednodušuje škálování a nasazování aplikací v Dockeru automatizací správy kontejnerů. Náš tutoriál se podrobně zabývá nastavením a používáním Docker Compose pro zefektivnění procesu nasazování aplikací.

Co je Docker Compose?

Docker Compose se používá ke správě aplikací a zvýšení efektivity při vývoji kontejnerů. Konfigurace jsou definovány v jediném souboru YAML, což usnadňuje vytváření a škálování aplikací. Docker Compose se často používá k nastavení lokálního prostředí. Může však být také součástí pracovního postupu Continuous Integration / Continuous Delivery (CI/CD). Vývojáři mohou definovat konkrétní verzi kontejneru pro testování nebo konkrétní fáze pipeline. To usnadňuje identifikaci problémů a opravu chyb předtím, než se aplikace přesune do produkčního prostředí.

Požadavky na Docker Compose

Pro orchestraci kontejnerů potřebujete jak Docker Engine, tak Docker Compose. Ujistěte se, že máte ve svém systému nainstalován jeden z následujících programů:

  • Docker Engine a Docker Compose: Lze nainstalovat jako samostatné binární soubory.
  • Docker Desktop: Vývojové prostředí s grafickým uživatelským rozhraním včetně Docker Engine a Docker Compose.
Tip

V našich návodech se dozvíte, jak nainstalovat Docker Compose na různé operační systémy:

Podrobný návod k používání Docker Compose

V následujícím textu ukážeme, jak používat Docker Compose s jednoduchou webovou aplikací v jazyce Python, která využívá počítadlo návštěv. K tomu použijeme framework Python Flask a databázi Redis v paměti. Python ani Redis nemusíte instalovat, protože jsou k dispozici jako obrazy Docker.

Krok 1: Vytvořte soubory projektu

Spusťte terminál a vytvořte novou složku pro projekt.

$ mkdir composedemo
shell

Přejděte do adresáře.

$ cd composedemo
shell

Vytvořte v této složce soubor app.py a přidejte do něj následující kód:

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šem nastavení používáme jako název hostitele redis a výchozí port 6379 pro připojení ke službě Redis. Dále specifikujeme, že funkce get_hit_count() by měla provést více pokusů o připojení ke službě. To se doporučuje v případě, že Redis nemusí být ihned k dispozici při spuštění aplikace nebo pokud mohou během běhu aplikace nastat přerušované problémy s připojením.

Vytvořte soubor requirements.txt s následujícími závislostmi:

flask
redis
plaintext

Krok 2: Nastavení souboru Dockerfile

Soubor Dockerfile se používá pro obraz Docker. Ten specifikuje všechny závislosti, které aplikace Python vyžaduje.

# 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

Dockeru zadáme, aby použil obraz Python 3.7. Dále nastavíme potřebné proměnné prostředí pro příkaz flask. Pomocí apk add nainstalujeme nezbytné závislosti, včetně gcc. Aby kontejner mohl monitorovat port 5000, zadáme EXPOSE. Pomocí COPY přeneseme obsah aktuální složky do pracovního adresáře /code v kontejneru. Nakonec jako výchozí příkaz pro kontejner zvolíme flask run.

Zkontrolujte, zda byl soubor Dockerfile uložen bez přípony, protože některé editory automaticky přidávají příponu .txt.

Krok 3: Vytvořte soubor YAML

V souboru docker-compose.yml nakonfigurujeme služby „redis“ a „web“.

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

Webová služba je vytvořena pomocí obrazu Docker vytvořeného souborem Dockerfile. Spojuje kontejner a hostitelský počítač s portem 8000, zatímco webový server Flask běží na portu 5000. Obraz Redis je naopak získán přímo z oficiálního Docker Hubu.

Krok 4: Spusťte aplikaci pomocí Compose

Spusťte aplikaci ze složky projektu.

docker compose up
shell

V prohlížeči otevřete stránku http://localhost:8000. Můžete také zadat adresu http://127.0.0.1:8000.

Měla by se zobrazit následující zpráva:

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

Obnovte stránku. Počet zobrazení by se nyní měl zvýšit o 1.

Obrázek: Calling the Docker Compose application again
The number of visits increased by 1.

Zastavte aplikaci pomocí:

$ docker compose down
shell

Chcete-li aplikaci zastavit, stačí v terminálu stisknout Ctrl + C.

Krok 5: Přidejte vazbu mount

Pokud chcete přidat vazbu pro webovou službu, můžete tak učinit v souboru docker-compose.yml.

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

V sekci Volumes specifikujeme připojení aktuální projektové složky k adresáři /code uvnitř kontejneru. To umožňuje plynulé změny kódu bez nutnosti znovu vytvářet obraz. Proměnná FLASK_DEBUG říká flask run, aby běžel v režimu vývoje.

Krok 6: Přestavte a spusťte aplikaci

Zadejte následující příkaz do terminálu, abyste znovu vytvořili soubor Compose:

docker compose up
shell

Krok 7: Aktualizujte aplikaci

Nyní, když pro svou aplikaci používáte bind mount, můžete upravit svůj kód a automaticky vidět změny bez nutnosti překompilovat obraz.

Napište nový uvítací test v app.py.

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

Obnovte prohlížeč a zkontrolujte, zda byly změny provedeny.

Obrázek: Docker Compose application: modified welcome text
The welcome text in the Python application has been modified

Krok 8: další příkazy

--help možností uvádí seznam dostupných příkazů Docker Compose:

docker compose --help
shell

Chcete-li spustit Docker Compose na pozadí, můžete přidat argument -d:

docker compose up -d
shell

Pomocí down odeberete všechny kontejnery. Volba --volumes odstraní svazky používané kontejnerem Redis.

docker compose down --volumes
shell
Přejít do hlavního menu