Docker Compose bevezető: több konténer egy fájlból
A Docker Compose-zal egyetlen YAML fájlból indíthatsz egy teljes alkalmazás-stacket adatbázissal együtt. Megtanulod a compose.yaml felépítését és a fő parancsokat.
Egy igazi alkalmazás ritkán egyetlen konténerből áll. Általában van egy webes szolgáltatásod, mellette egy adatbázis, talán egy gyorsítótár (cache), és ezeknek mind együtt kell működniük. Ha mindezt kézzel, sok-sok docker run paranccsal indítgatnád, gyorsan elvesznél a kapcsolók és a hálózati beállítások között. Itt jön képbe a Docker Compose: egyetlen, jól olvasható YAML fájlban leírod a teljes stacket, majd egyetlen paranccsal elindítod. Ebben a cikkben végigvesszük, mi a Compose, hogyan néz ki egy valós compose.yaml, és melyek a legfontosabb parancsok.
Mi az a Docker Compose, és miért jó?
A Docker Compose egy eszköz, amellyel több konténerből álló alkalmazásokat definiálhatsz és kezelhetsz egyetlen konfigurációs fájlból. A modern Docker Engine telepítésekkel együtt érkezik, és a docker compose (két szó, nem kötőjel!) parancson keresztül érhető el. A régi, Python-alapú docker-compose parancs elavult — ma a Compose v2-t használjuk, ami a Docker CLI beépített része.
A fő előnyök:
- Reprodukálhatóság: a teljes környezet egy fájlban van, amit verziókezelőben tárolhatsz.
- Egyszerűség: egyetlen
docker compose upparanccsal indul minden szolgáltatás. - Automatikus hálózat: a Compose létrehoz egy közös hálózatot, amin a szolgáltatások a nevükön szólíthatják egymást.
- Skálázhatóság fejlesztéshez: könnyen indíthatsz több példányt egy szolgáltatásból.
Ha még csak most ismerkedsz a konténerekkel, érdemes előbb átfutni a Mi az a Docker? cikket, illetve a Kezdő lépések oldalt.
Egy valós compose.yaml példa
Nézzünk egy tipikus webalkalmazást: egy alkalmazás-szolgáltatás, mögötte egy PostgreSQL adatbázis és egy Redis cache. A projekt gyökerébe hozz létre egy compose.yaml fájlt:
services:
web:
build: .
ports:
- "8080:3000"
environment:
DATABASE_URL: postgres://app:secret@db:5432/appdb
REDIS_URL: redis://cache:6379
depends_on:
db:
condition: service_healthy
cache:
condition: service_started
restart: unless-stopped
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: secret
POSTGRES_DB: appdb
volumes:
- db-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app -d appdb"]
interval: 5s
timeout: 5s
retries: 5
cache:
image: redis:7-alpine
volumes:
- cache-data:/data
volumes:
db-data:
cache-data:
Ennyi az egész — egy teljes, háromszolgáltatásos stack egyetlen fájlban. Most nézzük végig, mit jelentenek a kulcsok.
💡 Tipp: A modern Compose-ban már nincs szükség a fájl elején a
version:mezőre. Régebbi példákban gyakran látod (version: "3.8"), de a Compose v2 ezt figyelmen kívül hagyja, így nyugodtan elhagyhatod.
A felépítés részletei
services
A services blokk alá kerül minden konténer-szolgáltatás. A példában három van: web, db és cache. A szolgáltatás neve egyben a hosztnév is lesz a belső hálózaton — erre mindjárt visszatérünk.
image vs. build
Két módon adhatod meg, honnan jön egy szolgáltatás image-e:
image:— kész image-et húz le egy registry-ből (pl.postgres:16-alpine).build: .— a megadott könyvtárban lévőDockerfilealapján buildel egy saját image-et.
Ha saját image-et építesz, érdemes átnézni a Dockerfile írása lépésről lépésre cikket.
ports
A ports mező publikálja a konténer portját a hoszt gép felé. A "8080:3000" azt jelenti: a hoszt 8080-as portja a konténer 3000-es portjára mutat. Tehát a böngészőből a http://localhost:8080 címen éred el az appot.
Fontos: a szolgáltatások egymás közti kommunikációjához nincs szükség port-publikálásra — a ports csak a külvilág (a hoszt) felé nyit kaput.
environment
Itt adhatsz át környezeti változókat a konténernek. Figyeld meg a web szolgáltatás DATABASE_URL értékét: postgres://app:secret@db:5432/appdb. A hosztnév itt egyszerűen db — vagyis a másik szolgáltatás neve. Ez a Compose belső DNS-ének köszönhető.
volumes
A volumes gondoskodik az adatok megőrzéséről. A db-data:/var/lib/postgresql/data egy named volume-ot csatol a PostgreSQL adatkönyvtárához, így a konténer újraindítása vagy törlése után sem vesznek el az adataid. A fájl alján külön deklarálni kell a használt named volume-okat. Erről bővebben az Adattárolás Dockerben cikkben olvashatsz.
depends_on
A depends_on megadja az indítási sorrendet. A condition: service_healthy arra utasítja a Compose-t, hogy a web csak akkor induljon, amikor az adatbázis healthcheck-je sikeres. Ehhez kell a db alatti healthcheck blokk.
A fő Compose-parancsok
A compose.yaml mellett állva (azaz abban a könyvtárban) az alábbi parancsok a legfontosabbak.
A teljes stack indítása a háttérben (detached):
docker compose up -d
A futó szolgáltatások állapotának listázása:
docker compose ps
A naplók követése (az összes szolgáltatásé, vagy csak egyé):
docker compose logs -f
docker compose logs -f web
A stack leállítása és a konténerek + hálózat eltávolítása:
docker compose down
Ha a named volume-okat is törölni akarod (vigyázat, ez törli az adatbázist!):
docker compose down -v
Egy szolgáltatás image-ének újraépítése és újraindítása:
docker compose up -d --build
Parancs futtatása egy szolgáltatás konténerében (pl. egy adatbázis-shell):
docker compose exec db psql -U app -d appdb
Az alábbi táblázat összefoglalja a leggyakoribb parancsokat:
| Parancs | Mit csinál |
|---|---|
docker compose up -d | Elindítja a teljes stacket a háttérben |
docker compose down | Leállítja és eltávolítja a konténereket és a hálózatot |
docker compose ps | Listázza a futó szolgáltatásokat |
docker compose logs -f | Élőben követi a naplókat |
docker compose restart | Újraindítja a szolgáltatásokat |
docker compose pull | Lehúzza a legfrissebb image-eket |
Az automatikusan létrehozott hálózat
Amikor kiadod a docker compose up parancsot, a Compose automatikusan létrehoz egy dedikált bridge hálózatot a projekt számára. Minden szolgáltatás ehhez csatlakozik, és a saját nevén elérhető a többi számára — beépített DNS-feloldással. Ezért működik a db:5432 vagy a cache:6379 hivatkozás a konfigurációban.
⚠️ Figyelem: A szolgáltatások a belső porton kommunikálnak egymással (pl. a Postgres az 5432-esen), függetlenül attól, hogy a
portsmezőben milyen hoszt-portot publikáltál. Aportskizárólag a hoszt felé történő hozzáférést szabályozza.
Ha mélyebben érdekel, hogyan épül fel a Docker hálózat, nézd meg a Docker hálózatok alapjai cikket. Az pedig, hogy egyáltalán miért éri meg konténerekben gondolkodni, a Miért a Docker? oldalon olvasható.
Összefoglalás
A Docker Compose a legkényelmesebb módja annak, hogy több konténerből álló alkalmazást kezelj. A lényeg dióhéjban:
- Egy
compose.yamlfájlban definiálod aservices,volumesés (opcionálisan)networksblokkokat. - Az
imagevagybuildadja meg, honnan jön a konténer; aports,environment,volumesésdepends_onfinomhangolja a működést. - A
docker compose up -d,down,pséslogsa négy parancs, amit a leggyakrabban használsz. - A Compose automatikus hálózatán a szolgáltatások a nevükön szólítják egymást.
Készen állsz, hogy kipróbáld? Másold be a fenti compose.yaml-t egy üres mappába, igazítsd a saját alkalmazásodhoz, és add ki a docker compose up -d parancsot. Ha még a telepítéssel akadtál el, kezdd a Telepítés oldallal, vagy frissítsd fel az alapokat a Hogyan működik cikkel. Jó kísérletezést!