Na konferenci PyCon v Santa Claře Solomon Hykes pred par dny predstavil projekt Docker — nastroj pro baleni aplikaci do lehkych kontejneru. To, co jsme videli, ma potencial fundamentalne zmenit zpusob, jakym vyvijiame, testujeme a nasazujeme software. Podivejme se, proc je Docker tak zajimovy a co to znamena pro enterprise vyvojare.
Co je Docker a proc vznikl¶
Docker je open-source platforma, ktera umoznuje zabalit aplikaci vcetne vsech jejich zavislosti do standardizovaneho kontejneru. Na rozdil od virtualnich stroju, ktere emuluji kompletni hardware a bezi vlastni jadro operacniho systemu, kontejnery sdileji jadro hostitelskeho systemu a izoluji pouze userspace. Vysledkem je radove mensi rezie — kontejner startuje za sekundy, ne za minuty, a zabira desitky megabajtu misto gigabajtu.
Projekt vznikl ve firme dotCloud, ktera provozuje Platform-as-a-Service. Solomon Hykes a jeho tym zjistili, ze interni nastroj, ktery pouzivaji pro spravu aplikaci na sve platforme, by mohl byt uzitecny pro celou komunitu. A tak se Docker zrodil jako open-source projekt pod licenci Apache 2.0.
Technicky Docker stoji na dvou klicovych technologiich Linuxoveho jadra — cgroups (control groups) pro omezeni prostredku a namespaces pro izolaci procesu. Tyto mechanismy existuji v Linuxu uz roky, ale Docker je prvni nastroj, ktery je zpristupnil siroke vyvojarske komunite prostrednictvim jednoducheho rozhrani.
Jak Docker funguje¶
Zakladnim konceptem je Docker image — read-only sablona, ktera obsahuje operacni system, runtime prostredi, knihovny a aplikaci. Image se vytvari pomoci souboru nazyvaneho Dockerfile, ktery popisuje kroky pro sestaveni prostredi. Kazdy krok vytvari novou vrstvu (layer), coz umoznuje efektivni sdileni a cachovani.
FROM ubuntu:12.04 RUN apt-get update && apt-get install -y python python-pip COPY requirements.txt /app/ RUN pip install -r /app/requirements.txt COPY . /app/ CMD [“python”, “/app/server.py”]
Tento jednoduchy Dockerfile ukazuje silu konceptu — v sesti radcich definujeme kompletni prostredi pro Python aplikaci. Kdokoliv s timto souborem muze vybuildit identicky image na libovolnem stroji s Dockerem.
Z image se vytvari kontejner — bezici instance image. Kontejner pridava zapisovatelnou vrstvu nad read-only vrstvy image. Zmeny v kontejneru (nove soubory, upravy konfigurace) zustavaji v teto vrchni vrstve a nemeni puvodni image. Tohle je naprosto klicove pro reprodukovatelnost.
Docker vs. virtualizace — kde jsou rozdily¶
V nasem tymu pouzivame VMware pro produkci a VirtualBox pro vyvoj uz leta. Prirodzene se tedy ptame — proc bychom chteli neco jineho? Rozdily jsou zasadni a stoji za podrobne prozkoumani.
Vykon: Virtualni stroj bezi nad hypervisorem a emuluje kompletni hardware. To znamena vlastni jadro, vlastni init system, vlastni spravu pameti. Kontejner sdili jadro s hostem a izoluje pouze procesy. V praxi to znamena, ze na jednom serveru muzete mit desitky kontejneru tam, kde byste meli jednotky VM. Startup kontejneru je v radu sekund, startup VM v radu minut.
Izolace: Tady virtualni stroje stale vyhravaji. Plna hardwarova virtualizace poskytuje silnejsi izolaci — kompromitovany VM nemuze snadno ovlivnit hostitele. Kontejnery sdileji jadro, a pokud existuje zranitelnost v jadre, utocnik muze teoreticky uniknout z kontejneru. Pro bezpecnostne kriticke aplikace v bankovnim sektoru to je relevantni uvaha.
Portabilita: Docker image bezi stejne na vyvojarovem notebooku, na staging serveru i v produkci. Zadne „u me to funguje”. Image obsahuje vsechno — od systemovych knihoven po konfiguraci aplikace. To je obrovska vyhoda proti VM, kde musime udrzovat konzistenci mezi prostredimi pomoci nastroju jako Puppet nebo Chef.
Union File System — klicova inovace¶
Docker pouziva AUFS (Another Union File System) pro spravu vrstev image. Kazda instrukce v Dockerfile vytvari novou vrstvu. Vrstvy jsou read-only a sdileji se mezi imagy — pokud deset vasich aplikaci pouziva Ubuntu 12.04 jako zaklad, tato vrstva existuje na disku pouze jednou. To dramaticky snizuje diskove naroky a zrychluje stahovani nových imagů.
Zapisovatelna vrstva kontejneru pouziva strategii copy-on-write. Kdyz kontejner modifikuje soubor z nizsi vrstvy, soubor se nejdrive zkopiruje do vrchni vrstvy a teprve potom se upravi. To znamena, ze cteni je rychle (primo z nizsi vrstvy), ale prvni zapis do existujiciho souboru je pomalejsi.
Docker Registry — sdileni imagů¶
Docker prinasi koncept registry — centralniho uloziste pro Docker image. Verejny Docker Hub jiz obsahuje stovky imagů — od oficialnich distribuci (Ubuntu, CentOS, Debian) pres databaze (MySQL, PostgreSQL, MongoDB) az po aplikacni servery (Nginx, Apache, Tomcat). Muzete vsak provozovat i privatni registry pro interni pouziti, coz je pro enterprise prostredi nezbytnost.
Workflow je jednoduchy: vyvojari buildi image lokalne, pushnou ho do registry, a deployment system ho pullne na produkcni servery. Vsichni pracuji se stejnym artefaktem — zadne „ale ja mel jinou verzi knihovny”.
Prakticke pouziti — co jsme vyzkouseli¶
V nasem tymu jsme Docker vyzkouseli na internim projektu — microservice pro zpracovani faktur. Aplikace je napsana v Jave 7, bezi na Tomcatu 7 a pripojuje se k PostgreSQL databazi. Tradicne bychom nasadili WAR soubor na sdileny Tomcat server a konfigurovli JNDI datasource. S Dockerem jsme pristoupili jinak.
Vytvorili jsme Dockerfile, ktery startuje od officialni OpenJDK image, pridava Tomcat, kopiruje WAR soubor a nastavuje environment variables pro pripojeni k databazi. Cely build trva 45 sekund. Vysledny image ma 340 MB — to zahrnuje operacni system, JDK, Tomcat i nasi aplikaci.
Nasazeni na testovaci server? Jeden prikaz: docker run -d -p 8080:8080 -e DB_HOST=postgres.internal nase-faktury:1.0. Za tri sekundy bezi. Chceme novou verzi? Buildime novy image, zastavime stary kontejner, spustime novy. Rollback? Spustime predchozi verzi image. Jednoduchost je az podezrela.
Limity a obavy¶
Docker je mlady projekt a ma sve limity, ktere je nutne pojmenovat. Za prve, funguje pouze na Linuxu. Pro vyvojare na Mac OS X nebo Windows to znamena nutnost spoustet Docker uvnitr VM (pres Vagrant nebo boot2docker). To pridava vrstvu komplexity a castecne neguje vyhodu jednoduchosti.
Za druhe, Docker zatim nepodporuje orchestraci vicero kontejneru. Pokud vase aplikace sestava z weboveho serveru, aplikacniho serveru, databaze a message brokeru, musime rucne koordinovat spusteni a propojeni kontejneru. Pro jednoduche aplikace to neni problem, ale pro enterprise systemy s desitkami komponent to je zasadni omezeni. Ocekavame, ze komunita brzy prinese nastroje pro orchestraci.
Za treti, persistence dat. Kontejner je efemerni — po zastaveni se ztrati vsechny zmeny v zapisovatelne vrstve. Pro bezstavove aplikace to neni problem, ale pro databaze a jina stavova data musime pouzivat Docker volumes, ktere mapuji adresar z hostitele do kontejneru. Sprava volumes je zatim pomerne primitivni.
Za ctvrte, monitoring a logovani. Tradicni nastroje jako Nagios nebo Zabbix pocitaji s tim, ze aplikace bezi primo na serveru. Kontejnery pridavaji vrstvu abstrakce, kterou tyto nastroje zatim neumí dobre zpracovat. Budeme potrebovat nove pristupy k monitorovani.
Vliv na CI/CD pipeline¶
Kde vidime nejvetsi potencial Dockeru, je continuous integration a continuous delivery. Dnes nas CI server (Jenkins) buildi aplikaci, spousti testy a vytvari deployovatelny artefakt (WAR, JAR, RPM). S Dockerem se artefaktem stava samotny image — obsahuje nejen aplikaci, ale i cele prostredi.
To eliminuje cely tridu problemu. Uz se nam nestane, ze test projde na CI serveru, ale selze v produkci kvuli rozdilne verzi systemove knihovny. Image, ktery prosel testy, je identicky s image, ktery pobezi v produkci. Tuhle garanci nam zadny jiny nastroj neposkytuje.
Navic Docker umoznuje paralelni testovani. Potrebujeme otestovat aplikaci proti PostgreSQL 9.1 a 9.3? Spustime dva kontejnery s ruznymi verzemi databaze a testy bezi paralelne. Bez Dockeru bychom potrebovali dva separatni servery nebo slozitou konfiguraci na jednom.
Co to znamena pro enterprise¶
Je Docker pripraven pro produkcni enterprise pouziti? Dnes v breznu 2013 uprimne — jeste ne. Projekt je ve velmi rane fazi, API se meni, dokumentace je strohá a komunita teprve vzniká. Ale smer je jasny a potencial obrovsky.
Pro nase klienty v bankovnim a pojistovacim sektoru vidime Docker jako budouci standard pro nasazovani aplikaci. Predstavte si svet, kde kazda aplikace bezi ve svem izolovanem kontejneru s presne definovanymi zavislostmi. Kde deployment znamena jeden prikaz a rollback druhy. Kde vyvojove prostredi je identicke s produkci. To je svet, ktery Docker slibuje.
Doporucujeme zacit experimentovat nyni. Vyzkousejte Docker na interních projektech, naucte se koncepty, pochopte limity. Az bude Docker pripraven pro produkci — a jsme presvedceni, ze to bude behem jednoho az dvou let — budete pripraveni ho nasadit.
Srovnani s LXC¶
Linux Containers (LXC) existuji dele nez Docker a poskytují podobnou funkcionalitu na nizsi urovni. Docker puvodne pouzival LXC jako backend pro spravu kontejneru. Hlavni rozdil je v urovni abstrakce — LXC poskytuje nizkouromnove API pro spravu kontejneru, zatimco Docker pridava koncepty jako image, Dockerfile, registry a verzovani. Je to rozdil mezi assemblerem a vysokourovnovym jazykem.
Pro systemove administratory zvykle na praci s LXC muze Docker pusobit zbytecne abstraktne. Pro vyvojare, kteri chteji proste zabalit a spustit svou aplikaci, je Docker vyrazne pristupnejsi. A prave pristupnost je to, co rozhodne o adopci technologie.
Budoucnost kontejnerizace¶
Docker neni jediny hrac v prostoru kontejnerizace. Google intarne pouziva kontejnerovou technologii nazvanou Borg jiz vice nez deset let a spousti v nich prakticky vsechny sve sluzby. Fakt, ze Google spousti dva miliardy kontejneru tydne, dokazuje, ze kontejnerizace funguje v obrovsky scale.
Ocekavame, ze Docker katalyzuje cely ekosystem — nastroje pro orchestraci, monitoring, networking a bezpecnost kontejneru. Je mozne, ze za pet let bude deployment aplikace bez kontejneru pusobit stejne archaicky jako dnes deployment bez version control systemu.
Zaver a doporuceni¶
Docker je jednou z nejvyznamnejsich technologii, ktere jsme v poslednich letech videli. Slibuje konec problemu „u me to funguje”, dramaticke zrychleni deploymentu a lepsi vyuziti serverovych prostredku. Projekt je mlady, ale smer je jasny.
Nase doporuceni: Zacnete experimentovat. Nainstalujte Docker, vytvorte Dockerfile pro jednu z vasich aplikaci, pochopte koncepty image a kontejneru. Az Docker dozraje pro produkci, budete pripraveni.