Jak se balí aplikace
Vzpomeňme nejprve ty základní způsoby, jakými bývají aplikace provozovány. Předně je to nativní běh, kdy je program zkompilován pro danou platformu a nějak uživateli zpřístupněn. Na Windows třeba klasickou instalací pomocí instalátoru či balíčku MSI, na Linuxu typicky skrze balíčkovací systém typu RPM a DEB. Ale ne nevyhnutelně takto, na všech systémech si můžeme spustitelnou aplikaci vyrobit zkompilováním ze zdrojového kódu. Nic z těchto aspektů ale neřeší bezpečnost provozu takových aplikací, jejich provázanost či oddělenost od operačního systému, na kterém běží.
I proto – a speciálně na Linuxu z důvodu oddělení závislostí na jiných programech – se před lety zrodily systémy jako Flatpak, Snap či AppImage. Na někdejším systému PC-BSD tento koncept ostatně přinesly balíčky PBI řadu let předtím. Program si táhl všechny své závislosti sebou a autor takového balíčku tak nemusel řešit, jestli dané verzi přehrávače „bude chutnat“ ta či ona verze frameworku Gstreamer. Prostě vše sbalil do jednoho balíku typu Flatpak a servíroval jako celek. Ano, z hlediska zabraného místa náročnější, v z hlediska spouštění potenciálně pomalejší (v případě Snapu zcela určitě). Ale to opět odbočuji.
Koncept, ke kterému dnes míříme, souvisí s virtualizací. Někdy zkrátka k provozu aplikace potřebujeme nikoli jen přibalit jí některé z jejích závislostí, ale i další nižší vrstvy operačního systému, kterými námi provozovaný systém třeba nedisponuje. Například se leckdy hodí, či je přímo nutné aplikaci pro Windows prostě spouštět ve Windows. V takovou chvíli dnes můžeme sáhnout nejen po dual-bootu, ale také po virtualizaci.
Hardwarová podpora v CPU je již léta, Linux disponuje vlastními systémy virtualizace, a tak lze úspěšně provázávat například běh ryze-windowsových aplikací s linuxovým systémem pod tím, případně naopak provozovat čistě unixové věci na Windows – dnes asi v tomto ohledu nejvíce exceluje Microsoftí subsystém WSL 2.0(+).
Virtualizovaný systém a v něm běžící aplikace jsou zpravidla z principu věci dostatečně odděleny od mateřského systému, na kterém celá virtualizace běží (pomiňme, že různé chyby CPU, které se od dob Spectre a Meltdown objevily, toto poněkud zpochybňují). Avšak jde o řešení pro běh nějaké konkrétní aplikace dosti těžkopádné.
Právě toto řeší Windows Subsystem for Linux stále lépe a lépe, kdy lze dnes na Windows provozovat linuxové programy často takřka bezešvým způsobem, jako by šlo o aplikace nativní. Linux tak daleko ještě typicky není a ani dnešní novinka toto nemění, Docker není nástrojem pro běh Windows programů na Linuxu, pročež opusťme toto ne zcela přesné přirovnání a povězme si, co je nového: linuxová verze Docker Desktopu.
Docker Desktop pro Linux
Docker jako takový je dnes již chronicky známý, mnohými oblíbený systém poskytující rozhraní pro izolaci aplikací do kontejnerů. Tedy jakási odlehčená virtualizace, která v rámci kontejneru poskytne aplikaci vše, co potřebuje, ale jako operační systém pod tím neslouží dané aplikaci nějaký OS běžící virtualizovaně, ale přímo samotný OS pod tím vším. Výhodou tohoto přístupu je právě ona virtualizovanost (a z ní plynoucí flexibilita a náklady na provoz kontejnerované aplikace) v kombinaci s ne-vyšší náročností na zdroje systému. Nevýhodou pak je samozřejmě to, že na rozdíl od virtuálního stroje nelze daný kontejner jednoduše přenést na libovolný jiný počítač s libovolným jiným operačním systémem.
Pro mnoho způsobů provozu aplikací či služeb ale představuje Docker aktuálně nejlepší dostupné technické řešení. Obecně pak Docker, resp. jakýkoli kontejnerový návrh architektury, může být technicky zajímavý i sám o sobě, což nasvědčuje třeba i někdejší existence na kontejnerech (nikoli však Dockeru) postavené linuxové distribuce EasyOS. Pro mnoho uživatelů ale může být Docker a jeho konfigurace příliš komplikovaná a/nebo časově náročná.
Přivítejme tedy Docker Desktop, řešení zaměřené na snadné vytváření kontejnerovaných aplikací či mikroslužeb. Docker Desktop se po své instalaci může automaticky spouštět se systémem, lze v něm snadno nastavovat přidělené zdroje (počet jader CPU, velikost RAM, swapu i diskového prostoru, sdílení souborů, HTTP proxy/síť obecně, …), podobně jako to známe třeba u VirtualBoxu.
Běh aplikací v těchto kontejnerech má tu výhodu, že v případě potřeby lze celý systém zmrazit, tedy pozastavit. Docker Desktop v takovou chvíli pozastaví všechny procesy a uloží jejich stavy do paměti. Po kliknutí na obnovu se pak vše opět spustí. To vše je možné i díky tomu, že Decker Desktop využívá pro svůj běh svůj vlastní virtuální stroj, ostatně KVM je jednou z nutných podmínek pro jeho běh.
Proč Docker Desktop využívá virtualizaci
První z důvodů, které tvůrci uvádějí, je snaha poskytnout konzistentní uživatelskou zkušenost skrze všechny platformy. Při výzkumu bylo zjištěno, že tohle je jeden z nejčastěji uváděných důvodů uživateli, kteří Docker Desktop for Linux (DD4L) chtějí – vše stejné, včetně vlastností nabízených aplikacemi, skrze všechny platformy. Díky použití VM toto může Docker Desktop nabídnout skrze Windows, macOS a Linux.
Druhou z věcí je snaha o využívání nových kernelových vlastností. To lze díky tomu, že Docker Desktop si sám určuje verzi jádra a OS uvnitř virtuálního stroje a toto může poskytovat uživatelům všech platforem, včetně těch, kteří záměrně používají různé LTS verze systémů.
Třetím důvodem je snaha o vyšší zabezpečení. Jak jsme již uvedli, Docker sám o sobě sice není dokonalý systém pro oddělení aplikací od zbytku počítače, schopný zamezit libovolným útokům, přesto ale mezi hlavní systém a aplikaci „vkládá mezivrstvu“, která snižuje riziko zneužití známých chyb útočníkem či rizika plynoucí z podstrčení nějakého chybou zaneseného kontejneru.
A nakonec tu máme poskytování výhod stejných vlastností a vylepšeného zabezpečení s minimálním dopadem na výkon. VM na Docker Desktopu na Linuxu využívá virtiofs
, sdílený souborový systém, který virtuálním strojům poskytuje přístup k adresářové struktuře hostitele. Interní bechnmarky provedené u Dockeru ukazují, že při vhodné alokaci zdrojů pro VM je zde dosahován téměř nativní výkon. Navíc uživatel, jak jsme již uvedli, má možnost si tyto parametry nastavit podle svého.
Co je potřeba pro provoz
K provozu Docker Desktopu je samozřejmě potřeba jej nejprve nainstalovat. V tuto chvíli je mezi podporovanými distribucemi uváděna trojice Ubuntu + Debian + Fedora, existuje pak i experimentální balíček pro Arch Linux a na něm založené distribuce. Systémové požadavky zahrnují:
- 64bitový kernel a CPU s podporou virtualizace
- virtualizace KVM
- QEMU 5.2 či vyšší (doporučena nejnovější verze)
- init systém systemd
- desktop GNOME či KDE
- alespoň 4 GB RAM
Proces instalace Docker Desktopu popisuje dokumentační stránka na domovském webu. Sluší se z ní vypíchnout, že i s ohledem na to, jak Docker Desktop ukládá kontejnery v oddělené struktuře virtuálních strojů, je možné Docker Desktop provozovat na stejném systému paralelně s Dockerem jako takovým.
Z hlediska aktualizací pak sám Docker Desktop zobrazí upozornění na novou verzi, jakmile bude k dispozici. Docker Desktop lze samozřejmě i odinstalovat.
Zkrátka a dobře, Docker Desktop je tady a s ním i nový způsob práce s aplikacemi v kontejnerech, sjednocení uživatelské zkušenosti skrze platformy, podpora snadných instalací rozšíření, bezešvá integrace s Kubernetes či jednoduchá správa kontejnerů či obrazů a obecně tedy distribučně nezávislý systém zpřístupnění aplikací, nezávisle na to, zdali třeba zrovna vaše LTS vydání nedisponuje jen zastaralými nativními balíčky.
Vše potřebné shrnují podrobné informace na domovském webu projektu.