Jak používat Docker Compose pro aplikace s více kontejnery
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.
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 composedemoshellPřejděte do adresáře.
$ cd composedemoshellVytvoř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)pythonV 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
redisplaintextKrok 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"]shellDockeru 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"yamlWebová 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 upshellV 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:

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

Zastavte aplikaci pomocí:
$ docker compose downshellChcete-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"yamlV 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 upshellKrok 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)pythonObnovte prohlížeč a zkontrolujte, zda byly změny provedeny.

Krok 8: další příkazy
--help možností uvádí seznam dostupných příkazů Docker Compose:
docker compose --helpshellChcete-li spustit Docker Compose na pozadí, můžete přidat argument -d:
docker compose up -dshellPomocí down odeberete všechny kontejnery. Volba --volumes odstraní svazky používané kontejnerem Redis.
docker compose down --volumesshell