\section{Docker Alapok} \begin{frame}{Mi a Docker?} \begin{block}{Docker -- Konténerizációs platform} \begin{itemize} \item 2013-ban indult nyílt forráskódú projekt \item Alkalmazások csomagolása és futtatása izolált környezetben \item Könnyűsúlyú alternatíva a virtuális gépeknek \end{itemize} \end{block} \end{frame} \begin{frame}{Docker -- Definíció} \begin{exampleblock}{Definíció} A Docker egy platform, amely lehetővé teszi alkalmazások és függőségeik \textbf{konténerekbe} csomagolását, amelyek bárhol futtathatók. \end{exampleblock} \begin{block}{Filozófia} \textbf{``Build once, run anywhere''} -- egyszer csomagolva, bárhol fut. \end{block} \end{frame} \begin{frame}{A probléma, amit megold} \begin{alertblock}{``Works on my machine'' probléma} \begin{itemize} \item Fejlesztői gépen működik, production-ön nem \item Különböző operációs rendszerek \item Eltérő függőség verziók \end{itemize} \end{alertblock} \end{frame} \begin{frame}{A probléma -- Következmények} \begin{alertblock}{További problémák} \begin{itemize} \item Bonyolult telepítési folyamatok \item Nehezen reprodukálható hibák \item Inkonzisztens viselkedés környezetek között \end{itemize} \end{alertblock} \end{frame} \begin{frame}{Docker megoldás} \begin{exampleblock}{Hogyan oldja meg?} \begin{itemize} \item Azonos környezet mindenhol (dev, test, prod) \item Összes függőség a konténerben \item Gyors telepítés és indítás \end{itemize} \end{exampleblock} \begin{block}{Lényeg} Egyszer csomagolva, bárhol fut -- garantáltan! \end{block} \end{frame} \begin{frame}{Miért használjunk Dockert? -- Fejlesztőknek} \begin{block}{Fejlesztői előnyök} \begin{itemize} \item Gyors setup -- percek helyett másodpercek \item Konzisztens környezet minden fejlesztőnél \item Izoláció -- egymástól független projektek \end{itemize} \end{block} \end{frame} \begin{frame}{Miért használjunk Dockert? -- Gyakorlatban} \begin{exampleblock}{Gyakorlati előnyök} \begin{itemize} \item Új csapattag: \texttt{docker compose up} és kész \item Nincs ``nálam működik'' probléma \item Különböző Node.js verziók párhuzamosan \end{itemize} \end{exampleblock} \end{frame} \begin{frame}{Miért használjunk Dockert? -- DevOps} \begin{block}{DevOps előnyök} \begin{itemize} \item Automatizálás -- CI/CD pipeline egyszerűsítése \item Skálázhatóság -- könnyű horizontális skálázás \item Mikroszolgáltatások -- ideális architektúra \end{itemize} \end{block} \end{frame} \begin{frame}{Docker fő előnyök} \begin{block}{Összesítve} \begin{itemize} \item Hordozhatóság -- bárhol fut \item Könnyűsúlyú -- MB-ok VM GB-jai helyett \item Gyors indítás -- másodpercek \end{itemize} \end{block} \end{frame} \begin{frame}{Docker vs Virtuális gépek -- VM jellemzői} \begin{block}{Virtuális gép (VM)} \begin{itemize} \item Teljes operációs rendszer minden VM-nek \item Hypervisor szükséges (VMware, VirtualBox) \item Lassabb indítás -- perceket vehet igénybe \end{itemize} \end{block} \begin{exampleblock}{Szerkezet} Hardware $\rightarrow$ Host OS $\rightarrow$ Hypervisor $\rightarrow$ Guest OS $\rightarrow$ App \end{exampleblock} \end{frame} \begin{frame}{Docker vs Virtuális gépek -- VM hátrányok} \begin{alertblock}{VM hátrányok} \begin{itemize} \item Nagy méret -- több gigabájt \item Több erőforrás igény -- CPU, memória, tárhely \item Teljes OS virtualizálás -- minden VM-nek saját kernel \end{itemize} \end{alertblock} \end{frame} \begin{frame}{Docker vs Virtuális gépek -- Docker jellemzői} \begin{block}{Docker konténer} \begin{itemize} \item Osztott OS kernel a host-tal \item Docker Engine futtatja \item Gyors indítás -- másodpercek \end{itemize} \end{block} \begin{exampleblock}{Szerkezet} Hardware $\rightarrow$ Host OS $\rightarrow$ Docker Engine $\rightarrow$ App \end{exampleblock} \end{frame} \begin{frame}{Docker vs VM -- Kulcskülönbség} \begin{alertblock}{Kulcskülönbség} \begin{itemize} \item Alkalmazás szintű izoláció az OS kernelen \item Konténerek osztják a host kernel-t \item Kisebb méret -- megabájtok vs gigabájtok \end{itemize} \end{alertblock} \end{frame} \begin{frame}{Architektúra összehasonlítás} \begin{center} \begin{tikzpicture}[node distance=0.25cm, scale=0.85, every node/.style={scale=0.85}] \node[font=\bfseries\footnotesize] at (-3, 4.5) {Virtuális gép}; \node[draw, rectangle, fill=blue!20, minimum width=2.5cm, minimum height=0.5cm, align=center, font=\scriptsize] (app1) at (-3, 3.8) {App A}; \node[draw, rectangle, fill=blue!20, minimum width=2.5cm, minimum height=0.5cm, below=of app1, align=center, font=\scriptsize] (os1) {Guest OS}; \node[draw, rectangle, fill=blue!20, minimum width=2.5cm, minimum height=0.5cm, font=\scriptsize] (app2) at (-3, 2.2) {App B}; \node[draw, rectangle, fill=blue!20, minimum width=2.5cm, minimum height=0.5cm, below=of app2, align=center, font=\scriptsize] (os2) {Guest OS}; \node[draw, rectangle, fill=green!20, minimum width=5.5cm, minimum height=0.5cm, below=of os2, align=center, yshift=-0.2cm, font=\scriptsize] (hypervisor) {Hypervisor}; \node[draw, rectangle, fill=yellow!20, minimum width=5.5cm, minimum height=0.5cm, below=of hypervisor, align=center, font=\scriptsize] (hostos1) {Host OS}; \node[draw, rectangle, fill=red!20, minimum width=5.5cm, minimum height=0.5cm, below=of hostos1, align=center, font=\scriptsize] (hw1) {Hardware}; \node[font=\bfseries\footnotesize] at (3, 4.5) {Docker konténer}; \node[draw, rectangle, fill=blue!20, minimum width=1.2cm, minimum height=0.5cm, align=center, font=\scriptsize] (dapp1) at (2, 3.8) {App A}; \node[draw, rectangle, fill=blue!20, minimum width=1.2cm, minimum height=0.5cm, align=center, font=\scriptsize] (dapp2) at (3.3, 3.8) {App B}; \node[draw, rectangle, fill=blue!20, minimum width=1.2cm, minimum height=0.5cm, align=center, font=\scriptsize] (dapp3) at (4.6, 3.8) {App C}; \node[draw, rectangle, fill=green!20, minimum width=5.5cm, minimum height=0.5cm, align=center, font=\scriptsize] (docker) at (3, 3) {Docker Engine}; \node[draw, rectangle, fill=yellow!20, minimum width=5.5cm, minimum height=0.5cm, below=of docker, align=center, font=\scriptsize] (hostos2) {Host OS}; \node[draw, rectangle, fill=red!20, minimum width=5.5cm, minimum height=0.5cm, below=of hostos2, align=center, font=\scriptsize] (hw2) {Hardware}; \end{tikzpicture} \end{center} \end{frame} \begin{frame}{Docker életciklus} \begin{center} \begin{tikzpicture}[node distance=2cm] \node[draw, rectangle, fill=blue!20, minimum width=2.5cm, minimum height=1cm, align=center] (dockerfile) {Dockerfile\\(utasítások)}; \node[draw, rectangle, fill=green!20, minimum width=2.5cm, minimum height=1cm, right=of dockerfile, align=center] (image) {Image\\(sablon)}; \node[draw, rectangle, fill=orange!20, minimum width=2.5cm, minimum height=1cm, right=of image, align=center] (container) {Container\\(futó app)}; \draw[->, thick] (dockerfile) -- (image) node[midway, above, font=\small] {build}; \draw[->, thick] (image) -- (container) node[midway, above, font=\small] {run}; \node[draw, rectangle, fill=purple!20, minimum width=2.5cm, minimum height=1cm, below=of image, align=center] (registry) {Registry\\(Docker Hub)}; \draw[->, thick] (image) -- (registry) node[midway, right, font=\small] {push}; \draw[->, thick] (registry) -- (image) node[midway, left, font=\small] {pull}; \end{tikzpicture} \end{center} \end{frame} \begin{frame}{Docker Engine} \begin{block}{Docker Engine -- A fő komponens} \begin{itemize} \item A Docker fő komponense \item Kliens-szerver architektúra \item 3 fő rész: Daemon, REST API, CLI \end{itemize} \end{block} \end{frame} \begin{frame}{Docker Engine -- Részei} \begin{enumerate} \item \textbf{Docker Daemon (dockerd):} Háttérfolyamat, kezeli a konténereket \item \textbf{Docker CLI (docker):} Parancssor interfész \item \textbf{REST API:} Kommunikáció daemon és CLI között \end{enumerate} \begin{exampleblock}{Működés} Parancs: \texttt{docker run nginx} \\ CLI \textrightarrow{} REST API \textrightarrow{} Daemon \textrightarrow{} Image letöltés \& Konténer indítás \end{exampleblock} \end{frame} \begin{frame}{Használati esetek -- Fejlesztés} \begin{block}{Fejlesztési környezet} \begin{itemize} \item Gyors projekt setup másodpercek alatt \item Különböző verziók párhuzamosan (Node 16, 18, 20) \item Csapat tagjai azonos környezetben dolgoznak \end{itemize} \end{block} \begin{exampleblock}{Példa} Új fejlesztő csatlakozik: \texttt{git clone} + \texttt{docker compose up}\\ $\Rightarrow$ Azonnal dolgozhat, telepítés nélkül \end{exampleblock} \end{frame} \begin{frame}{Használati esetek -- Mikroszolgáltatások} \begin{block}{Mikroszolgáltatások} \begin{itemize} \item Minden szolgáltatás saját konténerben fut \item Független skálázás és deployment \item Könnyű verziókezelés \end{itemize} \end{block} \end{frame} \begin{frame}{Használati esetek -- CI/CD} \begin{block}{CI/CD pipeline} \begin{itemize} \item Automatizált build és tesztelés \item Konzisztens deployment minden környezetben \item Gyors rollback hibás verzióról \end{itemize} \end{block} \end{frame} \begin{frame}{Mi kerül konténerbe? -- Alapok} \begin{exampleblock}{Alapvető elemek} \begin{itemize} \item \textbf{Alap OS réteg:} Linux disztribúció (Alpine, Ubuntu) \item \textbf{Runtime:} Node.js futtatókörnyezet (pl. 18.x) \item \textbf{Függőségek:} npm csomagok (node\_modules mappa) \end{itemize} \end{exampleblock} \end{frame} \begin{frame}{Mi kerül konténerbe? -- Alkalmazás} \begin{exampleblock}{Alkalmazás specifikus elemek} \begin{itemize} \item \textbf{Alkalmazás kód:} forrásfájlok (src/, index.js) \item \textbf{Konfigurációk:} package.json, környezeti beállítások \item \textbf{Indítási parancs:} npm start vagy node index.js \end{itemize} \end{exampleblock} \begin{block}{Eredmény} Önálló, hordozható csomag, amely bárhol futtatható \end{block} \end{frame} \begin{frame}{Mi NEM kerül konténerbe? -- Adatok} \begin{alertblock}{Perzisztens adatok} \begin{itemize} \item \textbf{Adatbázis adatok} -- volume-ban kell tárolni \item \textbf{Nagy méretű log fájlok} -- host-ra vagy log service-re \item \textbf{Feltöltött fájlok} -- user uploads, media files \end{itemize} \end{alertblock} \begin{exampleblock}{Miért?} Konténer törléskor ezek az adatok elvesznének! \end{exampleblock} \end{frame} \begin{frame}{Mi NEM kerül konténerbe? -- Biztonság} \begin{alertblock}{Biztonsági és development elemek} \begin{itemize} \item \textbf{Érzékeny konfigurációk} -- titkos kulcsok, jelszavak \item \textbf{Fejlesztői eszközök} -- debugging, testing tools \item \textbf{Build artifacts} -- ideiglenesen használt fájlok \end{itemize} \end{alertblock} \begin{exampleblock}{Jó gyakorlat} Titkos kulcsok: Docker secrets vagy környezeti változók\\ Dev tools: csak development image-ben \end{exampleblock} \end{frame} \begin{frame}{Docker Desktop -- Mi az?} \begin{block}{Docker Desktop alkalmazás} \begin{itemize} \item Grafikus felületű alkalmazás Windows és macOS rendszerekhez \item Tartalmazza az összes szükséges Docker komponenst \item Beépített GUI konténerek és image-ek kezeléséhez \end{itemize} \end{block} \end{frame} \begin{frame}{Docker Desktop -- Technológia} \begin{exampleblock}{Technológiai előnyök} \begin{itemize} \item Integrált Kubernetes támogatás \item WSL 2 backend Windows-on (Linux kernel) \item Automatikus frissítések \end{itemize} \end{exampleblock} \end{frame} \begin{frame}{Docker Desktop -- Funkciók} \begin{block}{Fő funkciók} \begin{itemize} \item Konténerek vizuális monitorozása \item Resource használat követése (CPU, RAM) \item Volume és network kezelés GUI-n keresztül \end{itemize} \end{block} \end{frame} \begin{frame}{Docker Desktop -- Kiegészítők} \begin{exampleblock}{Kiegészítők} \begin{itemize} \item Extension marketplace -- további funkciók \item Dev Environments támogatás \item Docker Scout -- biztonsági elemzés \end{itemize} \end{exampleblock} \end{frame} \begin{frame}{Docker Desktop -- Telepítés} \begin{exampleblock}{Telepítési lépések} \begin{enumerate} \item Letöltés: \texttt{docker.com/products/docker-desktop} \item Telepítő futtatása \item Rendszer újraindítása (ha szükséges) \end{enumerate} \end{exampleblock} \end{frame} \begin{frame}{Docker Desktop -- Ellenőrzés} \begin{exampleblock}{Ellenőrzés} \begin{enumerate} \item Docker Desktop indítása \item Ellenőrzés terminálban: \texttt{docker --version} \end{enumerate} \end{exampleblock} \end{frame} \begin{frame}{Docker Desktop -- Windows és macOS} \begin{block}{Windows és macOS} \begin{itemize} \item \textbf{Docker Desktop ajánlott} -- grafikus telepítő \item Tartalmaz mindent: Docker Engine, CLI, Compose \item Automatikus frissítések \end{itemize} \end{block} \end{frame} \begin{frame}{Docker Desktop -- Linux} \begin{alertblock}{Linux} \begin{itemize} \item \textbf{Docker Engine} közvetlenül telepíthető \item Docker Desktop opcionális (beta) \item Parancssorból: \texttt{apt install docker.io} \end{itemize} \end{alertblock} \end{frame} \begin{frame}{Összefoglalás -- Docker lényege} \begin{block}{Docker = Modern konténerizáció} \begin{itemize} \item Alkalmazások izolált, hordozható csomagolása \item Könnyűsúlyú alternatíva a virtuális gépeknek \item ``Build once, run anywhere'' filozófia \end{itemize} \end{block} \end{frame} \begin{frame}{Összefoglalás -- Előnyök} \begin{exampleblock}{Miért használjuk?} \begin{itemize} \item Gyors és könnyű deployment \item Hatékony erőforrás kihasználás \item Skálázható mikroszolgáltatások \end{itemize} \end{exampleblock} \end{frame} \begin{frame}{Összefoglalás -- Fogalmak} \begin{block}{Build és futtatás} \begin{itemize} \item \textbf{Dockerfile:} Utasítások az image építéséhez \item \textbf{Image:} Csak olvasható sablon az alkalmazásról \item \textbf{Container:} Futó példány egy image-ből \end{itemize} \end{block} \begin{exampleblock}{Folyamat} Dockerfile $\rightarrow$ build $\rightarrow$ Image $\rightarrow$ run $\rightarrow$ Container \end{exampleblock} \end{frame} \begin{frame}{Összefoglalás -- Tárolás} \begin{block}{Tárolás és kommunikáció} \begin{itemize} \item \textbf{Registry:} Image-ek tárolása (pl. Docker Hub) \item \textbf{Volume:} Perzisztens adattárolás \item \textbf{Network:} Konténerek közötti kommunikáció \end{itemize} \end{block} \begin{alertblock}{Következő lépések} Dockerfile készítés, image build, konténer kezelés, Docker Compose \end{alertblock} \end{frame}