{"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\/da\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy","title":{"rendered":"T\u00e6nk godt over det, f\u00f8r du bruger Docker-in-Docker til CI eller testmilj\u00f8","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"T\u00e6nk godt over det, f\u00f8r du bruger Docker-in-Docker til CI eller testmilj\u00f8\" src=\"\/wp-content\/uploads\/2020\/02\/50b03664f1984b36e1703717dfaa7ecc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDocker-in-Docker repr\u00e6senterer et virtualiseret Docker-daemon-milj\u00f8, der k\u00f8rer inden i selve containeren for at bygge containerbilleder. Hovedform\u00e5let med at skabe Docker-in-Docker var at assistere med udviklingen af Docker selv. Mange mennesker bruger det til at k\u00f8re Jenkins CI. I starten virker det normalt, men der opst\u00e5r problemer, som kan undg\u00e5s ved at installere Docker i Jenkins CI-containere. Denne artikel beskriver, hvordan man g\u00f8r det. Hvis du er interesseret i den endelige l\u00f8sning uden detaljer, skal du blot l\u00e6se det sidste afsnit af artiklen, \"L\u00f8sning p\u00e5 problemet\".<\/p>\n<p><img decoding=\"async\" alt=\"T\u00e6nk godt over det, f\u00f8r du bruger Docker-in-Docker til CI eller testmilj\u00f8\" 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: \"God\"<\/h3>\n<p>\nFor mere end to \u00e5r siden indsatte jeg i Docker <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/moby\/moby\/commit\/280901e5fbd0c2dabd14d7a9b69a073f6e8f87e4\">til at v\u00e6lge alle ressourcer i det angivne navnerum for den angivne ressource type.<\/a><\/noindex> \u2013privileged og skrev <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jpetazzo\/dind\/commit\/bfbe19c0eec634f66c9f8bac53c6b7c7e0fdb063\">den f\u00f8rste version af dind<\/a><\/noindex>. M\u00e5let var at hj\u00e6lpe det prim\u00e6re team med hurtigere at udvikle Docker. Inden Docker-in-Docker blev almindeligt, var den typiske udviklingscyklus s\u00e5dan:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>byg (build);<\/li>\n<li>stop den k\u00f8rende Docker-daemon;<\/li>\n<li>start en ny Docker-daemon;<\/li>\n<li>teste;<\/li>\n<li>gentag cyklus.<\/li>\n<\/ul>\n<p>\nHvis du derimod \u00f8nskede at lave en flot, reproducerbar bygning (alts\u00e5 i en container), blev det mere indviklet:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>s\u00f8rge for, at der k\u00f8rer en fungerende version af Docker;<\/li>\n<li>bygge en ny Docker med den gamle Docker;<\/li>\n<li>stoppe Docker-daemonen;<\/li>\n<li>starte en ny Docker-daemon;<\/li>\n<li>teste;<\/li>\n<li>stoppe den nye Docker-daemon;<\/li>\n<li>gentage.<\/li>\n<\/ul>\n<p>\nMed introduktionen af Docker-in-Docker blev processen forenklet:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>bygning + opstart i \u00e9t trin;<\/li>\n<li>gentag cyklus.<\/li>\n<\/ul>\n<p>\nEr det ikke meget bedre?<\/p>\n<p><img decoding=\"async\" alt=\"T\u00e6nk godt over det, f\u00f8r du bruger Docker-in-Docker til CI eller testmilj\u00f8\" src=\"\/wp-content\/uploads\/2020\/02\/b4870536068c660a8d996ec53f079504.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Docker-in-Docker: \"Slem\"<\/h3>\n<p>\nMen mod sat opfattelse best\u00e5r Docker-in-Docker ikke 100% af stjerner, ponyer og enhj\u00f8rninger. Jeg mener, at der er flere problemer, som udvikleren b\u00f8r v\u00e6re opm\u00e6rksom p\u00e5.<\/p>\n<p>Et af dem ang\u00e5r LSM (Linux sikkerhedsmoduler), s\u00e5som AppArmor og SELinux: n\u00e5r containers \"intern Docker\" bliver startet, kan det fors\u00f8ge at anvende sikkerhedsprofiler, som vil v\u00e6re i konflikt med eller forvirre \"ekstern Docker\". Dette er det mest komplekse problem, der skulle l\u00f8ses, n\u00e5r man fors\u00f8gte at kombinere den oprindelige implementering af flaget \u2013privileged. Mine \u00e6ndringer fungerede, og alle tests ville ogs\u00e5 have best\u00e5et p\u00e5 min Debian-maskine og test-virtuelle maskiner med Ubuntu, men de ville falde fra hinanden og br\u00e6nde p\u00e5 Michael Crosbys maskine (s\u00e5 vidt jeg husker, havde han Fedora). Jeg kan ikke huske den pr\u00e6cise \u00e5rsag til problemet, men det kan v\u00e6re, fordi Mike er en klog mand, der arbejder med SELINUX=enforce (jeg brugte AppArmor), og mine \u00e6ndringer tog ikke h\u00f8jde for SELinux-profiler.<\/p>\n<h3>Docker-in-Docker: \"Den onde\"<\/h3>\n<p>\nDet andet problem vedr\u00f8rer Docker-lagringsdrivere. N\u00e5r du k\u00f8rer Docker-in-Docker, k\u00f8rer den eksterne Docker oven p\u00e5 et normalt filsystem (EXT4, BTRFS eller hvad som helst, du har til r\u00e5dighed), mens den interne Docker arbejder oven p\u00e5 et copy-on-write system (AUFS, BTRFS, Device Mapper osv., afh\u00e6ngigt af hvad den eksterne Docker er konfigureret til at bruge). Dette skaber mange kombinationer, der ikke vil fungere. For eksempel kan du ikke k\u00f8re AUFS oven p\u00e5 AUFS. <\/p>\n<p>Hvis du k\u00f8rer BTRFS oven p\u00e5 BTRFS, burde det fungere i starten, men s\u00e5 snart der opst\u00e5r indlejrede underafsnit, vil du ikke v\u00e6re i stand til at slette det overordnede underafsnit. Device Mapper-modulet har ikke navnerum, s\u00e5 hvis flere Docker-instanser bruger det p\u00e5 \u00e9n maskine, vil de alle kunne se (og p\u00e5virke) billeder hinanden og beholdere til sikkerhedskopiering. Det er skidt.<\/p>\n<p>Der er genveje til at l\u00f8se mange af disse problemer. For eksempel, hvis du \u00f8nsker at bruge AUFS i intern Docker, skal du bare konvertere mappen \/var\/lib\/docker til det, og s\u00e5 vil alt v\u00e6re i orden. Docker har tilf\u00f8jet nogle grundl\u00e6ggende navnerum til Device Mapper-m\u00e5l, s\u00e5 hvis flere Docker-opkald udf\u00f8res p\u00e5 \u00e9n maskine, vil de ikke \"tr\u00e6de hinanden over t\u00e6erne\".<\/p>\n<p>Alligevel er en s\u00e5dan ops\u00e6tning slet ikke simpel, som man kan se fra disse <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jpetazzo\/dind\/issues\/78\">artikler<\/a><\/noindex> i dind-repositoriet p\u00e5 GitHub.<\/p>\n<h3>Docker-in-Docker: det bliver endnu v\u00e6rre<\/h3>\n<p>\nHvad med cache af bygningen? Det kan ogs\u00e5 v\u00e6re ret kompliceret. Folk sp\u00f8rger mig ofte: \"hvis jeg k\u00f8rer Docker-in-Docker, hvordan kan jeg s\u00e5 bruge billeder, der er placeret p\u00e5 min v\u00e6rt, i stedet for at hente alt igen i min interne Docker?\"<\/p>\n<p>Nogle entreprenante mennesker har fors\u00f8gt at binde \/var\/lib\/docker fra v\u00e6rten i Docker-in-Docker-containere. Nogle gange deler de \/var\/lib\/docker med flere containere.<\/p>\n<p><img decoding=\"async\" alt=\"T\u00e6nk godt over det, f\u00f8r du bruger Docker-in-Docker til CI eller testmilj\u00f8\" src=\"\/wp-content\/uploads\/2020\/02\/192c9d26798d32078272aab1864bbccb.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Vil du \u00f8del\u00e6gge dataene? For det er pr\u00e6cis, hvad der vil skade dine data!<\/i><\/p>\n<p>Docker-d\u00e6monen blev tydeligvis designet til at have eksklusiv adgang til \/var\/lib\/docker. Intet andet b\u00f8r \"r\u00f8re ved, stikke i eller r\u00f8re\" filer i Docker, der er i denne mappe.<\/p>\n<p>Hvorfor er det s\u00e5dan? Fordi det er resultatet af en af de h\u00e5rdeste lektioner l\u00e6rt under udviklingen af dotCloud. Container-motoren i dotCloud fungerede ved at have flere processer, der samtidig tilgik \/var\/lib\/dotcloud. Smarte tricks, s\u00e5som atomisk erstatning af filer (i stedet for redigering p\u00e5 stedet), \"peppere\" koden med anbefalende og obligatoriske l\u00e5se samt andre eksperimenter med sikre systemer som SQLite og BDB fungerede ikke altid. Da vi redesignede vores container-motor, som til sidst blev til Docker, var en af de vigtigste designbeslutninger at samle alle operationer med containere under en enkelt d\u00e6mon for at afslutte al denne vr\u00f8vl med samtidigt adgang.<\/p>\n<p>Misforst\u00e5 mig ikke: det er helt muligt at lave noget godt, stabilt og hurtigt, som involverer flere processer og moderne parallel h\u00e5ndtering. Men vi mener, det er nemmere og lettere at skrive og vedligeholde kode ved at bruge Docker som den eneste akt\u00f8r.<\/p>\n<p>Det betyder, at hvis du deler mappen \/var\/lib\/docker mellem flere Docker-instanser, vil du f\u00e5 problemer. Selvf\u00f8lgelig kan det fungere, is\u00e6r i de tidlige testfaser. \"H\u00f8r, mor, jeg kan k\u00f8re ubuntu med 'docker'!\" Men pr\u00f8v at g\u00f8re noget mere komplekst, som at hente det samme billede fra to forskellige instanser, og du vil se verden br\u00e6nde.<\/p>\n<p>Det betyder, at hvis dit CI-system udf\u00f8rer builds og re-builds, s\u00e5 risikerer du hver gang, du genstarter Docker-in-Docker containeren, at nulstille en kernebombe i dens cache. Det er slet ikke godt!<\/p>\n<h3>L\u00f8sning p\u00e5 problemet<\/h3>\n<p>\nLad os tage et skridt tilbage. Har du virkelig brug for Docker-in-Docker, eller vil du bare v\u00e6re i stand til at k\u00f8re Docker, dvs. at bygge og k\u00f8re containere og billeder fra dit CI-system, mens selve dette CI-system er i en container?<\/p>\n<p>Jeg ved, at de fleste mennesker \u00f8nsker den sidste mulighed, det vil sige, at de \u00f8nsker, at et CI-system som Jenkins kan k\u00f8re containere. Og den nemmeste m\u00e5de at g\u00f8re dette p\u00e5 er simpelthen at montere Docker-socket i din CI-container ved at binde den med flaget -v.<\/p>\n<p>Sagt p\u00e5 en enklere m\u00e5de, n\u00e5r du k\u00f8rer din CI-container (Jenkins eller en anden), i stedet for at hacke noget sammen med Docker-in-Docker, skal du starte den med f\u00f8lgende linje:<\/p>\n<pre><code class=\"plaintext\">docker run -v \/var\/run\/docker.sock:\/var\/run\/docker.sock ...<\/code><\/pre>\n<p>\nNu vil denne container have adgang til Docker-socket og vil derfor kunne k\u00f8re containere. Undtagen at den i stedet for at k\u00f8re 'underordnede' containere vil k\u00f8re 'besl\u00e6gtede' containere.<\/p>\n<p>Pr\u00f8v dette ved at bruge det officielle Docker-billede (som indeholder Docker-bin\u00e6rfilen):<\/p>\n<pre><code class=\"plaintext\">docker run -v \/var\/run\/docker.sock:\/var\/run\/docker.sock \n           -ti docker<\/code><\/pre>\n<p>\nDette ser ud til at fungere som Docker-in-Docker, men det er ikke Docker-in-Docker: n\u00e5r denne container opretter yderligere containere, vil de blive oprettet i Docker-niveauet over. Du vil ikke opleve bivirkninger ved indlejring, og build-cachen vil blive delt mellem flere opkald.<\/p>\n<p>Bem\u00e6rk: Tidligere versioner af denne artikel anbefalede at montere Docker-bin\u00e6rfilen fra v\u00e6rten til containeren. Dette er nu blevet usikkert, da Docker-mekanismen ikke l\u00e6ngere g\u00e6lder for statiske eller n\u00e6sten statiske biblioteker.<\/p>\n<p>S\u00e5 hvis du \u00f8nsker at bruge Docker fra Jenkins CI, har du 2 muligheder:<br \/>\ninstallation af Docker CLI ved hj\u00e6lp af det grundl\u00e6ggende system til pakkeopbygning (dvs. hvis dit billede er baseret p\u00e5 Debian, skal du bruge .deb-pakker), brug af Docker API.<\/p>\n<h3>Lidt reklame \ud83d\ude42<\/h3>\n<p>\nTak fordi du bliver hos os. Kan du lide vores artikler? \u00d8nsker du at se flere interessante materialer? St\u00f8t os ved at bestille eller anbefale os til dine bekendte, <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">cloud VPS til udviklere fra 4,99 $<\/a><\/noindex>, <b>en unik analog til entry-level servere, som vi har designet til dig:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">Alt om VPS (KVM) E5-2697 v3 (6 kerner) 10 GB DDR4 480 GB SSD 1 Gbps fra 19 $ eller hvordan man deler serveren korrekt?<\/a><\/noindex> (tilg\u00e6ngelige muligheder med RAID1 og RAID10, op til 24 kerner og op til 40 GB DDR4).<\/p>\n<p><b>Dell R730xd til halv pris i datacenteret Equinix Tier IV i Amsterdam?<\/b> Kun hos os <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 fra 199 $<\/a><\/noindex> i Holland! <b>Dell R420 - 2x E5-2430 2.2GHz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - fra 99 $!<\/b><\/b> L\u00e6s om hvordan <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">man bygger enterprise-infrastruktur ved hj\u00e6lp af Dell R730xd E5-2650 v4 servere til 9000 euro for en br\u00f8kdel af prisen?<\/a><\/noindex><br \/>\n<br \/>Kilde: <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\/da\/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=\"da_DK\" \/>\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\/da\/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\udd47T\u00e6nk grundigt over, f\u00f8r du bruger Docker-in-Docker til CI eller testmilj\u00f8 | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/da\/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":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/52071","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=52071"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/52071\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/52072"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=52071"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=52071"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=52071"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}