← Vissza a bloghoz Útmutató

Docker hálózatok alapjai: hogyan beszélgetnek a konténerek?

Bridge, host és none hálózatok, port-publikálás és a konténerek közötti kommunikáció DNS-névvel. A Docker networking érthető bevezetője gyakorlati példákkal.

A konténerek önmagukban szigetek — de a valódi alkalmazásokban folyamatosan beszélgetniük kell egymással. A webszervernek el kell érnie az adatbázist, az API-nak a cache-t, neked pedig a böngészőből mindezt. De hogyan találják meg egymást a konténerek? Mi történik, amikor kiadod a -p 8080:80 kapcsolót? És miért működik az, hogy az egyik konténer egyszerűen a db névvel hivatkozik a másikra? Ebben a cikkben érthetően, gyakorlati példákkal vezetünk végig a Docker hálózatkezelés alapjain.

A hálózati driverek

A Docker a hálózatokat driverek segítségével valósítja meg. A leggyakoribbak:

  • bridge — az alapértelmezett. Egy izolált, privát hálózatot hoz létre a hoszton, amelyhez a konténerek csatlakoznak. A legtöbb egygépes esetben ezt használod.
  • host — a konténer közvetlenül a hoszt hálózati stackjét használja, izoláció nélkül. Nincs külön IP-cím, a konténer portjai egyből a hoszton jelennek meg.
  • none — a konténer minden hálózati kapcsolat nélkül indul. Teljesen izolált.
  • overlay — több Docker hoszt konténereit köti össze egyetlen virtuális hálózatban (pl. Docker Swarm esetén). Egygépes fejlesztéshez ritkán kell, de jó tudni róla.

A hálózatok listázása:

docker network ls

A kimenetben látod az alapból létező bridge, host és none hálózatokat.

Alapértelmezett bridge vs. felhasználói bridge

Itt egy fontos megkülönböztetés, ami sok kezdőt megzavar. Létezik egy alapértelmezett bridge hálózat (a neve bridge), amelyhez a konténerek automatikusan csatlakoznak, ha nem adsz meg mást. És létezik a felhasználói (user-defined) bridge, amit te magad hozol létre.

A kettő közti döntő különbség: a felhasználói bridge hálózaton működik a beépített DNS-feloldás a konténerek nevével, az alapértelmezett bridge-en viszont nem. Vagyis a saját hálózatodon az egyik konténer simán hivatkozhat a másikra a nevével — az alapértelmezetten ehhez IP-címet vagy elavult --link-et kellene használni.

Ezért a gyakorlati ajánlás: mindig hozz létre saját bridge hálózatot, ha a konténereidnek beszélgetniük kell egymással.

docker network create app-net

💡 Tipp: A felhasználói bridge-en a konténereket nem csak indításkor, hanem futás közben is hálózathoz csatolhatod vagy leválaszthatod a docker network connect és docker network disconnect parancsokkal — anélkül, hogy újraindítanád őket.

Konténerek közötti kommunikáció DNS-névvel

Most jön a varázslat. Indítsunk két konténert ugyanazon a saját hálózaton: egy adatbázist és egy alkalmazást.

docker network create app-net

docker run -d --name db --network app-net \
  -e POSTGRES_PASSWORD=secret \
  postgres:16-alpine

docker run -it --name app --network app-net \
  alpine sh

Az app konténer shelljéből most egyszerűen a db névvel éred el az adatbázist — a Docker beépített DNS-szervere feloldja a konténer nevét a megfelelő belső IP-címre:

# az "app" konténeren belül
ping db
nc -zv db 5432

Ez azért működik, mert mindkét konténer ugyanazon a felhasználói bridge hálózaton van, és ott a konténernév egyben hosztnévként is funkcionál. Pontosan ezt használod ki, amikor egy alkalmazás konfigurációjában db:5432-t írsz egy IP-cím helyett.

Port-publikálás: a -p kapcsoló

Eddig a konténerek egymás közti kommunikációjáról volt szó. De mi van, ha a hoszt gépről (vagy a böngészőből) akarsz elérni egy konténert? Itt jön a port-publikálás, a -p (vagy --publish) kapcsoló.

