\section{Docker Image-ek} \begin{frame}{Mi a Docker image?} \begin{block}{Image = futtatási sablon} \begin{itemize} \item Csak olvasható sablon egy konténer létrehozásához \item Tartalmazza az alkalmazás kódját és a függőségeket \item Rétegekből (layers) épül fel \end{itemize} \end{block} \end{frame} \begin{frame}{Image -- Jellemzők} \begin{block}{Tulajdonságok} \begin{itemize} \item Egy image-ből több konténer is indulhat \item Immutable -- nem módosítható közvetlenül \end{itemize} \end{block} \begin{exampleblock}{Analógia} Az image olyan, mint egy telepítő ISO, a konténer pedig a futó rendszer. \end{exampleblock} \end{frame} \begin{frame}{Image felépítése -- rétegek} \begin{block}{Layer alapú működés} \begin{itemize} \item Minden Dockerfile utasítás új réteget hozhat létre \item A rétegek újrahasznosíthatók több image között \item Kisebb tárhelyigény és gyorsabb build a cache miatt \end{itemize} \end{block} \end{frame} \begin{frame}{Image rétegek -- Konténer indítás} \begin{block}{Konténer indulásakor} \begin{itemize} \item Egy írható réteg kerül az image fölé \item Az image rétegek változatlanok maradnak \end{itemize} \end{block} \begin{alertblock}{Miért fontos?} A jó Dockerfile-sorrend jelentősen csökkenti a build időt. \end{alertblock} \end{frame} \begin{frame}[fragile]{Image azonosítás: név és tag} \begin{block}{Formátum} \texttt{[registry/]repository:tag} \end{block} \begin{exampleblock}{Példák} \begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily] nginx:1.27 node:20-alpine postgres:16 myrepo/my-api:1.0.0 ghcr.io/acme/payment-service:2026-02-15 \end{lstlisting} \end{exampleblock} \begin{alertblock}{Best practice} Production környezetben ne használd a \texttt{latest} taget. \end{alertblock} \end{frame} \begin{frame}[fragile]{Image letöltése -- docker pull} \begin{block}{Pull parancs} \begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily] # Legfrissebb tag letöltése docker pull nginx # Konkrét verzió docker pull nginx:1.27 # Privát registry docker pull ghcr.io/acme/my-api:1.0.0 \end{lstlisting} \end{block} \end{frame} \begin{frame}{Image letöltése -- Tudnivalók} \begin{block}{Automatikus letöltés} \begin{itemize} \item Ha a \texttt{docker run} során nincs helyben az image, automatikusan pull történik \item Több réteg párhuzamosan töltődik le \end{itemize} \end{block} \end{frame} \begin{frame}[fragile]{Saját image építése -- docker build} \begin{block}{Alap build} \begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily] # Aktuális mappából build docker build -t my-api:1.0.0 . # Több tag egyszerre docker build -t my-api:1.0.0 -t my-api:latest . \end{lstlisting} \end{block} \end{frame} \begin{frame}[fragile]{Saját image építése -- Haladó} \begin{block}{Haladó opciók} \begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily] # Másik Dockerfile használata docker build -f Dockerfile.prod -t my-api:prod . \end{lstlisting} \end{block} \begin{alertblock}{Tipp} A build context legyen kicsi (\texttt{.dockerignore} használata kötelezően ajánlott). \end{alertblock} \end{frame} \begin{frame}[fragile]{Image lista és információk} \begin{block}{Gyakori parancsok} \begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily] # Lokális image-ek listája docker images # Csak azonosítók docker images -q # Részletes adatok JSON-ben docker image inspect my-api:1.0.0 \end{lstlisting} \end{block} \end{frame} \begin{frame}[fragile]{Image történet} \begin{block}{Réteg történet} \begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily] # Réteg történet docker history my-api:1.0.0 \end{lstlisting} \end{block} \end{frame} \begin{frame}[fragile]{Image publikálása -- docker push} \begin{block}{Folyamat} \begin{enumerate} \item Registry-be bejelentkezés: \texttt{docker login} \item Image tag-elése cél repository-ra \item Feltöltés \texttt{docker push}-sal \end{enumerate} \end{block} \end{frame} \begin{frame}[fragile]{Image publikálása -- Példa} \begin{exampleblock}{Példa Docker Hub-ra} \begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily] docker login docker tag my-api:1.0.0 myuser/my-api:1.0.0 docker push myuser/my-api:1.0.0 \end{lstlisting} \end{exampleblock} \end{frame} \begin{frame}[fragile]{Image mentés és visszatöltés} \begin{block}{Offline terjesztés} \begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily] # Image mentése tar fájlba docker save -o my-api-1.0.0.tar my-api:1.0.0 # Visszatöltés docker load -i my-api-1.0.0.tar \end{lstlisting} \end{block} \begin{exampleblock}{Mikor hasznos?} Zárt hálózati környezetben, ahol nincs közvetlen registry elérés. \end{exampleblock} \end{frame} \begin{frame}[fragile]{Image takarítás} \begin{block}{Felesleges image-ek eltávolítása} \begin{lstlisting}[language=bash,basicstyle=\scriptsize\ttfamily] # Egy image törlése docker rmi my-api:1.0.0 # Címke nélküli (dangling) image-ek törlése docker image prune # Minden nem használt image törlése docker image prune -a \end{lstlisting} \end{block} \begin{alertblock}{Figyelem} A \texttt{prune} műveletek törlése nem visszavonható. \end{alertblock} \end{frame} \begin{frame}{Best practices -- Verzió és méret} \begin{exampleblock}{Ajánlott gyakorlatok} \begin{itemize} \item Használj fix verzió tag-eket (\texttt{1.0.0}, \texttt{2026-02-15}) \item Tartsd kicsiben az image méretét (alpine, multi-stage build) \item Kerüld az érzékeny adatok beégetését image-be \end{itemize} \end{exampleblock} \end{frame} \begin{frame}{Best practices -- Build és deploy} \begin{exampleblock}{Ajánlott gyakorlatok} \begin{itemize} \item Építs reprodukálható módon (determinista build) \item CI-ben automatikusan címkézz és push-olj \end{itemize} \end{exampleblock} \begin{alertblock}{Összefoglaló} Jó image stratégia = gyors build, gyors deploy, kevesebb hiba. \end{alertblock} \end{frame}