docker
This commit is contained in:
@@ -0,0 +1,903 @@
|
||||
\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}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user