{"id":52071,"date":"2020-02-18T05:34:24","date_gmt":"2020-02-18T02:34:24","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy"},"modified":"2020-02-18T05:34:24","modified_gmt":"2020-02-18T02:34:24","slug":"horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy","status":"publish","type":"post","link":"https:\/\/prohoster.info\/cs\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy","title":{"rendered":"D\u016fkladn\u011b p\u0159em\u00fd\u0161lejte, ne\u017e za\u010dnete pou\u017e\u00edvat Docker-in-Docker pro CI nebo testovac\u00ed prost\u0159ed\u00ed.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"D\u016fkladn\u011b p\u0159em\u00fd\u0161lejte, ne\u017e za\u010dnete pou\u017e\u00edvat Docker-in-Docker pro CI nebo testovac\u00ed prost\u0159ed\u00ed.\" src=\"\/wp-content\/uploads\/2020\/02\/50b03664f1984b36e1703717dfaa7ecc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDocker-in-Docker p\u0159edstavuje virtualizovan\u00e9 prost\u0159ed\u00ed Docker d\u00e9monu spu\u0161t\u011bn\u00e9ho uvnit\u0159 samotn\u00e9ho kontejneru pro sestaven\u00ed obraz\u016f kontejner\u016f. Hlavn\u00edm c\u00edlem vytvo\u0159en\u00ed Docker-in-Docker byla pomoc p\u0159i v\u00fdvoji samotn\u00e9ho Dockeru. Mnoho lid\u00ed jej pou\u017e\u00edv\u00e1 k spu\u0161t\u011bn\u00ed Jenkins CI. Zpo\u010d\u00e1tku se to zd\u00e1 norm\u00e1ln\u00ed, ale pak se objev\u00ed probl\u00e9my, kter\u00fdm se lze vyhnout, pokud nainstalujete Docker do kontejneru Jenkins CI. V tomto \u010dl\u00e1nku se dozv\u00edte, jak to ud\u011blat. Pokud v\u00e1s zaj\u00edm\u00e1 kone\u010dn\u00e9 \u0159e\u0161en\u00ed bez podrobnost\u00ed, p\u0159e\u010dt\u011bte si pouze posledn\u00ed \u010d\u00e1st \u010dl\u00e1nku \"\u0158e\u0161en\u00ed probl\u00e9mu\".<\/p>\n<p><img decoding=\"async\" alt=\"D\u016fkladn\u011b p\u0159em\u00fd\u0161lejte, ne\u017e za\u010dnete pou\u017e\u00edvat Docker-in-Docker pro CI nebo testovac\u00ed prost\u0159ed\u00ed.\" src=\"\/wp-content\/uploads\/2020\/02\/0fdafa0c0a1768170cff52333e733314.png\" style=\"display:block;margin: 0 auto;\" \/><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Docker-in-Docker: \"Dobr\u00e9\"<\/h3>\n<p>\nP\u0159ed v\u00edce ne\u017e dv\u011bma lety jsem vlo\u017eil do Dockeru <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/moby\/moby\/commit\/280901e5fbd0c2dabd14d7a9b69a073f6e8f87e4\">p\u0159\u00edznak<\/a><\/noindex> --privileged a napsal <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jpetazzo\/dind\/commit\/bfbe19c0eec634f66c9f8bac53c6b7c7e0fdb063\">prvn\u00ed verzi dind<\/a><\/noindex>. C\u00edlem bylo pomoci hlavn\u00edmu t\u00fdmu vyv\u00edjet Docker rychleji. P\u0159ed vznikem Docker-in-Docker byl typick\u00fd v\u00fdvojov\u00fd cyklus takov\u00fd:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>sestaven\u00ed (build);<\/li>\n<li>zastaven\u00ed spu\u0161t\u011bn\u00e9ho Docker d\u00e9monu;<\/li>\n<li>spu\u0161t\u011bn\u00ed nov\u00e9ho Docker d\u00e9monu;<\/li>\n<li>testov\u00e1n\u00ed;<\/li>\n<li>opakov\u00e1n\u00ed cyklu.<\/li>\n<\/ul>\n<p>\nPokud jste cht\u011bli vytvo\u0159it hezk\u00e9, reprodukovateln\u00e9 sestaven\u00ed (tedy v kontejneru), st\u00e1valo se to slo\u017eit\u011bj\u0161\u00ed:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>ujistit se, \u017ee je spu\u0161t\u011bna funk\u010dn\u00ed verze Docker;<\/li>\n<li>sestavit nov\u00fd Docker se star\u00fdm Dockerem;<\/li>\n<li>zastavit Docker d\u00e9mon;<\/li>\n<li>spu\u0161t\u011bn\u00ed nov\u00e9ho Docker d\u00e9monu;<\/li>\n<li>testov\u00e1n\u00ed;<\/li>\n<li>zastavit nov\u00fd Docker d\u00e9mon;<\/li>\n<li>opakovat.<\/li>\n<\/ul>\n<p>\nS p\u0159\u00edchodem Docker-in-Docker se proces zjednodu\u0161il:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>sestaven\u00ed + spu\u0161t\u011bn\u00ed v jednom kroku;<\/li>\n<li>opakov\u00e1n\u00ed cyklu.<\/li>\n<\/ul>\n<p>\nNen\u00ed to lep\u0161\u00ed?<\/p>\n<p><img decoding=\"async\" alt=\"D\u016fkladn\u011b p\u0159em\u00fd\u0161lejte, ne\u017e za\u010dnete pou\u017e\u00edvat Docker-in-Docker pro CI nebo testovac\u00ed prost\u0159ed\u00ed.\" src=\"\/wp-content\/uploads\/2020\/02\/b4870536068c660a8d996ec53f079504.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Docker-in-Docker: \"\u0160patn\u00e9\"<\/h3>\n<p>\nAle, navzdory b\u011b\u017en\u00fdm n\u00e1zor\u016fm, Docker-in-Docker nen\u00ed z 100% sam\u00e9 hv\u011bzdi\u010dky, pon\u00edci a jednoro\u017eci. M\u00e1m na mysli, \u017ee existuje n\u011bkolik probl\u00e9m\u016f, o kter\u00fdch by v\u00fdvoj\u00e1\u0159 m\u011bl v\u011bd\u011bt.<\/p>\n<p>Jedn\u00edm z probl\u00e9m\u016f jsou LSM (moduly zabezpe\u010den\u00ed Linuxu), jako jsou AppArmor a SELinux: p\u0159i spu\u0161t\u011bn\u00ed kontejneru \u201evnit\u0159n\u00ed Docker\u201c se m\u016f\u017ee pokusit aplikovat bezpe\u010dnostn\u00ed profily, kter\u00e9 budou konfliktn\u00ed nebo zmaten\u00e9 s \u201evn\u011bj\u0161\u00edm Dockerem\u201c. Toto byla nejkomplexn\u011bj\u0161\u00ed ot\u00e1zka, kterou bylo t\u0159eba \u0159e\u0161it p\u0159i snaze integrovat p\u016fvodn\u00ed implementaci p\u0159\u00edznaku \u2013privileged. M\u00e9 zm\u011bny fungovaly a v\u0161echny testy by tak\u00e9 pro\u0161ly na m\u00e9m Debianu a testovac\u00ed virtu\u00e1ln\u00ed plo\u0161e Ubuntu, ale zhroutily by se na stroji Michaela Crosbieho (pokud si pamatuji, m\u011bl Fedora). Nebo si nemohu vzpomenout na p\u0159esn\u00fd d\u016fvod, ale mo\u017en\u00e1 to bylo proto, \u017ee Mike \u2014 moudr\u00fd \u010dlov\u011bk, kter\u00fd pracuje s SELINUX=enforce (j\u00e1 jsem pou\u017eil AppArmor), a m\u00e9 zm\u011bny nezohlednily profily SELinux.<\/p>\n<h3>Docker-in-Docker: \u201eZl\u00fd\u201c<\/h3>\n<p>\nDruh\u00fd probl\u00e9m souvis\u00ed s ovlada\u010di \u00falo\u017ei\u0161t\u011b Dockeru. Kdy\u017e spust\u00edte Docker-in-Docker, vn\u011bj\u0161\u00ed Docker funguje nad b\u011b\u017en\u00fdm souborov\u00fdm syst\u00e9mem (EXT4, BTRFS nebo jak\u00fdmkoliv jin\u00fdm, kter\u00fd m\u00e1te k dispozici), zat\u00edmco vnit\u0159n\u00ed Docker funguje nad syst\u00e9mem copy-on-write (AUFS, BTRFS, Device Mapper atd., v z\u00e1vislosti na tom, co je nastaveno pro pou\u017eit\u00ed vn\u011bj\u0161\u00edm Dockerem). T\u00edm vznikaj\u00ed r\u016fzn\u00e9 kombinace, kter\u00e9 nebudou fungovat. Nap\u0159\u00edklad nem\u016f\u017eete spou\u0161t\u011bt AUFS nad AUFS. <\/p>\n<p>Pokud spust\u00edte BTRFS nad BTRFS, m\u011blo by to ze za\u010d\u00e1tku fungovat, ale jakmile se objev\u00ed vno\u0159en\u00e9 podobjemy, nebude mo\u017en\u00e9 odstranit nad\u0159azen\u00fd podobjem. Modul Device Mapper nem\u00e1 prostory n\u00e1zv\u016f, tak\u017ee pokud n\u011bkolik instanc\u00ed Dockeru pou\u017e\u00edv\u00e1 jeden na stejn\u00e9m stroji, v\u0161echny budou moci vid\u011bt (a ovliv\u0148ovat) obrazy vz\u00e1jemn\u011b a za\u0159\u00edzen\u00ed pro z\u00e1lohov\u00e1n\u00ed kontejner\u016f. To je \u0161patn\u00e9.<\/p>\n<p>Existuj\u00ed obchody k \u0159e\u0161en\u00ed mnoha z t\u011bchto probl\u00e9m\u016f. Nap\u0159\u00edklad pokud chcete pou\u017e\u00edvat AUFS ve vnit\u0159n\u00edm Dockeru, sta\u010d\u00ed p\u0159ev\u00e9st slo\u017eku \/var\/lib\/docker na to a v\u0161echno bude v po\u0159\u00e1dku. Docker p\u0159idal n\u011bkter\u00e9 z\u00e1kladn\u00ed prostory n\u00e1zv\u016f c\u00edlov\u00fdm n\u00e1zv\u016fm Device Mapperu, tak\u017ee pokud bude na jednom stroji prob\u00edhat n\u011bkolik vol\u00e1n\u00ed Dockeru, nebudou si \u201estoupnout\u201c do cesty.<\/p>\n<p>Nicm\u00e9n\u011b, takov\u00e1 konfigurace nen\u00ed v\u016fbec jednoduch\u00e1, jak je mo\u017en\u00e9 vid\u011bt z t\u011bchto <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jpetazzo\/dind\/issues\/78\">\u010dl\u00e1nk\u016f<\/a><\/noindex> v repozit\u00e1\u0159i dind na GitHubu.<\/p>\n<h3>Docker-in-Docker: je to je\u0161t\u011b hor\u0161\u00ed<\/h3>\n<p>\nA co cache sestaven\u00ed? To m\u016f\u017ee b\u00fdt tak\u00e9 docela komplikovan\u00e9. Lid\u00e9 se m\u011b \u010dasto ptaj\u00ed: \u201ekdy\u017e spou\u0161t\u00edm Docker-in-Docker, jak mohu pou\u017e\u00edt obrazy um\u00edst\u011bn\u00e9 na m\u00e9m hostitelsk\u00e9m syst\u00e9mu m\u00edsto toho, abych je znovu stahoval do m\u00e9ho intern\u00edho Dockeru?\u201c<\/p>\n<p>N\u011bkte\u0159\u00ed podnikav\u00ed lid\u00e9 se pokusili p\u0159ipojit \/var\/lib\/docker z hostitele do Docker-in-Docker kontejneru. N\u011bkdy sd\u00edlej\u00ed \/var\/lib\/docker mezi n\u011bkolika kontejnery.<\/p>\n<p><img decoding=\"async\" alt=\"D\u016fkladn\u011b p\u0159em\u00fd\u0161lejte, ne\u017e za\u010dnete pou\u017e\u00edvat Docker-in-Docker pro CI nebo testovac\u00ed prost\u0159ed\u00ed.\" src=\"\/wp-content\/uploads\/2020\/02\/192c9d26798d32078272aab1864bbccb.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Chcete po\u0161kodit data? Proto\u017ee to je p\u0159esn\u011b to, co po\u0161kod\u00ed va\u0161e data!<\/i><\/p>\n<p>Docker d\u00e9mon byl zjevn\u011b navr\u017een tak, aby m\u011bl v\u00fdhradn\u00ed p\u0159\u00edstup k \/var\/lib\/docker. Nic jin\u00e9ho by nem\u011blo \"dot\u00fdkat se, \u0165ukat nebo zkoumat\" jak\u00e9koli soubory Dockeru, nach\u00e1zej\u00edc\u00ed se v t\u00e9to slo\u017ece.<\/p>\n<p>Pro\u010d je to tak? Proto\u017ee to je v\u00fdsledek jedn\u00e9 z nejtvrd\u0161\u00edch lekc\u00ed, kter\u00e9 jsme se nau\u010dili p\u0159i v\u00fdvoji dotCloud. Kontejnerov\u00fd engine dotCloud fungoval s n\u011bkolika procesy, kter\u00e9 sou\u010dasn\u011b p\u0159istupovaly k \/var\/lib\/dotcloud. Chytr\u00e9 triky, jako je atomov\u00e1 v\u00fdm\u011bna soubor\u016f (nam\u00edsto \u00faprav na m\u00edst\u011b), \"p\u00e1lkov\u00e1n\u00ed\" k\u00f3du doporu\u010duj\u00edc\u00edmi a povinn\u00fdmi z\u00e1mky a dal\u0161\u00ed experimenty se zabezpe\u010den\u00fdmi syst\u00e9my, jako je SQLite a BDB, ne v\u017edy fungovaly. Kdy\u017e jsme p\u0159epracov\u00e1vali n\u00e1\u0161 kontejnerov\u00fd engine, kter\u00fd se nakonec stal Dockerem, jedn\u00edm z hlavn\u00edch designov\u00fdch rozhodnut\u00ed bylo seskupit v\u0161echny operace s kontejnery pod jeden d\u00e9mon, aby jsme skoncovali s ve\u0161kerou tou hloupost\u00ed sou\u010dasn\u00e9ho p\u0159\u00edstupu.<\/p>\n<p>Nepochopte m\u011b \u0161patn\u011b: je zcela mo\u017en\u00e9 ud\u011blat n\u011bco dobr\u00e9ho, spolehliv\u00e9ho a rychl\u00e9ho, co zahrnuje n\u011bkolik proces\u016f a modern\u00ed paraleln\u00ed \u0159\u00edzen\u00ed. Ale mysl\u00edme si, \u017ee je jednodu\u0161\u0161\u00ed a snaz\u0161\u00ed ps\u00e1t a udr\u017eovat k\u00f3d, kdy\u017e pou\u017e\u00edv\u00e1me Docker jako jedin\u00e9ho hr\u00e1\u010de.<\/p>\n<p>To znamen\u00e1, \u017ee pokud sd\u00edl\u00edte adres\u00e1\u0159 \/var\/lib\/docker mezi n\u011bkolika instancemi Dockeru, budete m\u00edt probl\u00e9my. Samoz\u0159ejm\u011b, \u017ee to m\u016f\u017ee fungovat, zejm\u00e9na na po\u010d\u00e1tku testov\u00e1n\u00ed. \"Poslouchej, m\u00e1mo, mohu spustit ubuntu p\u0159es Docker!\" Ale zkuste ud\u011blat n\u011bco slo\u017eit\u011bj\u0161\u00edho, nap\u0159\u00edklad vyt\u00e1hnout stejn\u00fd obraz z dvou r\u016fzn\u00fdch instanc\u00ed, a uvid\u00edte, jak sv\u011bt ho\u0159\u00ed.<\/p>\n<p>To znamen\u00e1, \u017ee pokud v\u00e1\u0161 CI syst\u00e9m prov\u00e1d\u00ed sestaven\u00ed a p\u0159estavby, p\u0159i ka\u017ed\u00e9m restartu kontejnmentu Docker-in-Docker riskujete vyresetov\u00e1n\u00ed jeho cache s bombou. To rozhodn\u011b nen\u00ed cool!<\/p>\n<h3>\u0158e\u0161en\u00ed probl\u00e9mu<\/h3>\n<p>\nPoj\u010fme se vr\u00e1tit krok zp\u011bt. Opravdu pot\u0159ebujete Docker-in-Docker, nebo jen chcete m\u00edt mo\u017enost spou\u0161t\u011bt Docker, tedy sestavovat a spou\u0161t\u011bt kontejnery a obr\u00e1zky ze sv\u00e9ho CI syst\u00e9mu, zat\u00edmco tento CI syst\u00e9m je v kontejneru?<\/p>\n<p>Vsad\u00edm se, \u017ee v\u011bt\u0161in\u011b lid\u00ed pot\u0159ebuj\u00ed tu posledn\u00ed variantu, to znamen\u00e1, \u017ee cht\u011bj\u00ed, aby CI syst\u00e9m, jako Jenkins, mohl spou\u0161t\u011bt kontejnery. A nejjednodu\u0161\u0161\u00ed zp\u016fsob, jak toho dos\u00e1hnout, je jednodu\u0161e p\u0159ipojit Docker socket k va\u0161emu CI kontejneru s pomoc\u00ed p\u0159\u00edznaku -v.<\/p>\n<p>Jin\u00fdmi slovy, kdy\u017e spou\u0161t\u00edte sv\u016fj CI kontejner (Jenkins nebo jin\u00fd), m\u00edsto hackov\u00e1n\u00ed n\u011bco s Docker-in-Docker, za\u010dn\u011bte ho t\u00edmto zp\u016fsobem:<\/p>\n<pre><code class=\"plaintext\">docker run -v \/var\/run\/docker.sock:\/var\/run\/docker.sock ...<\/code><\/pre>\n<p>\nNyn\u00ed tento kontejner bude m\u00edt p\u0159\u00edstup k Docker socketu a tud\u00ed\u017e bude moci spou\u0161t\u011bt kontejnery. Akor\u00e1t, \u017ee m\u00edsto spou\u0161t\u011bn\u00ed \"potomn\u00edch\" kontejner\u016f bude spou\u0161t\u011bt \"p\u0159\u00edbuzn\u00e9\" kontejnery.<\/p>\n<p>Zkuste to s ofici\u00e1ln\u00edm obrazem docker (kter\u00fd obsahuje bin\u00e1rn\u00ed soubor Docker):<\/p>\n<pre><code class=\"plaintext\">docker run -v \/var\/run\/docker.sock:\/var\/run\/docker.sock \n           -ti docker<\/code><\/pre>\n<p>\nVypad\u00e1 to a funguje to jako Docker-in-Docker, ale to nen\u00ed Docker-in-Docker: kdy\u017e tento kontejner vytvo\u0159\u00ed dal\u0161\u00ed kontejnery, budou vytvo\u0159eny v nad\u0159azen\u00e9m Dockeru. Nebudete m\u00edt zku\u0161enosti s vedlej\u0161\u00edmi efekty vno\u0159en\u00ed a cache sestaven\u00ed bude sd\u00edleno pro v\u00edce vol\u00e1n\u00ed.<\/p>\n<p>Pozn\u00e1mka: P\u0159edchoz\u00ed verze tohoto \u010dl\u00e1nku doporu\u010dovaly p\u0159ipojit bin\u00e1rn\u00ed soubor Docker z hostitele k kontejneru. To se nyn\u00ed stalo nespolehliv\u00fdm, proto\u017ee mechanismus Dockeru ji\u017e nen\u00ed roz\u0161\u00ed\u0159en na statick\u00e9 nebo t\u00e9m\u011b\u0159 statick\u00e9 knihovny.<\/p>\n<p>Tak\u017ee pokud chcete pou\u017e\u00edvat Docker z Jenkins CI, m\u00e1te 2 mo\u017enosti:<br \/>\ninstalace Docker CLI pomoc\u00ed z\u00e1kladn\u00edho syst\u00e9mu bal\u00ed\u010dk\u016f (t.j. pokud je v\u00e1\u0161 obraz zalo\u017een na Debianu, pou\u017eijte bal\u00ed\u010dky .deb), pou\u017eit\u00ed Docker API.<\/p>\n<h3>Mal\u00e1 reklama \ud83d\ude42<\/h3>\n<p>\nD\u011bkujeme, \u017ee s n\u00e1mi z\u016fst\u00e1v\u00e1te. L\u00edb\u00ed se v\u00e1m na\u0161e \u010dl\u00e1nky? Chcete vid\u011bt v\u00edce zaj\u00edmav\u00fdch materi\u00e1l\u016f? Podpo\u0159te n\u00e1s objedn\u00e1vkou nebo doporu\u010den\u00edm zn\u00e1m\u00fdm, <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">cloudov\u00e9 VPS pro v\u00fdvoj\u00e1\u0159e od 4,99 $<\/a><\/noindex>, <b>unik\u00e1tn\u00ed alternativa entry-level server\u016f, kterou jsme pro v\u00e1s vymysleli:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">V\u0161echny pravdy o VPS (KVM) E5-2697 v3 (6 jader) 10GB DDR4 480GB SSD 1Gbps od 19 $ nebo jak spr\u00e1vn\u011b rozd\u011blit server?<\/a><\/noindex> (k dispozici varianty s RAID1 a RAID10, a\u017e 24 jader a a\u017e 40GB DDR4).<\/p>\n<p><b>Dell R730xd je dvakr\u00e1t levn\u011bj\u0161\u00ed v datov\u00e9m centru Equinix Tier IV v Amsterdamu?<\/b> Jen u n\u00e1s <b><noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/serversnl\">2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TB od 199 $<\/a><\/noindex> v Nizozemsku! <b>Dell R420 \u2014 2x E5-2430 2.2GHz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB \u2014 od 99 $!<\/b><\/b> \u010ct\u011bte o tom <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">Jak postavit infrastrukturu podnikov\u00e9 t\u0159\u00eddy s pou\u017eit\u00edm server\u016f Dell R730xd E5-2650 v4 v hodnot\u011b 9000 eur za pakatel?<\/a><\/noindex><br \/>\n<br \/>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ua-hosting\/blog\/488536\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>Docker-in-Docker \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u0443 Docker-\u0434\u0435\u043c\u043e\u043d, \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u0443\u044e \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0435\u043b\u044c\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Docker-in-Docker \u0431\u044b\u043b\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u0430\u043c\u043e\u0433\u043e Docker. \u041c\u043d\u043e\u0433\u0438\u0435 \u043b\u044e\u0434\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0435\u0433\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 Jenkins CI. \u041f\u043e\u043d\u0430\u0447\u0430\u043b\u0443 \u044d\u0442\u043e \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u043c, \u043d\u043e \u0437\u0430\u0442\u0435\u043c \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0432 Docker \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 Jenkins CI. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043a\u0430\u043a \u044d\u0442\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":52072,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-52071","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\".\" \/>\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\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy\" \/>\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\udd47\u0425\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0439\u0442\u0435, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Docker-in-Docker \u0434\u043b\u044f CI \u0438\u043b\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u044b | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\".\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/cs\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy\" \/>\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=\"2020-02-18T02:34:24+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T02:34:24+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\udd47Dob\u0159e si rozmyslete, ne\u017e pou\u017eijete Docker-in-Docker pro CI nebo testovac\u00ed prost\u0159ed\u00ed | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy","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\udd47\u0425\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0439\u0442\u0435, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Docker-in-Docker \u0434\u043b\u044f CI \u0438\u043b\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u044b | ProHoster","og:description":".","og:url":"https:\/\/prohoster.info\/cs\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy","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":"2020-02-18T02:34:24+00:00","article:modified_time":"2020-02-18T02:34:24+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"52071","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":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:50:23","updated":"2022-09-27 17:46:30","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\/52071","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=52071"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/52071\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/52072"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=52071"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=52071"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=52071"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}