← Vissza a bloghoz Útmutató

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 up paranccsal 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ő Dockerfile alapjá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:

ParancsMit csinál
docker compose up -dElindítja a teljes stacket a háttérben
docker compose downLeállítja és eltávolítja a konténereket és a hálózatot
docker compose psListá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 pullLehú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 ports mezőben milyen hoszt-portot publikáltál. A ports kizá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.yaml fájlban definiálod a services, volumes és (opcionálisan) networks blokkokat.
  • Az image vagy build adja meg, honnan jön a konténer; a ports, environment, volumes és depends_on finomhangolja a működést.
  • A docker compose up -d, down, ps és logs a 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!