{"id":31641,"date":"2019-10-31T21:42:19","date_gmt":"2019-10-31T18:42:19","guid":{"rendered":"https:\/\/prohoster.info\/blog\/docker-eto-igrushka-ili-net-ili-vsyo-taki-da\/"},"modified":"2019-10-31T21:42:19","modified_gmt":"2019-10-31T18:42:19","slug":"docker-eto-igrushka-ili-net-ili-vsyo-taki-da","status":"publish","type":"post","link":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/docker-eto-igrushka-ili-net-ili-vsyo-taki-da","title":{"rendered":"Je Docker hra\u010dka, nebo ne? Nebo p\u0159ece jen ano?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ahoj v\u0161ichni!<\/p>\n<p><\/p>\n<p>Oooch, opravdu bych cht\u011bl okam\u017eit\u011b za\u010d\u00edt s t\u00e9matem, ale bylo by spr\u00e1vn\u011bj\u0161\u00ed trochu se pod\u011blit o m\u016fj p\u0159\u00edb\u011bh:<\/p>\n<p><\/p>\n<h2>\u00davod<\/h2>\n<p><\/p>\n<p>Jsem program\u00e1tor se zku\u0161enostmi v oblasti v\u00fdvoje frontendov\u00fdch jednoslo\u017ekov\u00fdch aplikac\u00ed, scala\/java a nodejs na serveru. <\/p>\n<p><\/p>\n<p>Dlouho (u\u017e ur\u010dit\u011b p\u00e1r \u2014 t\u0159i roky) jsem m\u011bl n\u00e1zor, \u017ee docker je dar z nebes a v\u016fbec velmi skv\u011bl\u00fd n\u00e1stroj, kter\u00fd by m\u011bl um\u011bt pou\u017e\u00edvat ka\u017ed\u00fd v\u00fdvoj\u00e1\u0159. A z toho vypl\u00fdv\u00e1, \u017ee by m\u011bl m\u00edt docker nainstalovan\u00fd na sv\u00e9 lok\u00e1ln\u00ed stroji. Co se t\u00fd\u010de m\u00e9ho n\u00e1zoru, prohl\u00e9dn\u011bte si inzer\u00e1ty na pracovn\u00edch port\u00e1lech, jako je hh. V ka\u017ed\u00e9 druh\u00e9 je zm\u00ednka o dockeru a pokud ho ovl\u00e1d\u00e1te \u2014 bude to va\u0161\u00ed konkuren\u010dn\u00ed v\u00fdhodou \ud83d\ude09<\/p>\n<p><\/p>\n<p>Na sv\u00e9 cest\u011b jsem se setkal s mnoha lidmi, kte\u0159\u00ed m\u011bli r\u016fzn\u00e9 n\u00e1zory na docker a na jeho ekosyst\u00e9m. N\u011bkte\u0159\u00ed \u0159\u00edkali, \u017ee je to pohodln\u00e1 v\u011bc, kter\u00e1 zaru\u010duje multiplatformnost. Jin\u00ed nech\u00e1pali, pro\u010d by se m\u011bli spou\u0161t\u011bt v kontejnerech a jak\u00e1 v\u00fdhoda z toho vypl\u00fdv\u00e1, t\u0159et\u00edm to bylo \u00fapln\u011b jedno a jen psali k\u00f3d a odch\u00e1zeli dom\u016f \u2014 mimochodem, z\u00e1vid\u00edm jim \ud83d\ude42<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>D\u016fvody pou\u017eit\u00ed<\/h2>\n<p><\/p>\n<p>Pro\u010d jsem pou\u017e\u00edval docker? Mo\u017en\u00e1 z n\u00e1sleduj\u00edc\u00edch d\u016fvod\u016f:<\/p>\n<p><\/p>\n<ul>\n<li>spou\u0161t\u011bn\u00ed datab\u00e1z\u00ed, 99 % aplikac\u00ed je pou\u017e\u00edv\u00e1<\/li>\n<li>spou\u0161t\u011bn\u00ed nginx pro poskytov\u00e1n\u00ed frontend a pro proxy na backend<\/li>\n<li>mohu zabalit aplikaci do docker obrazu, t\u00edm p\u00e1dem moje aplikace pob\u011b\u017e\u00ed v\u0161ude, kde je docker, probl\u00e9m distribuce je okam\u017eit\u011b vy\u0159e\u0161en<\/li>\n<li>service discovery out of the box, lze tvo\u0159it mikroslu\u017eby, ka\u017ed\u00fd kontejner (p\u0159ipojen\u00fd k sd\u00edlen\u00e9 s\u00edti) se snadno dostane k jin\u00e9mu podle aliasu, velmi pohodln\u00e9<\/li>\n<li>Je zaj\u00edmav\u00e9 vytvo\u0159it kontejner a \u201ehr\u00e1t si\u201c v n\u011bm.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Co se mi na dockeru v\u017edy NEL\u00cdBILO:<\/h2>\n<p><\/p>\n<ul>\n<li>aby moje aplikace fungovala, pot\u0159ebuj\u00ed samotn\u00fd docker na serveru. A pro\u010d bych to pot\u0159eboval, kdy\u017e moje aplikace b\u011b\u017e\u00ed na jre nebo nodejs a prost\u0159ed\u00ed pro n\u011b u\u017e na serveru existuje?<\/li>\n<li>pokud chci spustit sv\u016fj (priv\u00e1tn\u00ed) lok\u00e1ln\u011b sestaven\u00fd obraz na vzd\u00e1len\u00e9m serveru, pot\u0159ebuji sv\u016fj docker repozit\u00e1\u0159, pot\u0159ebuju, aby n\u011bkde b\u011b\u017eel registry, a tak\u00e9 je pot\u0159eba nastavit https, proto\u017ee docker cli funguje pouze p\u0159es https. Sakra\u2026 existuj\u00ed samoz\u0159ejm\u011b varianty, jak ulo\u017eit obraz lok\u00e1ln\u011b p\u0159es <code>docker save<\/code> A pomoc\u00ed scp jednodu\u0161e p\u0159en\u00e9st obraz... Ale to je tolik pohyb\u016f. A nav\u00edc to vypad\u00e1 jako \u201eob\u0161truk\u010dn\u00ed\u201c \u0159e\u0161en\u00ed, dokud se neobjev\u00ed vlastn\u00ed repozit\u00e1\u0159.<\/li>\n<li><code>docker-compose<\/code>Je pot\u0159ebn\u00fd pouze pro spu\u0161t\u011bn\u00ed kontejner\u016f. A to je v\u0161e. Nic v\u00edc nezvl\u00e1dne. <code>Docker-compose<\/code> m\u00e1 spoustu verz\u00ed sv\u00fdch soubor\u016f, sv\u016fj syntaktick\u00fd styl. A\u0165 je deklarativn\u00ed, jak chce, nechci \u010d\u00edst jejich dokumentaci. Nebude mi u\u017e nikde jinde pot\u0159ebn\u00e1.<\/li>\n<li>p\u0159i pr\u00e1ci v t\u00fdmu v\u011bt\u0161ina lid\u00ed p\u00ed\u0161e Dockerfile velmi ne\u0161ikovn\u011b, nech\u00e1pou, jak to je s ke\u0161ov\u00e1n\u00edm, p\u0159id\u00e1vaj\u00ed do obrazu v\u0161e, co by nem\u011bli, odvozuj\u00ed se od obraz\u016f, kter\u00e9 nejsou na dockerhub nebo v priv\u00e1tn\u00edm repozit\u00e1\u0159i, vytv\u00e1\u0159ej\u00ed n\u011bjak\u00e9 <code>docker-compose<\/code> Soubory s datab\u00e1zemi a nic se neperzistuje. P\u0159itom v\u00fdvoj\u00e1\u0159i hrd\u011b prohla\u0161uj\u00ed, \u017ee Docker je skv\u011bl\u00fd, v\u0161echno jim funguje lok\u00e1ln\u011b a HR d\u016fle\u017eit\u011b p\u00ed\u0161e v inzer\u00e1tech: \u201ePou\u017e\u00edv\u00e1me Docker a hled\u00e1me kandid\u00e1ta s takov\u00fdmi zku\u0161enostmi.\u201c<\/li>\n<li>neust\u00e1le m\u011b pron\u00e1sleduj\u00ed my\u0161lenky na to, jak spustit v dockeru v\u0161echno: postgresql, kafka, redis. Je \u0161koda, \u017ee ne v\u0161echno funguje v kontejnerech, ne v\u0161echno se snadno konfiguruje a spou\u0161t\u00ed. To podporuj\u00ed extern\u00ed v\u00fdvoj\u00e1\u0159i, ne samotn\u00ed dodavatel\u00e9. A mimochodem hned vznik\u00e1 ot\u00e1zka, dodavatel\u00e9 se nezab\u00fdvaj\u00ed udr\u017eov\u00e1n\u00edm sv\u00fdch produkt\u016f v dockeru, pro\u010d to asi je, mo\u017en\u00e1 n\u011bco v\u011bd\u00ed?<\/li>\n<li>v\u017edy vyvst\u00e1v\u00e1 ot\u00e1zka o perzistenci dat kontejneru. A tady p\u0159em\u00fd\u0161l\u00edm, m\u00e1m prost\u011b p\u0159imontovat hostitelsk\u00fd adres\u00e1\u0159 nebo vytvo\u0159it docker volume nebo ud\u011blat data kontejner, kter\u00fd nyn\u00ed <code>deprecated<\/code>? \u0415\u0441\u043b\u0438 \u044f \u043c\u043e\u043d\u0442\u0438\u0440\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0442\u043e \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0447\u0442\u043e uid \u0438 gid \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 id \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0432\u0448\u0435\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u0438\u043d\u0430\u0447\u0435 \u0444\u0430\u0439\u043b\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0441 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430 root. \u0415\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e <code>volume<\/code> data budou vytvo\u0159ena v n\u011bjak\u00e9m <code>\/usr\/*<\/code> A bude to stejn\u00fd p\u0159\u00edb\u011bh s uid a gid jako v prvn\u00edm p\u0159\u00edpad\u011b. Kdy\u017e spou\u0161t\u00edte extern\u00ed komponent, mus\u00edte se pono\u0159it do dokumentace a hledat odpov\u011b\u010f na ot\u00e1zku: \u201eDo jak\u00fdch adres\u00e1\u0159\u016f kontejneru komponent zapisuje soubory?\u2018<\/li>\n<\/ul>\n<p>V\u017edy se mi nel\u00edbilo, \u017ee mus\u00edm s dockerem tr\u00e1vit p\u0159\u00edli\u0161 mnoho \u010dasu <strong>v po\u010d\u00e1te\u010dn\u00ed f\u00e1zi<\/strong>: vym\u00fd\u0161lel jsem, jak spou\u0161t\u011bt kontejnery, z jak\u00fdch obraz\u016f spou\u0161t\u011bt, d\u011blal jsem Makefile, kter\u00e9 obsahovaly aliasy pro dlouh\u00e9 docker p\u0159\u00edkazy. Nesn\u00e1\u0161el jsem docker-compose, proto\u017ee jsem necht\u011bl u\u010dit dal\u0161\u00ed n\u00e1stroj ekosyst\u00e9mu docker. A <code>docker-compose up<\/code> bylo to pro m\u011b stresuj\u00edc\u00ed, zejm\u00e9na pokud se tam objevily <code>build<\/code> konfigura\u010dn\u00ed p\u0159\u00edkazy a ne ji\u017e sestaven\u00e9 obrazy. V\u0161echno, co jsem opravdu cht\u011bl \u2014 bylo prost\u011b efektivn\u011b a rychle vytv\u00e1\u0159et produkt. Ale nemohl jsem uhladit pou\u017e\u00edv\u00e1n\u00ed dockeru.<\/p>\n<p><\/p>\n<h2>Sezn\u00e1men\u00ed s Ansible<\/h2>\n<p><\/p>\n<p>Ned\u00e1vno (p\u0159ed t\u0159emi m\u011bs\u00edci) jsem pracoval s DevOps t\u00fdmem, t\u00e9m\u011b\u0159 ka\u017ed\u00fd \u00fa\u010dastn\u00edk m\u011bl negativn\u00ed n\u00e1zor na docker z t\u011bchto d\u016fvod\u016f:<\/p>\n<p><\/p>\n<ul>\n<li>docker ovl\u00e1d\u00e1 iptables (i kdy\u017e to lze v daemon.json vypnout)<\/li>\n<li>Docker nen\u00ed nezbytn\u00fd a nebudeme ho spou\u0161t\u011bt v produkci.<\/li>\n<li>Pokud dojde k p\u00e1du docker daemonu, spadnou i v\u0161echny kontejnery s infrastrukturou.<\/li>\n<li>V dockeru nen\u00ed pot\u0159eba.<\/li>\n<li>Pro\u010d docker, kdy\u017e m\u00e1me Ansible a virtu\u00e1ln\u00ed stroje?<\/li>\n<\/ul>\n<p><\/p>\n<p>Na t\u00e9 sam\u00e9 pr\u00e1ci jsem se setkal s dal\u0161\u00edm n\u00e1strojem \u2014 Ansible. Kdysi jsem o n\u011bm sly\u0161el, ale nikdy jsem nezkou\u0161el ps\u00e1t sv\u00e9 playbooky. A te\u010f jsem za\u010dal ps\u00e1t sv\u00e9 \u00fakoly a moje vn\u00edm\u00e1n\u00ed se kompletn\u011b zm\u011bnilo! Poznal jsem, \u017ee Ansible m\u00e1 moduly pro spou\u0161t\u011bn\u00ed stejn\u00fdch docker kontejner\u016f, sestaven\u00ed obraz\u016f, s\u00edt\u00ed atd., a kontejnery lze spou\u0161t\u011bt nejen lok\u00e1ln\u011b, ale i na vzd\u00e1len\u00fdch serverech! M\u00e9mu nad\u0161en\u00ed nebylo konce \u2014 na\u0161el jsem NORM\u00c1LN\u00cd n\u00e1stroj a vyhodil sv\u00e9 Makefile a docker-compose soubory, kter\u00e9 byly nahrazeny yaml \u00fakoly. K\u00f3d byl zmen\u0161en d\u00edky pou\u017eit\u00ed konstrukc\u00ed typu <code>loop<\/code>, <code>when<\/code>, atd.<\/p>\n<p><\/p>\n<h2>Docker pro spou\u0161t\u011bn\u00ed extern\u00edch komponent\u016f, jako je datab\u00e1ze.<\/h2>\n<p><\/p>\n<p>Ned\u00e1vno jsem se sezn\u00e1mil s SSH tunely. Uk\u00e1zalo se, \u017ee je velmi snadn\u00e9 \u201ep\u0159en\u00e9st\u201c port vzd\u00e1len\u00e9ho serveru na lok\u00e1ln\u00ed port. Vzd\u00e1len\u00fd server m\u016f\u017ee b\u00fdt jak stroj v cloudu, tak virtu\u00e1ln\u00ed stroj spu\u0161t\u011bn\u00fd ve VirtualBoxu. Pokud j\u00e1 nebo m\u016fj kolega pot\u0159ebujeme datab\u00e1zi (nebo n\u011bjakou jinou extern\u00ed komponentu), m\u016f\u017eeme jednodu\u0161e spustit server s touto komponentou a vypnout ho, kdy\u017e server ji\u017e nen\u00ed pot\u0159eba. P\u0159esm\u011brov\u00e1n\u00ed port\u016f d\u00e1v\u00e1 stejn\u00fd efekt jako datab\u00e1ze b\u011b\u017e\u00edc\u00ed v Docker kontejneru.<\/p>\n<p><\/p>\n<p>Tento p\u0159\u00edkaz p\u0159esm\u011brov\u00e1v\u00e1 m\u016fj lok\u00e1ln\u00ed port na vzd\u00e1len\u00fd server s postgresql:<\/p>\n<p><\/p>\n<blockquote><p>ssh -L 9000:localhost:5432 user@example.com<\/p><\/blockquote>\n<p>Pou\u017eit\u00ed vzd\u00e1len\u00e9ho serveru \u0159e\u0161\u00ed probl\u00e9m s v\u00fdvojem v t\u00fdmu. Tento server mohou sou\u010dasn\u011b vyu\u017e\u00edvat n\u011bkolik v\u00fdvoj\u00e1\u0159\u016f, nemus\u00ed zn\u00e1t nastavov\u00e1n\u00ed postgresql, rozum\u011bt dockeru a dal\u0161\u00edm slo\u017eitostem. Na vzd\u00e1len\u00e9m serveru lze nainstalovat stejnou datab\u00e1zi p\u0159\u00edmo v dockeru, pokud je obt\u00ed\u017en\u00e9 nainstalovat specifickou verzi. V\u0161echno, co v\u00fdvoj\u00e1\u0159i budou pot\u0159ebovat, je poskytnout ssh p\u0159\u00edstup!<\/p>\n<p><\/p>\n<p>Ned\u00e1vno jsem \u010detl, \u017ee SSH tunely jsou omezen\u00e1 funk\u010dnost oby\u010dejn\u00e9ho VPN! M\u016f\u017eete jednodu\u0161e nastavit OpenVPN nebo jin\u00e9 implementace VPN, nastavit infrastrukturu a poskytnout ji v\u00fdvoj\u00e1\u0159\u016fm. To je p\u0159ece \u00fa\u017easn\u00e9!<\/p>\n<p><\/p>\n<p>Na\u0161t\u011bst\u00ed AWS, GoogleCloud a dal\u0161\u00ed poskytuj\u00ed rok bezplatn\u00e9ho pou\u017e\u00edv\u00e1n\u00ed, tak je vyu\u017eijte! Jsou velmi levn\u00e9, pokud je vyp\u00edn\u00e1te, kdy\u017e nejsou pot\u0159eba. V\u017edy jsem p\u0159em\u00fd\u0161lel, k \u010demu bych pot\u0159eboval vzd\u00e1len\u00fd server typu gcloud, a zd\u00e1 se, \u017ee jsem na\u0161el odpov\u011b\u010f.<\/p>\n<p><\/p>\n<p>Jako virtu\u00e1ln\u00ed stroj na m\u00edstn\u00edm prost\u0159ed\u00ed lze pou\u017e\u00edt stejn\u00fd Alpine, kter\u00fd se aktivn\u011b pou\u017e\u00edv\u00e1 v kontejnerech Docker. Nebo n\u011bjak\u00e9 jin\u00e9 odleh\u010den\u00e9 distribuce, aby se stroj rychleji spou\u0161t\u011bl.<\/p>\n<p><\/p>\n<p>V\u00fdsledek: datab\u00e1ze a dal\u0161\u00ed infrastrukturn\u00ed prvky lze a m\u011bly by b\u011b\u017eet na vzd\u00e1len\u00fdch serverech nebo ve VirtualBoxu. Na tyto \u00fa\u010dely nepot\u0159ebuji Docker.<\/p>\n<p><\/p>\n<h2>N\u011bco m\u00e1lo o obrazech Docker a distribuci<\/h2>\n<p><\/p>\n<p>Ji\u017e jsem psal <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/443136\/\">\u010dl\u00e1nek<\/a><\/noindex> o tom, \u017ee pou\u017e\u00edv\u00e1n\u00ed obraz\u016f Docker nenab\u00edz\u00ed \u017e\u00e1dnou z\u00e1ruku. Obrazy Docker jsou pot\u0159eba pouze k vytvo\u0159en\u00ed kontejneru Docker. Pokud se spol\u00e9h\u00e1te na obraz Docker, znamen\u00e1 to, \u017ee se spol\u00e9h\u00e1te na pou\u017e\u00edv\u00e1n\u00ed kontejner\u016f Docker a budete s nimi jen pokra\u010dovat.<\/p>\n<p><\/p>\n<p>Vid\u011bli jste n\u011bkde, \u017ee by v\u00fdvoj\u00e1\u0159i softwaru portovali sv\u00e9 produkty pouze do obrazu Docker?<br \/>\nV\u00fdsledkem v\u011bt\u0161iny produkt\u016f jsou bin\u00e1rn\u00ed soubory pro konkr\u00e9tn\u00ed platformu, kter\u00e9 se jednodu\u0161e p\u0159id\u00e1vaj\u00ed do obrazu Docker, jen\u017e d\u011bd\u00ed od pot\u0159ebn\u00e9 platformy. Nep\u0159em\u00fd\u0161leli jste, pro\u010d je v DockerHubu tolik podobn\u00fdch obraz\u016f? Zadejte nap\u0159\u00edklad nginx, uvid\u00edte 100500 obraz\u016f od r\u016fzn\u00fdch lid\u00ed. Tito lid\u00e9 nevyv\u00edjeli samotn\u00fd nginx, jen do sv\u00e9ho obrazu Docker p\u0159idali ofici\u00e1ln\u00ed nginx a doplnili sv\u00fdmi konfiguracemi pro usnadn\u011bn\u00ed spou\u0161t\u011bn\u00ed kontejner\u016f. <\/p>\n<p><\/p>\n<p>Celkov\u011b lze uchov\u00e1vat jednodu\u0161e v tgz, pokud n\u011bkdo pot\u0159ebuje spou\u0161t\u011bt to v Dockeru, m\u016f\u017ee do Dockerfile p\u0159idat tgz, d\u011bdit od pot\u0159ebn\u00e9ho prost\u0159ed\u00ed a vytv\u00e1\u0159et dal\u0161\u00ed funkce, kter\u00e9 nem\u011bn\u00ed samotnou aplikaci v tgz. Ten, kdo bude vytv\u00e1\u0159et obraz Docker, bude v\u011bd\u011bt, co to tgz je a co pot\u0159ebuje k pr\u00e1ci. Takto j\u00e1 pou\u017e\u00edv\u00e1m Docker. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kondaurovDev\/dockerfile\">tady<\/a><\/noindex><\/p>\n<p><\/p>\n<p>V\u00fdsledek: nepot\u0159ebuji registry Docker, vyu\u017eiji n\u011bjak\u00e9 S3 nebo jen \u00falo\u017en\u00e9 m\u00edsto jako Google Drive\/Dropbox.<\/p>\n<p><\/p>\n<h2>Docker v CI<\/h2>\n<p><\/p>\n<p>V\u0161echny firmy, ve kter\u00fdch jsem pracoval, jsou si podobn\u00e9. Obvykle se jedn\u00e1 o produktov\u00e9 firmy. To znamen\u00e1, \u017ee maj\u00ed n\u011bjakou aplikaci, jeden technologick\u00fd stack (mo\u017en\u00e1 p\u00e1r \u2013 t\u0159i programovac\u00ed jazyky).<\/p>\n<p><\/p>\n<p>Tyto spole\u010dnosti pou\u017e\u00edvaj\u00ed docker na sv\u00fdch serverech, kde prob\u00edh\u00e1 proces CI. Ot\u00e1zka zn\u00ed - pro\u010d sestavovat projekty v docker kontejneru na sv\u00fdch serverech? Pro\u010d prost\u011b nep\u0159ipravit prost\u0159ed\u00ed pro sestaven\u00ed, nap\u0159\u00edklad napsat Ansible playbook, kter\u00fd nainstaluje pot\u0159ebn\u00e9 verze nodejs, php, jdk, zkop\u00edruje ssh kl\u00ed\u010de atd. na server, kde prob\u00edh\u00e1 sestaven\u00ed? <\/p>\n<p><\/p>\n<p>Nyn\u00ed si uv\u011bdomuji, \u017ee to je st\u0159elba do vlastn\u00edch nohou, proto\u017ee docker nep\u0159in\u00e1\u0161\u00ed \u017e\u00e1dn\u00fd prosp\u011bch ze sv\u00e9 izolace. Probl\u00e9my s CI v dockeru, se kter\u00fdmi jsem se setkal:<\/p>\n<p><\/p>\n<ul>\n<li>op\u011bt je pot\u0159eba docker image pro sestaven\u00ed. Je t\u0159eba hledat image nebo napsat vlastn\u00ed dockerfile.<\/li>\n<li>90 % \u0161ance, \u017ee je pot\u0159eba propustit n\u011bjak\u00e9 ssh kl\u00ed\u010de, tajn\u00e9 \u00fadaje, kter\u00e9 se nechce ps\u00e1t do docker image.<\/li>\n<li>kontejner se vytv\u00e1\u0159\u00ed a um\u00edr\u00e1, v\u0161echny mezipam\u011bti se s n\u00edm ztr\u00e1cej\u00ed. P\u0159\u00ed\u0161t\u00ed sestaven\u00ed bude muset znovu stahovat v\u0161echny z\u00e1vislosti projektu, co\u017e je dlouh\u00e9 a neefektivn\u00ed, a \u010das jsou pen\u00edze.<\/li>\n<\/ul>\n<p><\/p>\n<p>V\u00fdvoj\u00e1\u0159i nesestavuj\u00ed projekty v docker kontejnerech (n\u011bkdy jsem byl tak\u00e9 takov\u00fdm fanou\u0161kem, \u0161koda m\u011b v minulosti xD). V jave je mo\u017enost m\u00edt v\u00edce verz\u00ed a zm\u011bnit je jedn\u00edm p\u0159\u00edkazem na tu, kter\u00e1 je nyn\u00ed pot\u0159eba. V nodejs je to stejn\u00e9, je zde nvm.<\/p>\n<p><\/p>\n<h2>V\u00fdstup<\/h2>\n<p><\/p>\n<p>Pova\u017euji, \u017ee Docker je velmi mocn\u00fd a flexibiln\u00ed n\u00e1stroj, co\u017e je na n\u011bm jeho nedostatek (zn\u00ed to divn\u011b, \u017ee?). D\u00edky n\u011bmu se spole\u010dnosti snadno \u201est\u00e1vaj\u00ed z\u00e1visl\u00fdmi\u201c na n\u011bm, pou\u017e\u00edvaj\u00ed ho tam, kde je to t\u0159eba, a kde to nen\u00ed. V\u00fdvoj\u00e1\u0159i spou\u0161t\u011bj\u00ed sv\u00e9 kontejnery, n\u011bjak\u00e9 sv\u00e9 prost\u0159ed\u00ed, a pak to v\u0161echno pomalu p\u0159ech\u00e1z\u00ed do CI a produkce. T\u00fdm DevOps p\u00ed\u0161e n\u011bjak\u00e9 fr\u00e1ze, aby spustil tyto kontejnery.<\/p>\n<p><\/p>\n<p>Pou\u017e\u00edvejte docker pouze na <strong>posledn\u00edm<\/strong> stupni ve va\u0161em pracovn\u00edm procesu, netahejte ho do projektu na za\u010d\u00e1tku. Nevy\u0159e\u0161\u00ed va\u0161e obchodn\u00ed probl\u00e9my. Jen p\u0159esm\u011bruje probl\u00e9my na JINOU \u00farove\u0148 a navrhne sv\u00e1 \u0159e\u0161en\u00ed, budete vykon\u00e1vat dvojitou pr\u00e1ci.<\/p>\n<p><\/p>\n<p><strong><em>Kdy je docker pot\u0159eba<\/em><\/strong>: do\u0161el jsem k my\u0161lence, \u017ee docker je velmi dobr\u00fd v optimalizaci stanoven\u00e9ho procesu, ale ne p\u0159i budov\u00e1n\u00ed z\u00e1kladn\u00ed funkcionality.<\/p>\n<p><\/p>\n<p>Pokud se p\u0159esto rozhodnete pou\u017eit docker, pak:<\/p>\n<p><\/p>\n<ul>\n<li>bu\u010fte extr\u00e9mn\u011b opatrn\u00ed<\/li>\n<li>nenu\u0165te v\u00fdvoj\u00e1\u0159e pou\u017e\u00edvat docker<\/li>\n<li>lokalizujte jeho pou\u017eit\u00ed na jednom m\u00edst\u011b, neroz\u0161i\u0159ujte ho na v\u0161echny repozit\u00e1\u0159e Dockefile a docker-compose.<\/li>\n<\/ul>\n<p><\/p>\n<p>PS:<\/p>\n<p><\/p>\n<ul>\n<li>Ned\u00e1vno jsem narazil na <noindex><a rel=\"nofollow\" href=\"https:\/\/www.packer.io\/\">packer<\/a><\/noindex> A \u0159\u00edkaj\u00ed, \u017ee velmi dob\u0159e pracuje s Ansible a umo\u017e\u0148uje unifikovat proces vytv\u00e1\u0159en\u00ed obraz\u016f (v\u010detn\u011b docker image).<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/www.smashcompany.com\/technology\/docker-is-a-dangerous-gamble-which-we-will-regret\">Tak\u00e9 o dockeru, zaj\u00edmav\u00fd \u010dl\u00e1nek.<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<p>D\u011bkujeme, \u017ee jste do\u010detli, p\u0159eji v\u00e1m pr\u016fhledn\u00e1 \u0159e\u0161en\u00ed ve va\u0161ich z\u00e1le\u017eitostech a produktivn\u00ed pracovn\u00ed dny!<\/p>\n<p>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/445914\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041e\u043e\u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u0440\u044f\u043c \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u0442\u0435\u043c\u0435, \u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u043c\u043e\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e: \u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u042f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0441 \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 frontend \u043e\u0434\u043d\u043e\u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, scala\/java \u0438 nodejs \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u0414\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0433\u043e (\u0443\u0436\u0435 \u0442\u043e\u0447\u043d\u043e \u043f\u0430\u0440\u0443 \u2014 \u0442\u0440\u043e\u0439\u043a\u0443 \u043b\u0435\u0442), \u044f \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b\u0441\u044f \u043c\u043d\u0435\u043d\u0438\u044f, \u0447\u0442\u043e docker \u044d\u0442\u043e \u043c\u0430\u043d\u043d\u0430 \u043d\u0435\u0431\u0435\u0441\u043d\u0430\u044f \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0443\u0442\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0438 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-31641","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041e\u043e\u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u0440\u044f\u043c \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u0442\u0435\u043c\u0435, \u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u043c\u043e\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e: \u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u042f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0441 \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 frontend.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/docker-eto-igrushka-ili-net-ili-vsyo-taki-da\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Docker \u2014 \u044d\u0442\u043e \u0438\u0433\u0440\u0443\u0448\u043a\u0430 \u0438\u043b\u0438 \u043d\u0435\u0442? \u0418\u043b\u0438 \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u0434\u0430? | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041e\u043e\u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u0440\u044f\u043c \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u0442\u0435\u043c\u0435, \u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u043c\u043e\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e: \u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u042f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0441 \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 frontend.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/docker-eto-igrushka-ili-net-ili-vsyo-taki-da\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:42:19+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:42:19+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Docker \u2014 je to hra\u010dka nebo ne? Nebo p\u0159ece jen ano? | ProHoster","description":"V\u0161em ahoj! Opravdu bych hned cht\u011bl p\u0159ej\u00edt k t\u00e9matu, ale bude lep\u0161\u00ed nejprve trochu \u0159\u00edct o m\u00e9m p\u0159\u00edb\u011bhu: \u00davod Jsem program\u00e1tor s zku\u0161enostmi v oblasti v\u00fdvoje frontend.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/docker-eto-igrushka-ili-net-ili-vsyo-taki-da","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Docker \u2014 \u044d\u0442\u043e \u0438\u0433\u0440\u0443\u0448\u043a\u0430 \u0438\u043b\u0438 \u043d\u0435\u0442? \u0418\u043b\u0438 \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u0434\u0430? | ProHoster","og:description":"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041e\u043e\u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u0440\u044f\u043c \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u0442\u0435\u043c\u0435, \u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u043c\u043e\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e: \u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u042f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0441 \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 frontend.","og:url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/docker-eto-igrushka-ili-net-ili-vsyo-taki-da","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:42:19+00:00","article:modified_time":"2019-10-31T18:42:19+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"31641","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 07:08:22","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:13:28","updated":"2026-01-21 07:08:22","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/31641","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=31641"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/31641\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=31641"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=31641"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=31641"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}