\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{<projektnév>\_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}




