====== Docker ======
**Docker** je open-source nástroj, který umožňuje spouštět aplikace v izolovaných prostředích zvaných **kontejnery**. Řeší klasický problém vývojářů: //"Na mém počítači to funguje, ale na serveru ne."//
===== Základní pojmy =====
Práce s Dockerem se točí kolem tří hlavních konceptů:
* **Dockerfile:** Textový soubor obsahující instrukce pro sestavení obrazu (např. "použij Python 3.9", "zkopíruj kód", "nainstaluj knihovny").
* **Image (Obraz):** Nežijící šablona aplikace. Je to "zmrazený" stav aplikace se vším, co potřebuje ke spuštění.
* **Container (Kontejner):** Běžící instance obrazu. Jeden obraz můžete spustit v mnoha kontejnerech současně.
* **Docker Hub:** Veřejné úložiště, kde lze stahovat hotové obrazy (např. oficiální obraz pro databázi MySQL nebo webový server Nginx).
===== Jak Docker funguje? (Architektura) =====
Na rozdíl od virtuálních strojů (VM) Docker nesdílí celý operační systém.
- **Virtuální stroj:** Obsahuje vlastní jádro OS, což je náročné na RAM a CPU.
- **Docker kontejner:** Sdílí jádro hostitelského systému, ale izoluje procesy. Díky tomu je extrémně lehký a startuje v řádu sekund.
===== Výhody kontejnerizace =====
^ Vlastnost ^ Výhoda pro vývojáře ^
| **Přenositelnost** | Kontejner běží stejně na notebooku, v cloudu i na [[Steam Deck|Steam Decku]]. |
| **Izolace** | Můžete mít na jednom stroji dvě aplikace vyžadující různé verze stejné knihovny bez konfliktů. |
| **Efektivita** | Vyšší hustota aplikací na jeden server oproti VM. |
| **Verzování** | Obrazy lze verzovat a snadno se vrátit k předchozí funkční verzi aplikace. |
===== Základní workflow =====
1. **Build:** Vytvoření obrazu z Dockerfile (docker build -t moje-aplikace .).
2. **Push:** Odeslání obrazu do registru (např. Docker Hub).
3. **Pull:** Stažení obrazu na cílový server (docker pull moje-aplikace).
4. **Run:** Spuštění kontejneru (docker run -d moje-aplikace).
===== Docker Compose =====
Pro složitější aplikace, které se skládají z více kontejnerů (např. web + databáze + cache), se používá nástroj **Docker Compose**. Pomocí jednoho souboru ``docker-compose.yml`` definujete celou infrastrukturu a spustíte ji jediným příkazem docker-compose up.
---
> **Vztah k ostatním technologiím:** Zatímco Docker se stará o to, jak kontejner vytvořit a spustit, [[Kubernetes]] se stará o to, jak tyto kontejnery řídit na stovkách serverů zároveň.
//Související: [[Kubernetes]], [[DevOps]], [[CI/CD]], [[https://www.docker.com|Oficiální web Docker]]//