{"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\/ro\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy","title":{"rendered":"G\u00e2ndi\u021bi-v\u0103 bine \u00eenainte de a folosi Docker-in-Docker pentru CI sau un mediu de testare","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"G\u00e2ndi\u021bi-v\u0103 bine \u00eenainte de a folosi Docker-in-Docker pentru CI sau un mediu de testare\" src=\"\/wp-content\/uploads\/2020\/02\/50b03664f1984b36e1703717dfaa7ecc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDocker-in-Docker este un mediu virtualizat Docker daemon, care ruleaz\u0103 \u00een containerul \u00eensu\u0219i pentru a construi imagini de container. Scopul principal al cre\u0103rii Docker-in-Docker a fost s\u0103 ajute la dezvoltarea Docker-ului \u00eensu\u0219i. Multe persoane \u00eel folosesc pentru a rula Jenkins CI. La \u00eenceput, pare normal, dar apoi apar probleme care pot fi evitate instal\u00e2nd Docker \u00een containerul Jenkins CI. Acest articol explic\u0103 cum s\u0103 face\u021bi acest lucru. Dac\u0103 sunte\u021bi interesat de solu\u021bia final\u0103 f\u0103r\u0103 detalii, citi\u021bi pur \u0219i simplu ultima sec\u021biune a articolului \u201eSolu\u021bia problemei\u201d.<\/p>\n<p><img decoding=\"async\" alt=\"G\u00e2ndi\u021bi-v\u0103 bine \u00eenainte de a folosi Docker-in-Docker pentru CI sau un mediu de testare\" 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: \u201eBun\u201d<\/h3>\n<p>\nAcum mai bine de doi ani am introdus Docker <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/moby\/moby\/commit\/280901e5fbd0c2dabd14d7a9b69a073f6e8f87e4\">steag<\/a><\/noindex> \u2013privileged \u0219i am scris <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jpetazzo\/dind\/commit\/bfbe19c0eec634f66c9f8bac53c6b7c7e0fdb063\">prima versiune dind<\/a><\/noindex>. Scopul era s\u0103 ajut echipa de baz\u0103 s\u0103 dezvolte Docker mai repede. \u00cenainte de Docker-in-Docker, ciclul tipic de dezvoltare era urm\u0103torul:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>construire (build);<\/li>\n<li>oprirea daemonului Docker \u00een execu\u021bie;<\/li>\n<li>pornirea unui nou daemon Docker;<\/li>\n<li>testare;<\/li>\n<li>repeta\u021bi ciclul.<\/li>\n<\/ul>\n<p>\nDac\u0103 dori\u021bi s\u0103 realiza\u021bi o construc\u021bie frumoas\u0103 \u0219i reproducibil\u0103 (adic\u0103 \u00een container), devenea mai complicat:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>verificarea faptului c\u0103 o versiune func\u021bional\u0103 Docker este pornit\u0103;<\/li>\n<li>construirea unui nou Docker cu vechiul Docker;<\/li>\n<li>oprirea daemonului Docker;<\/li>\n<li>pornirea unui nou daemon Docker;<\/li>\n<li>testare;<\/li>\n<li>oprirea noului daemon Docker;<\/li>\n<li>repeta\u021bi.<\/li>\n<\/ul>\n<p>\nOdat\u0103 cu apari\u021bia Docker-in-Docker, procesul s-a simplificat:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>construire + pornire \u00eentr-o singur\u0103 etap\u0103;<\/li>\n<li>repeta\u021bi ciclul.<\/li>\n<\/ul>\n<p>\nNu-i a\u0219a c\u0103 este mult mai bine a\u0219a?<\/p>\n<p><img decoding=\"async\" alt=\"G\u00e2ndi\u021bi-v\u0103 bine \u00eenainte de a folosi Docker-in-Docker pentru CI sau un mediu de testare\" src=\"\/wp-content\/uploads\/2020\/02\/b4870536068c660a8d996ec53f079504.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Docker-in-Docker: \u201eR\u0103u\u201d<\/h3>\n<p>\nTotu\u0219i, contrar opiniei populare, Docker-in-Docker nu este 100% din stele, ponei \u0219i unicorni. Cu alte cuvinte, exist\u0103 c\u00e2teva probleme de care trebuie s\u0103 fie con\u0219tient dezvoltatorul.<\/p>\n<p>Una dintre ele se refer\u0103 la LSM (modul de securitate Linux), cum ar fi AppArmor \u0219i SELinux: atunci c\u00e2nd porne\u0219ti un container, \u201eDocker intern\u201d poate \u00eencerca s\u0103 aplice profiluri de securitate care vor intra \u00een conflict sau vor confunda \u201eDocker extern\u201d. Aceasta este cea mai complicat\u0103 problem\u0103 pe care a trebuit s\u0103 o rezolv\u0103m \u00een \u00eencercarea de a combina implementarea original\u0103 a flag-ului \u2013privileged. Modific\u0103rile mele au func\u021bionat, iar toate testele ar fi trecut pe ma\u0219ina mea Debian \u0219i pe ma\u0219inile virtuale de test Ubuntu, dar ar fi e\u0219uat pe ma\u0219ina lui Michael Crosby (c\u00e2t \u00eemi amintesc, el avea Fedora). Nu \u00eemi amintesc exact cauza problemei, dar este posibil s\u0103 fi ap\u0103rut deoarece Mike este un om \u00een\u021belept care lucreaz\u0103 cu SELINUX=enforce (eu am folosit AppArmor) \u0219i modific\u0103rile mele nu au \u021binut cont de profilurile SELinux.<\/p>\n<h3>Docker-in-Docker: \u201eRea\u201d<\/h3>\n<p>\nA doua problem\u0103 se refer\u0103 la driverele de stocare Docker. C\u00e2nd porne\u0219ti Docker-in-Docker, Docker extern func\u021bioneaz\u0103 deasupra sistemului de fi\u0219iere obi\u0219nuit (EXT4, BTRFS sau oricare altul pe care \u00eel ai), iar Docker intern func\u021bioneaz\u0103 deasupra sistemului de copiere la scriere (AUFS, BTRFS, Device Mapper etc., \u00een func\u021bie de ceea ce este setat s\u0103 utilizeze Docker extern). Combinarea acestor dou\u0103 duce la multe combina\u021bii care nu vor func\u021biona. De exemplu, nu po\u021bi rula AUFS deasupra AUFS. <\/p>\n<p>Dac\u0103 rulezi BTRFS deasupra BTRFS, ini\u021bial ar trebui s\u0103 func\u021bioneze, dar odat\u0103 ce apar subvolumele imbricate, nu vei putea \u0219terge subvolumul p\u0103rinte. Modulul Device Mapper nu are spa\u021biu de nume, a\u0219a c\u0103, dac\u0103 mai multe instan\u021be Docker \u00eel folosesc pe aceea\u0219i ma\u0219in\u0103, toate vor putea vedea (\u0219i influen\u021ba) imaginile una asupra celeilalte \u0219i asupra dispozitivelor de backup ale containerelor. Asta este r\u0103u.<\/p>\n<p>Exist\u0103 solu\u021bii pentru multe dintre aceste probleme. De exemplu, dac\u0103 vrei s\u0103 folose\u0219ti AUFS \u00een Docker intern, transform\u0103 pur \u0219i simplu folderul \/var\/lib\/docker \u00eentr-un volum, \u0219i totul va fi \u00een regul\u0103. Docker a ad\u0103ugat c\u00e2teva spa\u021bii de nume de baz\u0103 la numele \u021bint\u0103 ale Device Mapper, a\u0219a c\u0103 dac\u0103 mai multe apeluri Docker sunt efectuate pe aceea\u0219i ma\u0219in\u0103, acestea nu se vor \u201epestea\u201d unele pe celelalte.<\/p>\n<p>Cu toate acestea, aceast\u0103 configura\u021bie nu este deloc simpl\u0103, dup\u0103 cum se poate vedea din acestea <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jpetazzo\/dind\/issues\/78\">articolele noastre<\/a><\/noindex> \u00een depozitul dind de pe GitHub.<\/p>\n<h3>Docker-in-Docker: devine \u0219i mai r\u0103u<\/h3>\n<p>\nCum r\u0103m\u00e2ne cu cache-ul de build? Aceasta poate fi, de asemenea, destul de complicat. Oameni adesea m\u0103 \u00eentreab\u0103 \u201edac\u0103 rulez Docker-in-Docker, cum pot folosi imaginile situate pe gazda mea, \u00een loc s\u0103 le descarc din nou \u00een Docker-ul meu intern\u201d?<\/p>\n<p>Unii oameni \u00eentreprinz\u0103tori au \u00eencercat s\u0103 leag\u0103 \/var\/lib\/docker de pe gazd\u0103 \u00een containerul Docker-in-Docker. Uneori, ei partajeaz\u0103 \/var\/lib\/docker \u00eentre mai multe containere.<\/p>\n<p><img decoding=\"async\" alt=\"G\u00e2ndi\u021bi-v\u0103 bine \u00eenainte de a folosi Docker-in-Docker pentru CI sau un mediu de testare\" src=\"\/wp-content\/uploads\/2020\/02\/192c9d26798d32078272aab1864bbccb.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Vrei s\u0103 \u00ee\u021bi corupi datele? Pentru c\u0103 asta este exact ce \u00ee\u021bi va distruge datele!<\/i><\/p>\n<p>Docker daemon a fost clar proiectat pentru a avea acces exclusiv la \/var\/lib\/docker. Nimic altceva nu ar trebui s\u0103 \u00abating\u0103, s\u0103 ciocneasc\u0103 sau s\u0103 pip\u0103ie\u00bb fi\u0219ierele Docker din acest folder.<\/p>\n<p>De ce este a\u0219a? Pentru c\u0103 este rezultatul uneia dintre cele mai dificile lec\u021bii \u00eenv\u0103\u021bate \u00een timpul dezvolt\u0103rii dotCloud. Motorul de containere dotCloud a func\u021bionat av\u00e2nd mai multe procese acces\u00e2nd simultan \/var\/lib\/dotcloud. Trucuri ingenioase, cum ar fi \u00eenlocuirea atomic\u0103 a fi\u0219ierelor (\u00een loc de editarea la fa\u021ba locului), \u00abpiperizarea\u00bb codului cu blocaje recomandate \u0219i obligatorii \u0219i alte experimente cu sisteme sigure, cum ar fi SQLite \u0219i BDB, nu au func\u021bionat \u00eentotdeauna. C\u00e2nd am ref\u0103cut motorul nostru de containere, care a devenit \u00een cele din urm\u0103 Docker, una dintre principalele decizii de proiectare a fost s\u0103 centraliz\u0103m toate opera\u021biunile cu containere sub un singur daemon, pentru a pune cap\u0103t acestei confuzii privind accesul simultan.<\/p>\n<p>Nu m\u0103 \u00een\u021belege\u021bi gre\u0219it: este absolut posibil s\u0103 faci ceva bun, fiabil \u0219i rapid, care s\u0103 includ\u0103 mai multe procese \u0219i management paralel modern. Dar credem c\u0103 este mai simplu \u0219i mai u\u0219or s\u0103 scrii \u0219i s\u0103 \u00eentre\u021bii codul, folosind Docker ca singur juc\u0103tor.<\/p>\n<p>Aceasta \u00eenseamn\u0103 c\u0103, dac\u0103 \u00eempar\u021bi directorul \/var\/lib\/docker \u00eentre mai multe instan\u021be Docker, vei avea probleme. Desigur, asta poate func\u021biona, mai ales \u00een etapele timpurii de testare. \u201eAscult\u0103, mama, pot rula ubuntu cu 'docker'!\u201d Dar \u00eencearc\u0103 s\u0103 faci ceva mai complex, cum ar fi s\u0103 extragi aceea\u0219i imagine din dou\u0103 instan\u021be diferite, \u0219i vei vedea cum se transform\u0103 lumea \u00een scrum.<\/p>\n<p>Aceasta \u00eenseamn\u0103 c\u0103, dac\u0103 sistemul dumneavoastr\u0103 CI efectueaz\u0103 construc\u021bii \u0219i reconstruc\u021bii, de fiecare dat\u0103 c\u00e2nd reporni\u021bi containerul Docker-in-Docker, risca\u021bi s\u0103 reseta\u021bi o bomb\u0103 cu neutroni \u00een cache-ul s\u0103u. Asta nu este deloc ideal!<\/p>\n<h3>Rezolvarea problemei<\/h3>\n<p>\nHai s\u0103 facem un pas \u00eenapoi. Ave\u021bi cu adev\u0103rat nevoie de Docker-in-Docker sau dori\u021bi pur \u0219i simplu s\u0103 ave\u021bi capacitatea de a rula Docker, adic\u0103 s\u0103 construi\u021bi \u0219i s\u0103 porni\u021bi containere \u0219i imagini din sistemul dumneavoastr\u0103 CI, \u00een timp ce acest sistem CI se afl\u0103 \u00eentr-un container?<\/p>\n<p>Sunt convins c\u0103 majoritatea oamenilor au nevoie de ultima op\u021biune, adic\u0103 vor ca un sistem CI, cum ar fi Jenkins, s\u0103 poat\u0103 rula containere. Cel mai simplu mod de a face acest lucru este s\u0103 conecta\u021bi socket-ul Docker \u00een containerul dumneavoastr\u0103 CI, leg\u00e2ndu-l cu flag-ul -v.<\/p>\n<p>Cu alte cuvinte, c\u00e2nd rula\u021bi containerul CI (Jenkins sau altul), \u00een loc s\u0103 \u00eencerca\u021bi s\u0103 modifica\u021bi ceva cu Docker-in-Docker, porni\u021bi-l cu urm\u0103toarea comand\u0103:<\/p>\n<pre><code class=\"plaintext\">docker run -v \/var\/run\/docker.sock:\/var\/run\/docker.sock ...<\/code><\/pre>\n<p>\nAcum acest container va avea acces la socket-ul Docker \u0219i, prin urmare, va putea s\u0103 ruleze containere. Cu excep\u021bia faptului c\u0103, \u00een loc de a porni containere \"fete\", va lansa containere \"frate\".<\/p>\n<p>\u00cencerca\u021bi asta folosind imaginea oficial\u0103 docker (care con\u021bine binarul 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>\nAcesta arat\u0103 \u0219i func\u021bioneaz\u0103 ca Docker-in-Docker, dar nu este Docker-in-Docker: c\u00e2nd acest container va crea containere suplimentare, acestea vor fi create \u00een Docker-ul de nivel superior. Nu ve\u021bi experimenta efecte secundare ale imbric\u0103rii, iar cache-ul de construc\u021bie va fi partajat pentru mai multe apeluri.<\/p>\n<p>Not\u0103: versiunile anterioare ale acestui articol au sf\u0103tuit s\u0103 lega\u021bi binarul Docker de pe gazd\u0103 la container. Acum aceasta a devenit nesigur, deoarece mecanismul Docker nu se mai aplic\u0103 la biblioteci statice sau aproape statice.<\/p>\n<p>Astfel, dac\u0103 dori\u021bi s\u0103 utiliza\u021bi Docker din Jenkins CI, ave\u021bi 2 op\u021biuni:<br \/>\ninstalarea Docker CLI folosind sistemul de baz\u0103 de pachetare a imaginii (de exemplu, dac\u0103 imaginea dumneavoastr\u0103 este bazat\u0103 pe Debian, folosi\u021bi pachetele .deb), utilizarea Docker API.<\/p>\n<h3>Pu\u021bin publicitate \ud83d\ude42<\/h3>\n<p>\nMul\u021bumim c\u0103 r\u0103m\u00e2ne\u021bi cu noi. V\u0103 plac articolele noastre? Dori\u021bi s\u0103 vede\u021bi mai multe materiale interesante? Sus\u021bine\u021bi-ne, efectu\u00e2nd o comand\u0103 sau recomand\u00e2ndu-ne prietenilor, <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">VPS cloud pentru dezvoltatori de la 4,99 $<\/a><\/noindex>, <b>un echivalent unic pentru serverele entry-level, care a fost creat de noi pentru voi:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">Toat\u0103 adev\u0103rul despre VPS (KVM) E5-2697 v3 (6 nuclee) 10GB DDR4 480GB SSD 1Gbps de la 19 $ sau cum s\u0103 \u00eemp\u0103r\u021bi\u021bi corect un server?<\/a><\/noindex> (sunt disponibile op\u021biuni cu RAID1 \u0219i RAID10, p\u00e2n\u0103 la 24 nuclee \u0219i p\u00e2n\u0103 la 40GB DDR4).<\/p>\n<p><b>Dell R730xd la jum\u0103tate de pre\u021b \u00een centrul de date Equinix Tier IV din Amsterdam?<\/b> Numai la noi <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 de la 199 $<\/a><\/noindex> \u00een Olanda! <b>Dell R420 \u2014 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB \u2014 de la 99 $!<\/b><\/b> Citi\u021bi despre <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">Cum s\u0103 construi\u021bi o infrastructur\u0103 de clas\u0103 enterprise folosind servere Dell R730xd E5-2650 v4 la pre\u021buri foarte mici de 9000 \u20ac?<\/a><\/noindex><br \/>\n<br \/>Sursa: <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.2.1 - 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\/ro\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47G\u00e2ndi\u021bi-v\u0103 bine \u00eenainte de a utiliza Docker-in-Docker pentru CI sau mediu de testare | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/ro\/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":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/52071","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=52071"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/52071\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/52072"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=52071"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=52071"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=52071"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}