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

904 lines
24 KiB
TeX

\section{Docker Compose}
\begin{frame}{Mi a Docker Compose?}
\begin{block}{Docker Compose -- Több konténer kezelése}
\begin{itemize}
\item Eszköz \textbf{több konténerből álló} alkalmazások definiálására
\item YAML formátumú konfigurációs fájl (\texttt{docker-compose.yml})
\item Egyetlen parancs: teljes alkalmazás indítása/leállítása
\end{itemize}
\end{block}
\end{frame}
\begin{frame}{Docker Compose -- Használati eset}
\begin{exampleblock}{Példa használati eset}
Node.js backend + PostgreSQL adatbázis + Redis cache\\
$\Rightarrow$ 3 konténer, 1 docker-compose.yml, 1 parancs: \texttt{docker compose up}
\end{exampleblock}
\end{frame}
\begin{frame}[fragile]{Miért? -- Docker Compose nélkül}
\begin{alertblock}{Docker Compose nélkül}
\begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily]
docker network create myapp
docker run -d --name postgres \
--network myapp \
-e POSTGRES_PASSWORD=secret \
postgres:15
docker run -d --name redis \
--network myapp redis:7
docker run -d --name backend \
--network myapp \
-p 3000:3000 my-backend
\end{lstlisting}
\end{alertblock}
\end{frame}
\begin{frame}{Miért? -- A probléma}
\begin{alertblock}{Probléma}
Bonyolult, sok parancs, nehezen karbantartható
\end{alertblock}
\end{frame}
\begin{frame}[fragile]{Miért? -- Docker Compose-zal}
\begin{exampleblock}{Docker Compose-zal}
\begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily]
docker compose up
\end{lstlisting}
\end{exampleblock}
\begin{block}{Előnyök}
\begin{itemize}
\item Egyetlen parancs!
\item Minden konfiguráció a \texttt{docker-compose.yml}-ben
\item Reprodukálható és verziókezelhető
\end{itemize}
\end{block}
\end{frame}
\begin{frame}{Miért? -- Csapatmunka}
\begin{block}{Csapatmunka előnyök}
\begin{itemize}
\item Verziókezelhető (Git)
\item Csapatmunkában könnyen megosztható
\item Konzisztens környezet minden fejlesztőnél
\end{itemize}
\end{block}
\end{frame}
\begin{frame}[fragile]{Docker Compose telepítés}
\begin{block}{Modern Docker verzió}
Docker Desktop és újabb Docker Engine verziók tartalmazzák:
\begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily]
# Ellenőrzés
docker compose version
# Docker Compose version v2.24.0
\end{lstlisting}
\end{block}
\end{frame}
\begin{frame}{Docker Compose -- Régi vs új szintaxis}
\begin{alertblock}{Régi vs új szintaxis}
\begin{itemize}
\item Régi (v1): \texttt{docker-compose up} (kötőjellel, külön telepítés)
\item Új (v2): \texttt{docker compose up} (szóköz, built-in)
\end{itemize}
Ajánlott: v2 (docker compose)
\end{alertblock}
\end{frame}
\begin{frame}[fragile]{Első docker-compose.yml -- Kód}
\begin{exampleblock}{Egyszerű webszerver példa}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "8080:80"
\end{lstlisting}
\end{exampleblock}
\end{frame}
\begin{frame}[fragile]{Első docker-compose.yml -- Parancsok}
\begin{block}{Indítás és leállítás}
\begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily]
# Indítás (háttérben)
docker compose up -d
# Leállítás és törlés
docker compose down
\end{lstlisting}
\end{block}
\end{frame}
\begin{frame}[fragile]{docker-compose.yml struktúra -- Kód}
\begin{block}{Fő elemek}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
version: '3.8' # Compose fájl verzió
services: # Konténerek definíciója
service1:
# konfiguráció
service2:
# konfiguráció
volumes: # Named volume-ok (opcionális)
data:
networks: # Egyedi hálózatok (opcionális)
backend:
\end{lstlisting}
\end{block}
\end{frame}
\begin{frame}{docker-compose.yml struktúra -- Magyarázat}
\begin{block}{Elemek}
\begin{itemize}
\item \texttt{version}: Compose fájl formátum verzió
\item \texttt{services}: Konténerek (ezeket indítja)
\item \texttt{volumes}: Megosztott perzisztens tárolók
\end{itemize}
\end{block}
\end{frame}
\begin{frame}{docker-compose.yml struktúra -- Networks}
\begin{block}{Hálózatok}
\begin{itemize}
\item \texttt{networks}: Hálózati konfiguráció
\item Compose automatikusan létrehoz egy default hálózatot
\end{itemize}
\end{block}
\end{frame}
\begin{frame}[fragile]{Service definíció -- image alapú}
\begin{exampleblock}{Existing image használata}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
services:
database:
image: postgres:15-alpine
environment:
POSTGRES_DB: myapp
POSTGRES_USER: admin
POSTGRES_PASSWORD: secret123
ports:
- "5432:5432"
volumes:
- postgres-data:/var/lib/postgresql/data
restart: unless-stopped
volumes:
postgres-data:
\end{lstlisting}
\end{exampleblock}
\end{frame}
\begin{frame}[fragile]{Service definíció -- build alapú}
\begin{exampleblock}{Saját Dockerfile build-elése}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
services:
backend:
build:
context: ./backend
dockerfile: Dockerfile
ports:
- "3000:3000"
environment:
NODE_ENV: production
DB_HOST: database
depends_on:
- database
restart: unless-stopped
\end{lstlisting}
\end{exampleblock}
\end{frame}
\begin{frame}{Service definíció -- build magyarázat}
\begin{block}{Build elemek}
\begin{itemize}
\item \texttt{build}: Dockerfile-ból épít
\item \texttt{context}: Build context útvonal
\item \texttt{depends\_on}: Függőségek (ez után indul)
\end{itemize}
\end{block}
\end{frame}
\begin{frame}[fragile]{Environment variables -- Inline}
\begin{block}{Inline környezeti változók}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
services:
app:
environment:
NODE_ENV: production
PORT: 3000
\end{lstlisting}
\end{block}
\end{frame}
\begin{frame}[fragile]{Environment variables -- Fájlból}
\begin{block}{.env fájlból}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
services:
app:
env_file:
- .env
- .env.local
\end{lstlisting}
\end{block}
\end{frame}
\begin{frame}[fragile]{Environment variables -- Host változók}
\begin{block}{Host environment változók}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
services:
app:
environment:
# .env fájlból vagy host-ról
DB_PASSWORD: ${DB_PASSWORD}
\end{lstlisting}
\end{block}
\end{frame}
\begin{frame}[fragile]{Volumes -- Named volumes}
\begin{block}{Named volumes (ajánlott)}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
services:
db:
image: postgres:15
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
\end{lstlisting}
\end{block}
\end{frame}
\begin{frame}[fragile]{Volumes -- Bind mounts}
\begin{block}{Bind mounts (fejlesztéshez)}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
services:
app:
volumes:
# Relatív útvonal
- ./src:/app/src
# Abszolút útvonal
- /host/path:/container/path
\end{lstlisting}
\end{block}
\end{frame}
\begin{frame}[fragile]{Networks -- Automatikus}
\begin{block}{Automatikus hálózat}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
services:
backend:
image: my-app
database:
image: postgres
\end{lstlisting}
Compose automatikusan létrehoz egy hálózatot!\\
\texttt{backend} eléri \texttt{database}-t a név alapján.
\end{block}
\end{frame}
\begin{frame}[fragile]{Networks -- Egyedi hálózatok}
\begin{block}{Egyedi hálózatok}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
services:
backend:
networks:
- frontend
- backend
database:
networks:
- backend
networks:
frontend:
backend:
\end{lstlisting}
\end{block}
\end{frame}
\begin{frame}[fragile]{MERN stack -- Adatbázisok}
\begin{exampleblock}{MongoDB és Redis}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
version: '3.8'
services:
mongodb:
image: mongo:7
volumes:
- mongo-data:/data/db
environment:
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: secret
restart: unless-stopped
\end{lstlisting}
\end{exampleblock}
\end{frame}
\begin{frame}[fragile]{MERN stack -- Redis és volumes}
\begin{exampleblock}{Redis és adattárolás}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
services:
redis:
image: redis:7-alpine
restart: unless-stopped
volumes:
mongo-data:
\end{lstlisting}
\end{exampleblock}
\end{frame}
\begin{frame}{MERN stack -- Adatbázis magyarázat}
\begin{block}{Adattárolás}
\begin{itemize}
\item \textbf{MongoDB:} perzisztens volume (mongo-data)
\item \textbf{Redis:} cache, nincs szükség volume-ra
\item \textbf{Restart policy:} biztosítja a rendelkezésre állást
\end{itemize}
\end{block}
\end{frame}
\begin{frame}[fragile]{MERN stack -- Backend}
\begin{exampleblock}{Backend szolgáltatás}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
services:
backend:
build: ./backend
ports:
- "3001:3001"
environment:
MONGO_URL: mongodb://admin:secret@mongodb:27017
REDIS_URL: redis://redis:6379
depends_on:
- mongodb
- redis
restart: unless-stopped
\end{lstlisting}
\end{exampleblock}
\end{frame}
\begin{frame}[fragile]{MERN stack -- Frontend}
\begin{exampleblock}{Frontend szolgáltatás}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
environment:
REACT_APP_API_URL: http://localhost:3001
depends_on:
- backend
restart: unless-stopped
\end{lstlisting}
\end{exampleblock}
\end{frame}
\begin{frame}[fragile]{depends\_on -- Alap használat}
\begin{block}{Alapvető függőség}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
services:
backend:
depends_on:
- database
database:
image: postgres
\end{lstlisting}
\texttt{database} indul először, \textbf{de nem vár} amíg kész!
\end{block}
\end{frame}
\begin{frame}{depends\_on -- Figyelmeztetés}
\begin{alertblock}{Fontos}
\texttt{depends\_on} csak az indítási sorrendet szabályozza,\\
\textbf{NEM várja meg} amíg a szolgáltatás tényleg készen áll!
\end{alertblock}
\begin{exampleblock}{Megoldás}
\begin{itemize}
\item Alkalmazásban: retry logika
\item Healthcheck használata
\item wait-for-it.sh script
\end{itemize}
\end{exampleblock}
\end{frame}
\begin{frame}[fragile]{Healthcheck a Compose-ban}
\begin{exampleblock}{Szolgáltatás készenlét ellenőrzés}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
services:
database:
image: postgres:15
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
backend:
depends_on:
database:
condition: service_healthy
\end{lstlisting}
\end{exampleblock}
\end{frame}
\begin{frame}{Healthcheck -- Magyarázat}
\begin{block}{Healthcheck elemek}
\begin{itemize}
\item \texttt{condition: service\_healthy}: Vár amíg healthcheck OK
\item \texttt{test}: Ellenőrző parancs
\item \texttt{interval}: Ellenőrzések gyakorisága
\end{itemize}
\end{block}
\end{frame}
\begin{frame}[fragile]{Compose parancsok -- Indítás}
\begin{block}{Indítás}
\begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily]
# Indítás (előtérben, logokkal)
docker compose up
# Indítás háttérben
docker compose up -d
# Rebuild és indítás
docker compose up --build
\end{lstlisting}
\end{block}
\end{frame}
\begin{frame}[fragile]{Compose parancsok -- Leállítás}
\begin{block}{Leállítás}
\begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily]
# Leállítás (konténerek megmaradnak)
docker compose stop
# Leállítás és törlés
docker compose down
# Törlés volume-okkal együtt
docker compose down -v
\end{lstlisting}
\end{block}
\end{frame}
\begin{frame}[fragile]{Compose parancsok -- Státusz}
\begin{block}{Státusz és logok}
\begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily]
# Futó szolgáltatások listája
docker compose ps
# Összes szolgáltatás (leállítottak is)
docker compose ps -a
# Logok megjelenítése
docker compose logs
\end{lstlisting}
\end{block}
\end{frame}
\begin{frame}[fragile]{Compose parancsok -- Log szűrés}
\begin{block}{Log szűrés}
\begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily]
# Követés (egyik szolgáltatás)
docker compose logs -f backend
# Utolsó 100 sor
docker compose logs --tail=100
\end{lstlisting}
\end{block}
\end{frame}
\begin{frame}[fragile]{Exec és run -- Futó konténerben}
\begin{block}{Parancs futtatása futó szolgáltatásban}
\begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily]
# Shell futó konténerben
docker compose exec backend sh
# PostgreSQL konzol
docker compose exec database psql -U admin -d myapp
\end{lstlisting}
\end{block}
\end{frame}
\begin{frame}[fragile]{Exec és run -- Egyszeri parancs}
\begin{block}{Egyszeri parancs (új konténer)}
\begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily]
# Database migráció
docker compose run backend npm run migrate
# Teszt futtatás
docker compose run --rm backend npm test
\end{lstlisting}
\texttt{--rm}: Konténer törlése futás után
\end{block}
\end{frame}
\begin{frame}[fragile]{Scale -- Több példány}
\begin{block}{Szolgáltatás skálázása}
\begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily]
# 3 backend példány indítása
docker compose up -d --scale backend=3
\end{lstlisting}
\end{block}
\end{frame}
\begin{frame}[fragile]{Scale -- Port konfliktus}
\begin{alertblock}{Port konfliktus}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
services:
backend:
ports:
- "3000:3000" # Nem skálázható!
\end{lstlisting}
\end{alertblock}
\begin{exampleblock}{Megoldás: dinamikus port}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
ports:
- "3000-3002:3000" # 3 példány
\end{lstlisting}
\end{exampleblock}
\end{frame}
\begin{frame}[fragile]{Override fájlok -- Dev config}
\begin{block}{docker-compose.override.yml}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
# docker-compose.yml (base)
services:
app:
image: my-app
# docker-compose.override.yml (dev)
services:
app:
volumes:
- ./src:/app/src # live reload
environment:
DEBUG: "true"
\end{lstlisting}
Automatikusan egyesül a base-zel fejlesztéskor!
\end{block}
\end{frame}
\begin{frame}[fragile]{Override fájlok -- Production}
\begin{block}{docker-compose.prod.yml}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
services:
app:
image: my-app:1.0.0
restart: always
deploy:
replicas: 3
resources:
limits:
cpus: '0.5'
memory: 512M
\end{lstlisting}
\end{block}
\end{frame}
\begin{frame}[fragile]{Override fájlok -- Használat}
\begin{block}{Használat}
\begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily]
# Specifikus fájl megadása
docker compose -f docker-compose.yml \
-f docker-compose.prod.yml up -d
\end{lstlisting}
\end{block}
\end{frame}
\begin{frame}[fragile]{Secrets kezelés -- .env fájl}
\begin{block}{Érzékeny adatok .env fájlban}
\begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily]
# .env fájl (ne commitold!)
POSTGRES_PASSWORD=supersecret123
API_KEY=abc123xyz
JWT_SECRET=random_secret_key
\end{lstlisting}
\end{block}
\end{frame}
\begin{frame}[fragile]{Secrets kezelés -- Compose-ban}
\begin{block}{Használat docker-compose.yml-ben}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
services:
database:
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
backend:
env_file:
- .env
\end{lstlisting}
\end{block}
\begin{alertblock}{Biztonság}
\texttt{.env} legyen a \texttt{.gitignore}-ban!\\
Használj \texttt{.env.example} sablont repository-ban!
\end{alertblock}
\end{frame}
\begin{frame}[fragile]{Profiles -- Opcionális szolgáltatások}
\begin{block}{Fejlesztői eszközök csak manuális indításkor}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
services:
app:
image: my-app
database:
image: postgres
adminer:
image: adminer
profiles:
- debug
ports:
- "8080:8080"
\end{lstlisting}
\end{block}
\end{frame}
\begin{frame}[fragile]{Profiles -- Használat}
\begin{block}{Használat}
\begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily]
# Normál indítás: app + database
docker compose up
# Debug profillal: app + database + adminer
docker compose --profile debug up
\end{lstlisting}
\end{block}
\end{frame}
\begin{frame}[fragile]{Resource limits}
\begin{exampleblock}{CPU és memória korlátok}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
services:
backend:
image: my-app
deploy:
resources:
limits:
cpus: '1.0'
memory: 1G
reservations:
cpus: '0.5'
memory: 512M
\end{lstlisting}
\end{exampleblock}
\end{frame}
\begin{frame}[fragile]{Logging konfiguráció}
\begin{exampleblock}{Log beállítások}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
services:
backend:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
\end{lstlisting}
\end{exampleblock}
\begin{block}{Driverek}
\texttt{json-file}, \texttt{syslog}, \texttt{journald}, \texttt{awslogs}
\end{block}
\end{frame}
\begin{frame}[fragile]{Teljes projekt -- PostgreSQL}
\begin{exampleblock}{PostgreSQL szolgáltatás}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
version: '3.8'
services:
postgres:
image: postgres:15-alpine
environment:
POSTGRES_DB: ${DB_NAME}
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- postgres-data:/var/lib/postgresql/data
restart: unless-stopped
\end{lstlisting}
\end{exampleblock}
\end{frame}
\begin{frame}[fragile]{Teljes projekt -- PostgreSQL healthcheck}
\begin{exampleblock}{Healthcheck hozzáadása}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
services:
postgres:
healthcheck:
test: ["CMD-SHELL",
"pg_isready -U ${DB_USER}"]
interval: 5s
timeout: 5s
retries: 5
\end{lstlisting}
\end{exampleblock}
\end{frame}
\begin{frame}[fragile]{Teljes projekt -- Redis és volumes}
\begin{exampleblock}{Redis és adattárolás}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
services:
redis:
image: redis:7-alpine
restart: unless-stopped
volumes:
postgres-data:
\end{lstlisting}
\end{exampleblock}
\end{frame}
\begin{frame}[fragile]{Teljes projekt -- Backend}
\begin{exampleblock}{Backend hotreload-dal}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
services:
backend:
build: ./backend
ports:
- "3001:3001"
environment:
DATABASE_URL: postgresql://${DB_USER}:
${DB_PASSWORD}@postgres:5432/${DB_NAME}
REDIS_URL: redis://redis:6379
volumes:
- ./backend/src:/app/src
depends_on:
postgres:
condition: service_healthy
restart: unless-stopped
\end{lstlisting}
\end{exampleblock}
\end{frame}
\begin{frame}[fragile]{Teljes projekt -- Frontend}
\begin{exampleblock}{React frontend hotreload-dal}
\begin{lstlisting}[language=yaml,basicstyle=\scriptsize\ttfamily]
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
environment:
REACT_APP_API_URL: http://localhost:3001
volumes:
- ./frontend/src:/app/src
- /app/node_modules
depends_on:
- backend
restart: unless-stopped
\end{lstlisting}
\end{exampleblock}
\end{frame}
\begin{frame}{Teljes projekt -- Frontend magyarázat}
\begin{block}{Fejlesztői környezet}
\begin{itemize}
\item Volume mount: kód változások azonnal láthatóak
\item node\_modules izolált a konténerben
\item Restart policy védelem összeomlás ellen
\end{itemize}
\end{block}
\end{frame}
\begin{frame}{Compose vs Orchestration -- Compose}
\begin{block}{Mikor használj Docker Compose-t?}
\begin{itemize}
\item Fejlesztési környezet
\item Teszt környezet
\item Kisebb produkciós alkalmazások (1-2 szerver)
\end{itemize}
\end{block}
\end{frame}
\begin{frame}{Compose vs Orchestration -- Kubernetes}
\begin{block}{Mikor kell Kubernetes vagy Docker Swarm?}
\begin{itemize}
\item Nagy léptékű production (több szerver)
\item Magas rendelkezésre állás (HA)
\item Automatikus failover és auto-scaling
\end{itemize}
\end{block}
\begin{alertblock}{Fontos}
Kezdd Compose-zal, csak akkor válts orchestration-re, ha tényleg szükséges!
\end{alertblock}
\end{frame}
\begin{frame}{Best Practices -- Konfiguráció}
\begin{exampleblock}{Ajánlott gyakorlatok}
\begin{itemize}
\item \textbf{Verziókezeld} a \texttt{docker-compose.yml}-t
\item \textbf{.env fájl} érzékeny adatokhoz (.gitignore!)
\item \textbf{Named volumes} adatok perzisztálásához
\end{itemize}
\end{exampleblock}
\end{frame}
\begin{frame}{Best Practices -- Megbízhatóság}
\begin{exampleblock}{Ajánlott gyakorlatok}
\begin{itemize}
\item \textbf{Healthcheck} használata depends\_on-nál
\item \textbf{Restart policy}: unless-stopped production-ben
\item \textbf{Resource limits} beállítása
\end{itemize}
\end{exampleblock}
\end{frame}
\begin{frame}{Best Practices -- Build}
\begin{exampleblock}{Ajánlott gyakorlatok}
\begin{itemize}
\item \textbf{Specifikus image verziók} (ne latest)
\item \textbf{Multi-stage Dockerfile} kisebb image-ekhez
\item \textbf{Service nevek} beszédesek legyenek
\end{itemize}
\end{exampleblock}
\end{frame}
\begin{frame}{Anti-patterns -- Kerülendő}
\begin{alertblock}{Ne csináld}
\begin{itemize}
\item Érzékeny adatok közvetlenül a YAML-ban
\item \texttt{latest} tag production-ben
\item Adatok a konténerben (volume nélkül)
\end{itemize}
\end{alertblock}
\end{frame}
\begin{frame}{Anti-patterns -- Kerülendő folyt.}
\begin{alertblock}{Ne csináld}
\begin{itemize}
\item Egy konténerben több alkalmazás
\item Hardcoded portok ha skálázni akarsz
\item Depends\_on healthcheck nélkül
\end{itemize}
\end{alertblock}
\end{frame}
\begin{frame}{Összefoglalás -- Lényeg}
\begin{block}{Docker Compose = Egyszerű multi-container kezelés}
\begin{itemize}
\item YAML fájl: teljes alkalmazás stack leírása
\item Egy parancs: \texttt{docker compose up}
\item Automatikus hálózat, volume, service discovery
\end{itemize}
\end{block}
\end{frame}
\begin{frame}{Összefoglalás -- Előnyök}
\begin{exampleblock}{Előnyök}
\begin{itemize}
\item Gyors setup -- másodpercek alatt
\item Konzisztens környezet minden fejlesztőnél
\item Reprodukálható, verziókezelhető
\end{itemize}
\end{exampleblock}
\end{frame}
\begin{frame}{Összefoglalás -- Kulcs koncepciók}
\begin{block}{Fő elemek}
\begin{itemize}
\item \texttt{services}: Mi fusson (konténerek definíciója)
\item \texttt{volumes}: Adatok perzisztálása
\item \texttt{networks}: Szolgáltatások összekapcsolása
\end{itemize}
\end{block}
\begin{alertblock}{Következő lépés}
Docker hálózatok részletesen
\end{alertblock}
\end{frame}