Files
GKNB_MSTM071/Backend_ppt/docker/docker_network.tex
T
2026-02-17 21:17:42 +01:00

722 lines
20 KiB
TeX

\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}