904 lines
24 KiB
TeX
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}
|
|
|
|
|
|
|