Docker a kontejnerizace
Kontejnerizace je metoda virtualizace na úrovni operačního systému, která umožňuje zabalit aplikaci a všechny její závislosti (knihovny, konfigurační soubory, frameworky) do jednoho izolovaného balíčku zvaného kontejner. Tento přístup zaručuje, že aplikace poběží naprosto stejně a spolehlivě bez ohledu na to, zda je spuštěna na vývojářově notebooku, testovacím serveru nebo v produkčním cloudu.
Nejznámější a nejrozšířenější platformou pro vytváření a správu kontejnerů je Docker. Ačkoliv Docker nebyl první technologií svého druhu (předcházely mu např. LXC kontejnery v Linuxu), díky své jednoduchosti a vývojářsky přívětivému nástrojovému vybavení způsobil v roce 2013 naprostou revoluci ve vývoji softwaru (tzv. DevOps kultura) a vyřešil letitý problém: „U mě na počítači to funguje!“
Princip: Kontejnery vs. Virtuální stroje (VM)
Pro pochopení geniality kontejnerů je nutné je porovnat s tradičními virtuálními stroji.
V klasické virtualizaci (např. VMware, VirtualBox) sedí na fyzickém hardwaru vrstva zvaná Hypervizor. Pokud chcete spustit tři izolované aplikace, musíte vytvořit tři virtuální stroje. Každý tento stroj musí obsahovat svůj vlastní, plnohodnotný operační systém (Guest OS). To znamená obrovskou redundanci – systém spotřebuje gigabyty RAM a desítky gigabytů na disku jen pro samotný běh tří kopií stejného operačního systému.
[Image of Docker container architecture vs Virtual Machine]
Kontejnery fungují odlišně. Nesimulují celý hardware, ale sdílejí jádro (Kernel) hostitelského operačního systému. Docker Engine běží přímo na hostitelském OS a každému kontejneru přiděluje izolovaný prostor (pomocí linuxových funkcí Namespaces a Cgroups). Kontejner tak obsahuje pouze samotnou aplikaci a nezbytné knihovny. Výsledkem je, že kontejner má velikost v řádech megabytů a nastartuje za zlomek sekundy.
Architektura a klíčové pojmy Dockeru
Ekosystém Dockeru se skládá z několika základních stavebních kamenů, které na sebe logicky navazují:
1. Dockerfile
Jednoduchý textový soubor obsahující sekvenci příkazů (recept), jak se má aplikace sestavit. Definuje výchozí bod (např. čistý operační systém Alpine Linux nebo prostředí Pythonu), kopíruje zdrojové kódy, instaluje závislosti a určuje, jaký příkaz se má spustit při startu.
2. Docker Image (Obraz)
Když spustíte sestavení (build) nad Dockerfilem, vznikne Image. Je to statická, pouze pro čtení (read-only) šablona s vaší aplikací. Image je složen z vrstev, což umožňuje efektivní sdílení dat na disku (pokud máte 10 obrazů založených na stejném základu Ubuntu, stáhne se a uloží Ubuntu jen jednou).
3. Docker Container (Kontejner)
Kontejner je běžící instance Docker Image. Můžete si to představit jako objekt vytvořený ze třídy v programování. Z jednoho obrazu můžete spustit tisíce identických kontejnerů. Kontejner má svou vlastní izolovanou paměť, souborový systém a síťové rozhraní.
4. Docker Registry / Docker Hub
Centrální repozitář (katalog) pro ukládání a sdílení Docker Images. Funguje podobně jako GitHub pro zdrojové kódy. Docker Hub je obří veřejná knihovna, odkud si můžete stáhnout hotové a oficiální obrazy databází (MySQL, PostgreSQL), webových serverů (Nginx, Apache) nebo analytických nástrojů.
Výhody a nevýhody kontejnerizace
Výhody
- Absolutní přenositelnost (Portability): Pokud kontejner funguje u vás, bude fungovat kdekoliv, kde běží Docker.
- Rychlost: Spuštění kontejneru netrvá minuty jako start Windows/Linuxu ve virtuálním stroji, ale sekundy či milisekundy.
- Hustota a efektivita: Na jednom serveru můžete spustit stovky kontejnerů místo jednotek virtuálních strojů, čímž drasticky šetříte náklady na hardware.
- Verzování a rollback: Vždy víte, z jaké verze obrazu kontejner běží. Pokud nová verze aplikace obsahuje chybu, bleskově spustíte kontejner ze staršího obrazu.
Nevýhody
- Bezpečnostní rizika sdíleného jádra: Protože všechny kontejnery sdílejí jeden kernel hostitelského OS, kritická zranitelnost v jádře může teoreticky umožnit útočníkovi „uniknout“ z kontejneru a ohrozit ostatní.
- Efemérní (pomíjivá) povaha: Data uvnitř kontejneru jsou zničena, jakmile kontejner smažete. Pro trvalé uložení dat (např. u databází) je nutné složitěji mapovat tzv. Docker Volumes (svazky) na hostitelský disk.
- Není to na všechno: Monolitické desktopové aplikace s bohatým grafickým rozhraním (GUI) nejsou pro kontejnerizaci vhodné.
Orchestrace: Když už Docker nestačí
Pokud provozujete jednotky kontejnerů, postačí vám základní nástroj Docker Compose. Pokud však stavíte rozsáhlou architekturu mikroslužeb (Netflix, Spotify, banky) a potřebujete spravovat, aktualizovat a load-balancovat desetitisíce kontejnerů rozprostřených přes stovky serverů, samotný Docker je bezmocný.
Pro tyto účely se používají Orchestrátory. Absolutním průmyslovým standardem se stal systém Kubernetes (K8s) (původně vyvinutý společností Google), který se stará o to, aby vaše kontejnery neustále běžely, automaticky je restartuje při pádu a přidává další v případě náhlé špičky v návštěvnosti.
Rychlé srovnání: Kontejner vs. Virtuální stroj
| Vlastnost | Virtuální stroj (VM) | Kontejner (Docker) |
|---|---|---|
| Izolace | Úplná (Hardwarová) | Částečná (Na úrovni OS) |
| Operační systém | Každá VM má vlastní těžký Guest OS | Všechny sdílejí jádro Host OS |
| Velikost na disku | Gigabyty (GB) | Megabyty (MB) |
| Doba spuštění | Minuty | Sekundy / Milisekundy |
| Využití zdrojů | Extrémně náročné | Vysoce efektivní |
| Typické nasazení | Běh odlišných OS na jednom serveru | Mikroslužby, CI/CD pipeline, webové appky |
