Jak se dnes virtualizuje infrastruktura?
Virtualizace je u IT infrastruktury již nějakou dobu hojně používaný princip, posledním trendem je ještě větší izolace jednotlivých služeb. K tomuto slouží kontejnery a mezi nejvýraznější nástroje pro jejich správu patří právě Docker. Kam ale Docker kontejnery umístit? Co nabízejí poskytovatelé infrastruktury IBM Bluemix a Amazon Web Services? O tomto pojednává následující článek.
Úvod
Kontejnery (neboli také OS partitions) jsou poměrně starým principem, v UNIXových systémech jsou již od začátku - pomocí příkazů chroot a jail. Nabízejí nejefektivnější formu virtualizace, jelikož sdílí s hostitelským OS stejné jádro. Má to svá omezení, není možné zavádět do jádra vlastní moduly, které by umožnily např. vlastní virtuální síťové karty (hojně používané pro různé šifrované tunely). Ale to dnešní webové aplikace a backendy nepotřebují. Ty naopak potřebují zefektivnit správu serverové infrastruktury, aby byla škálovatelná pro velké počty instancí.
Nový způsob administrace
V klasickém modelu, když je třeba např. instalovat novou knihovnu, se tato knihovna na daný server (ať už virtuální, kontejner či fyzický) nainstaluje. Tuto činnost je třeba opakovat pro všechny bežící instance. Docker a jemu podobné nadstavby nad systémovými kontejnery (Chef, Puppet), tento problém řeší tak, že se napíše jakýsi inicializační skript, podle kterého se image daného kontejneru sestaví. Admin poté do běžící instance již nezasahuje, když je třeba cokoliv upravit, vždy se upraví inicializační skript. Daná instance se poté zabije a nainstaluje podle upraven ého skriptu znova.
Díky tomuto principu je možné nasazovat velké množství instancí, a co více, tyto skripty komunitně sdílet pro jednotlivé služby. Podmínkou pro tento princip je značná fragmentace služeb, neboli jeden kontejner by měl vykonávat právě jednu činnost. Znamená to tedy nastavit jeden kontejner např. pro databázi, jeden pro webovou aplikaci (např. PhpMyAdmin) a tyto kontejnery spolu propojit. Každý ale má vlastní inicializační skript.
Docker
Docker je zajímavý ze dvou důvodů. Za prvé díky silné podpoře mezi poskytovateli infrastruktury jako jsou IBM Bluemix a Amazon AWS. Za druhé díky velké komunitě kolem https://hub.docker.com/, kde se sdružují jednotlivé Docker skripty a mnoho opensource projektů (např. mysql, redmine, redis) zde má svá oficiální repa. Je to tedy mnohem pohodlnější způsob instalace, než např. ze zdrojových kódů a mnohem rychlejší než z oficiálních repozitářů správců linuxových distribucí (které mají tak pomalý akceptační cyklus, že jsou pro nové služby téměř nepoužitelné).
Z jakých komponentů se jednotlivé kontejnery skládají?
Síť
Síťové spojení je nutno udržovat dvojí - jednak (volitelně) pomocí veřejné IP adresy s okolním světem a poté (především) s ostatními kontejnery. Komunikace s ostatními kontejnery by neměla z bezpečnostních důvodů probíhat pomocí veřejné síťe a otevřených portů. Docker pro tento princip nabízí funkci --link. Díky tomu je možné každý kontejner připojit k již existujícímu, takže např. mysql databáze nemá vlastní veřejnou IP adresu a otevřené porty, kontejner s phpmyadminem se na ni připojí pomocí linku a teprve ten komunikuje na venek.
Avšak tato volba je od uvedení docker networkingu již považována za legacy. Ale je pro ni napsána většina docker repozitářů na dockerhubu, proto bude ještě nějakou dobu nezbytná. Docker networking funguje nad systémovými bridgi, je tedy možné si privátní infrastrukturu poskládat dle libosti (avšak není to tak přímočaré, jako použití linků).
Amazon podporuje jak legacy linky (dokonce pomocí webového GUI), tak novější networking (pouze pomocí CLI). IBM Bluemix legacy linky nepodporuje, networking přes CLI ano.
Storage
Jelikož se kontejnery kvůli každé změně konfigurace musí zabít a nainstalovat znovu, jejich úložiště je pouze dočasné. Jakým způsobem toto řešit na příkladu třívrstvé webové aplikace? Databáze (jak již bylo uvedeno výše) do kontejneru s aplikací nepatří, působí jako samostatný kontejner nebo úplně externí služba. Co se týče netříděných dat (různé upload files atd), které se neukládají do databáze, pro ně existují v doceru takzvané Volumes. Což jsou perzistentní úložiště na hostitelském serveru mountovatelné do jednotlivých kontejnerů.
IBM Bluemix nepodoruje přidávání Volumes za běhu, je tedy nutné vše dávat do inicializačního Docerfile, což je značně nepraktické. Amazon podporuje přidávání volumes dokonce přes GUI.
Cena
Pricing model obou služeb je olišný, obě mají základní free tier, kterým se nyní ale nebudeme zabývat. U IBM se platí za jednotlivé kontejnery (které je možné si objednat s různými parametry), u Amazonu se oproti tomu za kontejnery neplatí nic, je to služba navíc doplňující stávající EC2 výpočetní instance (které je potřeba samozřejmě platit) - počet kontejnerů tedy není nijak limitován.
Obě dvě služby mají odlišný pricing dle lokality, k porovnání jsem vzal region EU (který patří mezi dražší).
Minimální rozumná instance Amazon EC2 t2.micro s 1GB RAM a sdíleným CPU stojí 0.014 USD/ hodina, neboli cca 260 Kč měsíčně. Dále se platí 0.11 USD za měsíc za 1GB storage, celkem tedy instance s 20GB storage přijde na 315 Kč.
Kontejner podobných parametrů od IBM Bluemix stojí 423 Kč + 286 Kč za 20GB storage, celkem tedy 707 Kč.
Závěr
Obě dvě služby udělaly za poslední (půl) rok obrovský pokrok, závěry tohoto článku tedy již za pár měsíců zase nemusí platit. Nyní vychází lépe Amazon, jak co se týče portfolia podporovaných funkcí, tak co se týče pricingu. Ale je důležité, že existuje takovýchto služeb více a je možné mezi nimi díky standardním Docker kontejnerům cca libovolně přecházet.