Radsej by som odporucal precitat si oficialnu dokumentaciu ako sa otravovat tym clankom na howtoforge. Mam pocit, ze autor len tak trochu tusi ako to funguje a naviac tam pridava kopec zbytocneho balastu s php, nginx a podobne ktore su pre pochopenie principu uplne nepodstatne.
A ako spravicka mi to pride uplne nevhodne, podobnych howto sa na nete objavi kazdy den niekolko.
Pre zaciatocnikov odporucam zacat tu: https://docs.docker.com/engine/getstarted/
Porad mi neni jasne, co noveho vlastne Docker prinasi. Cim se lisi od VPS (treba pro OpenVZ, nebo LXC/LXD)?
Taky virtualni stroj si muzu udelat minimalni, vyhazet z neho vse co nepotrebuju. Muzu treba udelat VPS s "Ubuntu-minimal", pridavat jen to co potrebuju treba pro web-server, a vyhazet vse co s tim nesouvisi. Taky pak muzu VPS zbalit, a distribuovat.
Tak jakej je to pak rozdil proti Dockeru? Opravdu nechapu...
Docker nepoužívá virtualizaci ale linuxové kontejnery. Dále umožňuje skládání obrazů nad sebe (máte základní obraz OS, z něj odvodíte dva obrazy – webový server a databázi). A ty obrazy máte poskládané jenom pomocí skriptů, takže když chcete povýšit verzi toho OS vespod, jenom ho povýšíte a znovu spustíte ten skript, který vytváří ty odvozené obrazy.
Podle mne nedává moc smysl srovnávat Docker s virtualizací. Srovnávejte to spíš s distribučními balíčky, které nejsou určené jenom pro instalaci, ale ten software je v balíčku po celou dobu životnosti dané aplikace. Můžete se na to dívat jako na takový deb+chroot na steroidech. Že to ve výsledku konkuruje virtualizaci je dané spíš tím, že se virtualizace používá i tam, kde není potřeba, protože dříve nebylo v linuxu tak triviální provozovat software v kontejnerech.
Vyjmenované technologie jsou ale pokud vím čistě řešení pro kontejnerovou virtualizaci, Docker k tomu přidává infrastrukturu umožňující spravovat a sdílet kontejnery, obrazy a služby běžící v kontejnerech.
Že se řešení používající kontejnerovou virtualizaci označuje také jako VPS je pro mne novinka, a zajímalo by mne, zda se takové označení používá i jinde, než na Wikipedii.
U kazdeho poskytovatele se kontejnery vytvorene v OpenVZ oznacuji jako "VPS". Neni to zadna novinka...
A samozrejme taky OpenVZ (nebo LXD) ma nastroje umoznujici spravovat kontejnery. To co bezi uvnitr je uz veci majitele VPS. Ujistuju ze taky OpenVZ-kontejner se da osekat na absolutni minimum. Defaultne je to spis zjednodusenej system kde bezi par sluzeb, jenze vlastne vse se da vypnout.
Na druhe strane, udrzovani OpenVZ-kontejneru v aktualnim stavu je mnohem jednodussi, protoze si bere balicky z oficialnich repozitoru. U Dockeru (jestli se nepletu) je jeden mezistupen navic, a uzivatel musi cekat az autor Docker-kontejner aktualizuje...
Takže například teď se objevila chyba v GnuPG.
Pokud ji bude(ou) Docker(y) obsahovat, mám je(j) smazat a hledat novější verzi(e), kde to bude opravené?
Znovu nastavovat všechny konfiguráky - to jako každý týden nové instalace - čistý reinstall?
Jak se to řeší v produkci, u několika desítek nebo stovek Dockerů?
Psal jsem, že Docker se nejvíc podobá balíčkovacím systémům na linuxu. Co jste dělal s balíčky, když se objevila chyba v GnuPG? Hledal jste novější verzi balíčku, kde je chyba opravená? Nebo jste prostě počkal, až vyjde aktualizace příslušného balíčku?
Znovu nastavovat všechny konfiguráky - to jako každý týden nové instalace - čistý reinstall?
Ano omylem. Takhle byste postupoval, pokud byste vytvářel nový VPS. S Dockerem máte ty konfiguráky zabalené v obrazu, který používáte, nebo je máte na samostatném souborovém systému, který jenom připojíte ke zvolenému kontejneru. To je právě část té infrastruktury, kterou má Docker navíc oproti čisté kontejnerové virtualizaci.
Jak se to řeší v produkci, u několika desítek nebo stovek Dockerů?
Pokud by se použil Docker na produkci, vyřeší se to triviálně - zkopíruje se tam image, který prošel testováním.
Si snad ze mne delate prde|, ne? Vzdyt to same sem rekl ja!
"...uzivatel musi cekat az autor Docker-kontejner aktualizuje..."
Nejdriv ste mne sjel ze pry:
"...Pokud uživatel čeká, až autor zaktualizuje Docker kontejner, používá Docker divně..."
A ted rikate to same:
"...Neaktulizuje se. Prostě se smaže a místo něj se vytvoří jiný z novějšího obrazu..."
Problém bude v tom, že nevíte, o čem píšete. Docker kontejner je nainstalovaný případně běžící obraz v Docker enginu. V přirovnání k distribučním balíčkům si to můžete představit jako nainstalovaný balíček spolu s jeho konfigurací, případně jako běžící aplikaci z toho balíčku. Aktualizuje vám snad autor balíčku binárky, které máte nainstalované na svém počítači, nebo dokonce běžící aplikaci? Neaktualizuje, autor balíčku vám pouze dá k dispozici nový balíček, a vy si jej můžete do systému nainstalovat. Stejně tak vám autor Docker obrazu dá k dispozici nový obraz, který si vy můžete „nainstalovat“ do svého Dockeru. A nebo – podobně jako u balíčků – bývá k dispozici zdrojový soubor popisující vznik Docker image (Dockerfile), který můžete vzít, zaktualizovat ho na aktuální verzi software a image si vytvořit sám.
Vzdyt sem rikal, ze docker je dalsi mezi-stupen! Kdyz vyjde nova verze treba openssl, nainstaluju si ho do virtualu hned. V pripade Docker "balicku" (kdyz uz to takhle nazyvate) musim pockat, az autor toho "balicku" do nej zahrne novej openssl "balicek" a da mi k dispozici novej Docker "balicek"...
pochop ze docker image stavi na osekanem linuxu, treba debianu, centosu bez vlastniho kernelu, ten ma spolecnej s masinou kde bezi.
Cili musis jen cekat az aktualizace balicku probubla napriklad do repozitaru centosu, na nic jineho cekat nemusis. V docker file mas proste napr jen RUN yum install XY pricemz pri sestavovani docker image se proste zavola yum install XY a nainstaluje se balicek jako by si ho instaloval bez dockeru. Na nic jineho cekat nemusis.
A cim se pak Docker lisi od OpenVZ/VServer/LXC-konterneru, kterej je taky jenom osekanej linux bez vlastniho kernelu? V podstate nicim. Rekl bych, ze jen urovni te "osekanosti".
Jenze to si muzes spravit taky v OpenVZ-kontejneru: osekat jej na minimum, vypnout vsechny sluzby, odinstalovat, az ti tam nezustane prakticky nic. A wo to tady go...
Docker navíc přidává tu výše uváděnou infrastrukturu. Je to stejný rozdíl, jako mezi tím, když si ručně budete kompilovat jádro, knihovny a aplikace a takhle si sestavíte linuxový systém, nebo když použijete už hotovou distribuci. Ta má takové „drobnosti“ jako správce balíčků a repository s balíčky, takže když chcete nainstalovat nějaký software, napíšete akorát apt-get install. Ano, ve výsledku budete mít na disku binárku, kterou si klidně můžete vyrobit sám tak, že si ji a všechny její závislosti zkompilujete ze zdrojáků. Ale s tou infrastrukturou distribuce je to podstatně jednodušší. Stejně je to s Dockerem. Taky si můžete vytvořit OpenVZ kontejner ručně od prázdného kontejneru. Docker vám „jenom“ to vytváření a správu kontejnerů podstatně usnadní.
Nemusíte, upravíte docker file a rebuildnete. Stejné je to s balíčkovacími systémy "linuxu" v tom, že při té aktualizaci se to musí odněkud stáhnout. Tomu se nevyhnete u ničeho, co není na localu a i tam se to musí nějak dostat. Takže stačí aktualizovat tuto vrstvu. Přímo o aktualizaci od autora by se jednalo v případě, že stahujete docker images z docker repo's, nebo podobně. Pokud si docker image vytváříte sám, máte docker files - předpisy pro build - a tak si můžete spustit ~[co chcete]"
Takže neexistuje centralizovaný přístup k aktualizacím Dockerů, jako jsou repozitáře v jednotlivých linuxových distribucích?
Jak se řeší bezpečnost Dockerů, to je stahuju odkudkoliv, jako programy ve Windows?
A na aktualizace čekám, až si jednotliví autoři Dockerů vzpomenou?
Kdo řeší, jestli Dockery už v době vzniku nejsou díky příliš zastaralým nebo právě vydaným programům děravé jako řešeto?
To má každý tvůrce Dockeru firmu s příslušnou infrastrukturou, která řeší opravy chyb zastaralých nebo příliš nových programů?
Docker je určený pro případy, kdybyste si v nějaké distribuci vytvářel vlastní balíčky. Záviset na nějakých veřejných balíčcích můžete a nemusíte. Přičemž u Dockeru mezi těmi veřejnými obrazy máte často i obrazy autorů daného programu, které mohou vznikat přímo v rámci vydání nové verze. Takový obraz bude k dispozici zaktualizovaný dříve, než se balíček dostane do distribucí.
Když vyjde nová verze třeba OpenSSL, nainstaluju si ho do Dockeru hned. Docker není mezistupeň, Docker je alternativa k linuxovým balíčkům. Balíčkovací systémy linuxových distribucí jsou vhodné pro pracovní stanice, kde mám nainstalovanou spoustu softwaru, je tam spousta závislostí a chci vše průběžně automaticky aktualizovat. Na serveru je jiná situace, tam je typicky aplikací jenom pár, a není potřeba řešit závislosti nebo automatické aktualizace, naopak chci, abych měl identické prostředí pro vývoj, pro testování i pro produkci. Některé distribuce tohle řeší pomocí různých LTS verzí, kam se backportují jenom opravy, ale to není úplně ono – stejně tak nedocílíte toho, abyste měl všude identické prostředí. (Navíc si myslím, že backportování oprav je kontraproduktivní, protože pak se na pár LTS instalacích provozuje software, který se neprovozuje nikde jinde – takže celá ta šaráda vede jenom k tomu, že v produkčním prostředí provozujete prakticky netestovaný software.)
To, že se současné Docker image většinou vyrábějí z klasických distribucí, je podle mne pouze dočasný stav. Doufám, že postupem času se ještě oddělí obrazy pro sestavování a obrazy pro běh. Ideální by bylo spojit svět Dockeru a svět Gentoo – měl byste obraz, ve kterém se budou programy buildovat, a sestavený výsledek, který se vám normálně nainstaluje do systému, se místo toho zabalí do Docker image. Takový Docker image by byl skutečně minimální (pro běh webového serveru nepotřebujete mít v systému přítomný správce balíčků, kompilátor atd.), navíc by to umožnilo využít výhodu Gentoo buildů na míru (sestavím si web server přesně s těmi volbami, které potřebuju).
Dnes vám samozřejmě nic nebrání zkompilovat si ten software do Docker image ručně, ale je to práce navíc. Gentoo se svými ebuildy už má tuhle práci hezky zautomatizovanou.
Rozdíl je ten, že Docker to zvládne opravdu s minimem zdrojů. V podstatě jen postahuješ balíčky jako WebServer, DB např. a kdoví co ještě a spustíš - v podstatě opravdu v kontejneru a běží ti to na localu. Můžeš tak mít spuštěné třeba weby na 10 různých verzích/druzích databáze najednou a nemusíš k tomu mít 10 virtuálních strojů. Na virtuálních strojích, ať minimum, tak to stejně potřebuje celý systém, nebo velkou část, trvá start atd. Docker je na to lepší. Zkus si pustit na localu 12 mini-ubuntu . . . Taky se to pak lehce přenese na jinou lokální stanici a už to možná jde líp než dřív, ale mělo by jít celý ten docker vzít a pustit ho tak jak je na produkci - tam to má ale, zatím jsem jen četl, nějakou režii a taky to prej není úplně vychytané. Ale nevím, na nějaké menší weby bych se nebál to nasadit. No a pak, když si mezi sebou při vývoji přehazujete projekty, tak jenom pošleš docker file, stahnou se jen balíčky a během 1s to spustíš a ovládáš. Nebo někomu pošleš docker image a během 1s mu to jede, velikost je jen projekt a ty balíčky, jako DB třeba.
Ale nejsem Dockerista, jen jsem to chvíli používal když bylo potřeba . . . .