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



