\section{Docker hálózatok} \begin{frame}{Docker hálózatok -- Bevezetés} \begin{block}{Miért fontosak a Docker hálózatok?} \begin{itemize} \item Konténerek közötti kommunikáció \item Szolgáltatások izolálása \item Biztonságos konténer-architektúra \end{itemize} \end{block} \end{frame} \begin{frame}{Probléma hálózatok nélkül} \begin{alertblock}{Mi történik hálózatok nélkül?} \begin{itemize} \item Konténerek nem érik el egymást \item Minden port-ot a host-ra kell publikálni \item Nincs belső szolgáltatás-felderítés (DNS) \end{itemize} \end{alertblock} \end{frame} \begin{frame}{Megoldás -- Docker hálózatok} \begin{exampleblock}{Docker hálózatokkal} \begin{itemize} \item Konténerek név alapján érik el egymást \item Belső kommunikáció port-publikálás nélkül \item Automatikus DNS feloldás \end{itemize} \end{exampleblock} \end{frame} \begin{frame}{Hálózati driverek -- Áttekintés} \begin{block}{Docker hálózati driverek} \begin{itemize} \item \texttt{bridge}: Alapértelmezett, izolált hálózat \item \texttt{host}: Host hálózat közvetlen használata \item \texttt{none}: Nincs hálózat \end{itemize} \end{block} \end{frame} \begin{frame}{Hálózati driverek -- További} \begin{block}{Haladó driverek} \begin{itemize} \item \texttt{overlay}: Több Docker host közötti hálózat (Swarm) \item \texttt{macvlan}: Saját MAC cím, fizikai hálózatba illeszkedik \end{itemize} \end{block} \end{frame} \begin{frame}{Bridge hálózat -- Mi az?} \begin{block}{Bridge driver (alapértelmezett)} \begin{itemize} \item Szoftveres hálózati híd a host-on \item Konténerek egymást elérik a bridge-en \item Külvilág felé port-publikálás szükséges \end{itemize} \end{block} \end{frame} \begin{frame}{Bridge architektúra} \begin{center} \begin{tikzpicture}[ box/.style={draw, rounded corners, minimum width=2.2cm, minimum height=0.9cm, font=\footnotesize}, bridge/.style={draw, fill=szecyan!20, rounded corners, minimum width=8cm, minimum height=0.7cm, font=\footnotesize}, arr/.style={->, thick, >=stealth} ] % Host \node[draw, dashed, rounded corners, minimum width=9.5cm, minimum height=5cm, label={[font=\footnotesize]above:Host gép}] (host) at (0,0) {}; % Bridge \node[bridge] (br) at (0, 0.5) {docker0 (bridge)}; % Containers \node[box, fill=szezold!30] (c1) at (-2.5, -1.2) {Konténer A}; \node[box, fill=szezold!30] (c2) at (0, -1.2) {Konténer B}; \node[box, fill=szezold!30] (c3) at (2.5, -1.2) {Konténer C}; % veth pairs \draw[arr] (c1.north) -- (br.south -| c1.north); \draw[arr] (c2.north) -- (br.south); \draw[arr] (c3.north) -- (br.south -| c3.north); % External \node[box, fill=szenavy!20, text=szenavy] (ext) at (0, 2.5) {Külvilág}; \draw[arr, dashed] (br.north) -- node[right, font=\scriptsize] {port publish} (ext.south); \end{tikzpicture} \end{center} \end{frame} \begin{frame}[fragile]{Hálózat parancsok -- Listázás} \begin{block}{Hálózatok listázása} \begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily] # Összes hálózat docker network ls # NETWORK ID NAME DRIVER SCOPE # abc123 bridge bridge local # def456 host host local # ghi789 none null local \end{lstlisting} \end{block} \end{frame} \begin{frame}[fragile]{Hálózat parancsok -- Létrehozás} \begin{block}{Hálózat létrehozása} \begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily] # Egyszerű bridge hálózat docker network create mynetwork # Megadott driver-rel docker network create --driver bridge mynetwork # Megadott subnet-tel docker network create --subnet=172.20.0.0/16 mynetwork \end{lstlisting} \end{block} \end{frame} \begin{frame}[fragile]{Hálózat parancsok -- Törlés} \begin{block}{Hálózat törlése és tisztítás} \begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily] # Egy hálózat törlése docker network rm mynetwork # Nem használt hálózatok törlése docker network prune # Részletes információk docker network inspect mynetwork \end{lstlisting} \end{block} \end{frame} \begin{frame}[fragile]{Konténer csatlakoztatás -- Indításkor} \begin{block}{Hálózat megadása indításkor} \begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily] # Konténer indítása adott hálózaton docker run -d --name backend \ --network mynetwork my-app # Több hálózat: indítás után csatlakoztatás docker network connect frontend-net backend \end{lstlisting} \end{block} \end{frame} \begin{frame}[fragile]{Konténer csatlakoztatás -- Utólag} \begin{block}{Utólagos csatlakoztatás / leválasztás} \begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily] # Futó konténer csatlakoztatása hálózathoz docker network connect mynetwork mycontainer # Leválasztás hálózatról docker network disconnect mynetwork mycontainer \end{lstlisting} \end{block} \end{frame} \begin{frame}{Default bridge vs User-defined} \begin{alertblock}{Default bridge hálózat} \begin{itemize} \item \textbf{Nincs} automatikus DNS feloldás \item Konténerek csak IP-vel érik el egymást \item IP cím változhat újraindításkor \end{itemize} \end{alertblock} \end{frame} \begin{frame}{User-defined bridge -- Előnyök} \begin{exampleblock}{User-defined bridge hálózat} \begin{itemize} \item \textbf{Van} automatikus DNS feloldás \item Konténerek \textbf{név alapján} érik el egymást \item Jobb izoláció, automatikus link \end{itemize} \end{exampleblock} \begin{alertblock}{Ajánlás} Mindig user-defined bridge-et használj! \end{alertblock} \end{frame} \begin{frame}[fragile]{DNS és Service Discovery -- Kód} \begin{exampleblock}{Automatikus névfeloldás} \begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily] # Hálózat létrehozása docker network create app-net # Adatbázis indítása docker run -d --name database \ --network app-net postgres:15 # Backend indítása docker run -d --name backend \ --network app-net \ -e DB_HOST=database \ my-backend \end{lstlisting} \end{exampleblock} \end{frame} \begin{frame}{DNS és Service Discovery -- Magyarázat} \begin{block}{Hogyan működik?} \begin{itemize} \item \texttt{backend} eléri \texttt{database}-t a nevével \item Docker beépített DNS szerver: \texttt{127.0.0.11} \item Konténer név = hostname a hálózaton \end{itemize} \end{block} \end{frame} \begin{frame}[fragile]{Fullstack példa -- Hálózat létrehozás} \begin{exampleblock}{Hálózat előkészítése} \begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily] # Hálózat létrehozása docker network create fullstack-net \end{lstlisting} \end{exampleblock} \end{frame} \begin{frame}[fragile]{Fullstack példa -- Adatbázis} \begin{exampleblock}{PostgreSQL indítása} \begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily] docker run -d --name postgres \ --network fullstack-net \ -e POSTGRES_PASSWORD=secret \ -e POSTGRES_DB=myapp \ -v pgdata:/var/lib/postgresql/data \ postgres:15-alpine \end{lstlisting} \end{exampleblock} \end{frame} \begin{frame}[fragile]{Fullstack példa -- Backend} \begin{exampleblock}{Node.js backend} \begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily] docker run -d --name backend \ --network fullstack-net \ -p 3001:3001 \ -e DATABASE_URL=postgresql://postgres:secret @postgres:5432/myapp \ my-backend \end{lstlisting} \end{exampleblock} \end{frame} \begin{frame}[fragile]{Fullstack példa -- Frontend} \begin{exampleblock}{React frontend} \begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily] docker run -d --name frontend \ --network fullstack-net \ -p 3000:3000 \ my-frontend \end{lstlisting} \end{exampleblock} \end{frame} \begin{frame}{Fullstack példa -- Magyarázat} \begin{block}{Kommunikáció} \begin{itemize} \item Backend eléri az adatbázist: \texttt{postgres:5432} \item Frontend eléri a backend-et: \texttt{backend:3001} \item Külvilág eléri: \texttt{localhost:3000} és \texttt{:3001} \end{itemize} \end{block} \end{frame} \begin{frame}{Port publishing vs belső hálózat} \begin{block}{Mikor kell port publishing?} Csak ha a \textbf{host-ról} vagy \textbf{külvilágból} kell elérni! \end{block} \begin{exampleblock}{Belső hálózat} \begin{itemize} \item Adatbázis: \textbf{NEM} kell port publish \item Backend API: kell, ha host-ról is elérik \item Frontend: kell, mert böngészőből érik el \end{itemize} \end{exampleblock} \end{frame} \begin{frame}[fragile]{Port példa -- Helyes konfiguráció} \begin{exampleblock}{Best practice} \begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily] services: database: image: postgres # Nincs ports: belső! networks: - backend api: ports: - "3001:3001" # Kívülről is elérhető networks: - backend - frontend \end{lstlisting} \end{exampleblock} \end{frame} \begin{frame}{Host hálózat -- Mi az?} \begin{block}{Host driver} \begin{itemize} \item Konténer közvetlenül a host hálózatát használja \item Nincs port mapping szükség \item Nincs hálózati izoláció \end{itemize} \end{block} \end{frame} \begin{frame}[fragile]{Host hálózat -- Használat} \begin{block}{Parancs} \begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily] docker run -d --network host nginx # nginx elérhető: localhost:80 (port mapping nélkül) \end{lstlisting} \end{block} \end{frame} \begin{frame}{Host hálózat -- Előnyök és hátrányok} \begin{exampleblock}{Előnyök} \begin{itemize} \item Jobb hálózati teljesítmény \item Egyszerűbb port-kezelés \end{itemize} \end{exampleblock} \begin{alertblock}{Hátrányok} \begin{itemize} \item Nincs izoláció \item Port ütközések lehetségesek \item Csak Linuxon működik jól \end{itemize} \end{alertblock} \end{frame} \begin{frame}{None hálózat -- Mi az?} \begin{block}{None driver} \begin{itemize} \item Teljesen izolált konténer \item Nincs hálózati hozzáférés \item Batch feldolgozáshoz, biztonsági feladatokhoz \end{itemize} \end{block} \end{frame} \begin{frame}[fragile]{None hálózat -- Használat} \begin{block}{Parancs} \begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily] docker run -d --network none my-batch-processor \end{lstlisting} \end{block} \end{frame} \begin{frame}[fragile]{Network inspect} \begin{block}{Hálózat részletes adatai} \begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily] docker network inspect mynetwork \end{lstlisting} \end{block} \end{frame} \begin{frame}[fragile]{Network inspect -- Kimenet} \begin{block}{Kimenet részlet} \begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily] { "Name": "mynetwork", "Driver": "bridge", "Subnet": "172.20.0.0/16", "Containers": { "abc123": { "Name": "backend", "IPv4Address": "172.20.0.2/16" } } } \end{lstlisting} \end{block} \end{frame} \begin{frame}[fragile]{Egyedi subnet és IP} \begin{block}{Subnet és fix IP beállítás} \begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily] # Hálózat egyedi subnet-tel docker network create \ --subnet=172.28.0.0/16 \ --gateway=172.28.0.1 \ custom-net # Konténer fix IP-vel docker run -d --name db \ --network custom-net \ --ip 172.28.0.10 \ postgres:15 \end{lstlisting} \end{block} \end{frame} \begin{frame}{Egyedi subnet -- Mikor használjuk?} \begin{block}{Mikor hasznos a fix IP?} \begin{itemize} \item Tűzfal szabályokhoz \item Legacy alkalmazásokhoz \item Speciális hálózati konfigurációkhoz \end{itemize} \end{block} \begin{alertblock}{Ajánlás} Lehetőleg DNS neveket használj fix IP-k helyett! \end{alertblock} \end{frame} \begin{frame}[fragile]{Docker Compose hálózatok -- Automatikus} \begin{block}{Compose automatikus hálózat} \begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily] services: backend: image: my-app database: image: postgres \end{lstlisting} Compose automatikusan létrehozza: \texttt{\_default}\\ Mindkét szolgáltatás rajta van, név alapján érik el egymást. \end{block} \end{frame} \begin{frame}[fragile]{Docker Compose hálózatok -- Egyedi} \begin{exampleblock}{Egyedi hálózatok definiálása} \begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily] services: frontend: networks: - frontend-net backend: networks: - frontend-net - backend-net database: networks: - backend-net networks: frontend-net: backend-net: \end{lstlisting} \end{exampleblock} \end{frame} \begin{frame}{Compose hálózatok -- Magyarázat} \begin{block}{Izoláció} \begin{itemize} \item \texttt{frontend} $\leftrightarrow$ \texttt{backend}: OK (frontend-net) \item \texttt{backend} $\leftrightarrow$ \texttt{database}: OK (backend-net) \item \texttt{frontend} $\leftrightarrow$ \texttt{database}: \textbf{NEM} megy! \end{itemize} \end{block} \begin{exampleblock}{Biztonsági előny} Az adatbázis nem érhető el közvetlenül a frontendből. \end{exampleblock} \end{frame} \begin{frame}{Links -- Régi módszer} \begin{alertblock}{Legacy: links} A \texttt{links} kulcsszó elavult! \begin{itemize} \item Régi Docker verziókban használták \item Helyette: user-defined networks \item Automatikus DNS feloldás jobb megoldás \end{itemize} \end{alertblock} \end{frame} \begin{frame}[fragile]{Network alias} \begin{block}{Alternatív nevek a hálózaton} \begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily] docker run -d --name postgres \ --network app-net \ --network-alias db \ --network-alias database \ postgres:15 \end{lstlisting} A konténer 3 néven érhető el: \texttt{postgres}, \texttt{db}, \texttt{database} \end{block} \end{frame} \begin{frame}[fragile]{Network alias -- Compose-ban} \begin{block}{Compose alias} \begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily] services: postgres: image: postgres:15 networks: backend: aliases: - db - database networks: backend: \end{lstlisting} \end{block} \end{frame} \begin{frame}{Overlay hálózat} \begin{block}{Overlay driver} \begin{itemize} \item Több Docker host közötti hálózat \item Docker Swarm és Kubernetes használja \item Konténerek különböző gépeken kommunikálnak \end{itemize} \end{block} \begin{alertblock}{Egyetemi keretek} Fejlesztéshez bridge hálózat elég, overlay csak produkciós klaszterben szükséges. \end{alertblock} \end{frame} \begin{frame}[fragile]{Troubleshooting -- Alapparancsok} \begin{block}{Hálózati hibakeresés} \begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily] # Konténer hálózati beállításai docker inspect --format \ '{{json .NetworkSettings.Networks}}' backend # Ping teszt konténerből docker exec backend ping database # DNS feloldás konténerből docker exec backend nslookup database \end{lstlisting} \end{block} \end{frame} \begin{frame}[fragile]{Troubleshooting -- Haladó} \begin{block}{Haladó hibakeresés} \begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily] # Hálózati konténer csatlakoztatás docker run --rm -it --network mynetwork \ nicolaka/netshoot # Hálózati port ellenőrzés docker exec backend curl -v database:5432 \end{lstlisting} \end{block} \end{frame} \begin{frame}{Gyakori problémák 1 -- Nem éri el} \begin{alertblock}{Probléma: Konténer nem éri el a másikat} \begin{itemize} \item \textbf{Ok:} Nem ugyanazon a hálózaton vannak \item \textbf{Megoldás:} \texttt{docker network connect} vagy közös hálózat \end{itemize} \end{alertblock} \end{frame} \begin{frame}{Gyakori problémák 2 -- DNS nem működik} \begin{alertblock}{Probléma: DNS névfeloldás nem működik} \begin{itemize} \item \textbf{Ok:} Default bridge-en nincs DNS \item \textbf{Megoldás:} User-defined bridge hálózat használata \end{itemize} \end{alertblock} \end{frame} \begin{frame}{Gyakori problémák 3 -- Port ütközés} \begin{alertblock}{Probléma: Port already in use} \begin{itemize} \item \textbf{Ok:} Host-on már foglalt a port \item \textbf{Megoldás:} Másik host port (\texttt{-p 3001:3000}) \end{itemize} \end{alertblock} \end{frame} \begin{frame}{Gyakori problémák 4 -- Connection refused} \begin{alertblock}{Probléma: Connection refused} \begin{itemize} \item \textbf{Ok:} Alkalmazás csak localhost-on figyel \item \textbf{Megoldás:} \texttt{0.0.0.0}-ra bind-olás \end{itemize} \end{alertblock} \end{frame} \begin{frame}{Biztonsági best practices 1} \begin{exampleblock}{Hálózati biztonság} \begin{itemize} \item Külön hálózat minden szolgáltatás-rétegnek \item Ne publikálj felesleges portokat \item Adatbázis soha nem érhető el kívülről \end{itemize} \end{exampleblock} \end{frame} \begin{frame}{Biztonsági best practices 2} \begin{exampleblock}{Hálózati biztonság -- Fejlesztés} \begin{itemize} \item Használj user-defined bridge-et \item Network alias a rugalmasságért \item Prod-ban minimális port exposure \end{itemize} \end{exampleblock} \end{frame} \begin{frame}[fragile]{Komplex hálózat -- 3-rétegű alkalmazás} \begin{exampleblock}{Frontend réteg} \begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily] version: '3.8' services: nginx: image: nginx:alpine ports: - "80:80" networks: - frontend depends_on: - api \end{lstlisting} \end{exampleblock} \end{frame} \begin{frame}[fragile]{Komplex hálózat -- API réteg} \begin{exampleblock}{API réteg} \begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily] services: api: build: ./api networks: - frontend - backend depends_on: - postgres - redis environment: DB_HOST: postgres REDIS_HOST: redis \end{lstlisting} \end{exampleblock} \end{frame} \begin{frame}[fragile]{Komplex hálózat -- Adatbázis réteg} \begin{exampleblock}{Adatbázis réteg} \begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily] services: postgres: image: postgres:15 networks: - backend volumes: - pgdata:/var/lib/postgresql/data redis: image: redis:7-alpine networks: - backend \end{lstlisting} \end{exampleblock} \end{frame} \begin{frame}[fragile]{Komplex hálózat -- Hálózat és volume definíciók} \begin{exampleblock}{Hálózatok és volume-ok} \begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily] networks: frontend: driver: bridge backend: driver: bridge volumes: pgdata: \end{lstlisting} \end{exampleblock} \end{frame} \begin{frame}{Komplex hálózat -- Magyarázat} \begin{block}{Biztonsági izoláció} \begin{itemize} \item nginx $\leftrightarrow$ api: frontend hálózat \item api $\leftrightarrow$ postgres/redis: backend hálózat \item nginx $\leftrightarrow$ postgres: \textbf{NINCS} közvetlen út \end{itemize} \end{block} \end{frame} \begin{frame}{Összefoglalás -- Lényeg} \begin{block}{Docker hálózatok} \begin{itemize} \item Konténerek közötti kommunikáció alapja \item Szolgáltatás-felderítés DNS-sel \item Biztonsági izoláció rétegekkel \end{itemize} \end{block} \end{frame} \begin{frame}{Összefoglalás -- Kulcs koncepciók} \begin{block}{Fő elemek} \begin{itemize} \item \textbf{Bridge}: alapértelmezett, legtöbb esetben elég \item \textbf{User-defined}: mindig ezt használd (DNS!) \item \textbf{Compose}: automatikus hálózat létrehozás \end{itemize} \end{block} \end{frame} \begin{frame}{Összefoglalás -- Aranyszabályok} \begin{exampleblock}{Aranyszabályok} \begin{itemize} \item Konténer név = hostname a hálózaton \item Csak szükséges portokat publikáld \item Külön hálózat = jobb biztonság \end{itemize} \end{exampleblock} \end{frame}