docker run -d --name web -p 8080:80 nginx:alpine

A -p 8080:80 formátuma HOSZT_PORT:KONTÉNER_PORT. Ez azt jelenti:

  • A konténerben az Nginx a 80-as porton figyel.
  • A hoszton ezt a 8080-as porton tesszük elérhetővé.
  • A böngészőből a http://localhost:8080 címen éred el.

Néhány hasznos variáció:

# csak a localhost interfészen publikálva (nem érhető el kívülről)
docker run -d -p 127.0.0.1:8080:80 nginx:alpine

# véletlenszerű szabad hoszt-port hozzárendelése
docker run -d -p 80 nginx:alpine

⚠️ Figyelem: A port-publikálás csak a hoszt felé nyit kaput. Két konténer egymással való kommunikációjához nincs szükség -p-re — ők a közös hálózaton, a belső porton beszélgetnek. A -p kizárólag a külvilág–hoszt irányt szabályozza.

A host és none hálózat a gyakorlatban

A host hálózaton a konténer nem kap külön hálózati névteret, hanem osztozik a hoszt hálózatán:

docker run -d --network host nginx:alpine

Itt nincs -p kapcsoló — a konténer 80-as portja egyből a hoszt 80-as portja lesz. Cserébe nincs hálózati izoláció, és portütközés léphet fel. (Megjegyzés: a host driver natívan Linuxon működik így; Docker Desktop alatt a viselkedése eltérhet.)

A none hálózat teljesen elszigeteli a konténert — nincs külső kapcsolata. Ez akkor hasznos, ha egy konténernek semmilyen hálózati hozzáférésre nincs szüksége, és a támadási felületet a minimumra akarod csökkenteni.

Hasznos hálózati parancsok

A leggyakoribb hálózatkezelő parancsok:

# hálózat létrehozása
docker network create app-net

# hálózatok listázása
docker network ls

# egy hálózat részletei (mely konténerek csatlakoznak)
docker network inspect app-net

# futó konténer csatlakoztatása egy hálózathoz
docker network connect app-net web

# leválasztás egy hálózatról
docker network disconnect app-net web

# nem használt hálózatok eltakarítása
docker network prune

Ahogy a Compose létrehozza a hálózatot

Ha Docker Compose-t használsz, a hálózatkezelés nagy részét nem neked kell intézned. A docker compose up automatikusan létrehoz egy dedikált felhasználói bridge hálózatot a projekt számára, és minden szolgáltatást ehhez csatlakoztat. Mivel ez egy felhasználói bridge, a szolgáltatások azonnal hivatkozhatnak egymásra a nevükön — ugyanazzal a DNS-feloldással, amit fentebb kézzel állítottunk be.

Tehát egy compose.yaml-ben, ahol van egy web és egy db szolgáltatás, a web simán használhatja a db hosztnevet — minden külön hálózati konfiguráció nélkül. Erről részletesen a Docker Compose bevezető cikkben olvashatsz. Az alapokhoz pedig nézd meg a Mi az a Docker? cikket vagy a Hogyan működik oldalt.

Összefoglalás

A Docker hálózatkezelés a kezdeti rejtélyesség ellenére néhány tiszta elvre épül:

  • A hálózatokat driverek valósítják meg: a leggyakoribb a bridge, mellette a host, none és (több gépre) az overlay.
  • A felhasználói bridge hálózaton működik a konténernév-alapú DNS — ezért érdemes mindig saját hálózatot létrehozni.
  • A konténerek ugyanazon a hálózaton a nevükön szólítják egymást, a belső porton keresztül.
  • A -p HOSZT:KONTÉNER port-publikálás csak a hoszt felé nyit kaput, nem a konténerek közé.
  • A Compose automatikusan létrehozza a hálózatot, és a szolgáltatások a nevükön elérik egymást.

Itt az ideje kipróbálni! Hozz létre egy app-net hálózatot, indíts rá két konténert, és próbáld meg az egyikből a másikat a nevével elérni. Ha még a telepítésnél tartasz, kezdd a Telepítés oldallal, vagy frissítsd fel az alapokat a Kezdő lépések útmutatóval.