{"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\/de\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy","title":{"rendered":"\u00dcberlegen Sie gut, bevor Sie Docker-in-Docker f\u00fcr CI oder Testumgebungen verwenden","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"\u00dcberlegen Sie gut, bevor Sie Docker-in-Docker f\u00fcr CI oder Testumgebungen verwenden\" src=\"\/wp-content\/uploads\/2020\/02\/50b03664f1984b36e1703717dfaa7ecc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDocker-in-Docker ist eine virtualisierte Docker-Umgebung, die in einem Container l\u00e4uft, um Container-Images zu erstellen. Das Hauptziel von Docker-in-Docker war es, dem Docker-Team zu helfen, Docker schneller zu entwickeln. Viele verwenden es, um Jenkins CI auszuf\u00fchren. Zun\u00e4chst scheint das normal zu sein, doch dann treten Probleme auf, die sich vermeiden lassen, indem man Docker im Jenkins CI-Container installiert. In diesem Artikel erfahren Sie, wie das geht. Wenn Sie an der endg\u00fcltigen L\u00f6sung ohne Details interessiert sind, lesen Sie einfach den letzten Abschnitt des Artikels \"Probleml\u00f6sung\".<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcberlegen Sie gut, bevor Sie Docker-in-Docker f\u00fcr CI oder Testumgebungen verwenden\" 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: \u201eGut\u201c<\/h3>\n<p>\nVor \u00fcber zwei Jahren habe ich in Docker <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/moby\/moby\/commit\/280901e5fbd0c2dabd14d7a9b69a073f6e8f87e4\">Flag<\/a><\/noindex> \u2013privileged eingef\u00fcgt und <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jpetazzo\/dind\/commit\/bfbe19c0eec634f66c9f8bac53c6b7c7e0fdb063\">die erste Version von dind geschrieben<\/a><\/noindex>. Das Ziel war es, dem Hauptteam zu helfen, Docker schneller zu entwickeln. Vor der Einf\u00fchrung von Docker-in-Docker war der typische Entwicklungszyklus folgenderma\u00dfen:<\/p>\n<ul>\n<li>Hackity hack;<\/li>\n<li>Build;<\/li>\n<li>Stoppen des laufenden Docker-Daemons;<\/li>\n<li>Starten eines neuen Docker-Daemons;<\/li>\n<li>Testen;<\/li>\n<li>Zyklen wiederholen.<\/li>\n<\/ul>\n<p>\nWenn Sie jedoch einen sch\u00f6nen, reproduzierbaren Build (d.h. im Container) erstellen wollten, wurde es komplizierter:<\/p>\n<ul>\n<li>Hackity hack;<\/li>\n<li>sicherstellen, dass eine funktionierende Version von Docker l\u00e4uft;<\/li>\n<li>neuen Docker mit altem Docker bauen;<\/li>\n<li>Docker-Daemon anhalten;<\/li>\n<li>neuen Docker-Daemon starten;<\/li>\n<li>testen;<\/li>\n<li>neuen Docker-Daemon anhalten;<\/li>\n<li>wiederholen.<\/li>\n<\/ul>\n<p>\nMit Docker-in-Docker wurde der Prozess einfacher:<\/p>\n<ul>\n<li>Hackity hack;<\/li>\n<li>Bauen + Starten in einem Schritt;<\/li>\n<li>Zyklen wiederholen.<\/li>\n<\/ul>\n<p>\nIst das nicht viel besser?<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcberlegen Sie gut, bevor Sie Docker-in-Docker f\u00fcr CI oder Testumgebungen verwenden\" src=\"\/wp-content\/uploads\/2020\/02\/b4870536068c660a8d996ec53f079504.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Docker-in-Docker: \u201eSchlecht\u201c<\/h3>\n<p>\nAber entgegen der weit verbreiteten Meinung besteht Docker-in-Docker nicht zu 100 % aus Sternen, Ponys und Einh\u00f6rnern. Ich meine, dass es einige Probleme gibt, \u00fcber die der Entwickler informiert sein sollte.<\/p>\n<p>Eines davon betrifft LSM (Linux-Sicherheitsmodule) wie AppArmor und SELinux: Wenn Sie einen Container starten, kann der \"interne Docker\" versuchen, Sicherheitsprofile anzuwenden, die mit dem \"externen Docker\" in Konflikt stehen oder ihn verwirren. Dies war das komplizierteste Problem, das gel\u00f6st werden musste, als ich versuchte, die urspr\u00fcngliche Implementierung des Flags \u2013privileged zu integrieren. Meine \u00c4nderungen funktionierten, und alle Tests w\u00e4ren auch auf meiner Debian-Maschine und den Test-VMs von Ubuntu bestanden, aber sie w\u00e4ren auf Michael Crosbys Maschine (soweit ich mich erinnere, hatte er Fedora) abgest\u00fcrzt und verbrannt. Ich kann mich nicht an den genauen Grund f\u00fcr das Problem erinnern, aber m\u00f6glicherweise trat es auf, weil Mike ein weiser Mann ist, der mit SELINUX=enforce arbeitet (ich benutzte AppArmor), und meine \u00c4nderungen die SELinux-Profile nicht ber\u00fccksichtigten.<\/p>\n<h3>Docker-in-Docker: \u201eB\u00f6se\u201c<\/h3>\n<p>\nDas zweite Problem h\u00e4ngt mit den Docker-Speicher-Treibern zusammen. Wenn Sie Docker-in-Docker ausf\u00fchren, arbeitet der externe Docker \u00fcber einem gew\u00f6hnlichen Dateisystem (EXT4, BTRFS oder einem anderen, das Sie haben), w\u00e4hrend der interne Docker \u00fcber einem Copy-on-Write-Dateisystem (AUFS, BTRFS, Device Mapper usw., je nach dem, was der externe Docker zu verwenden konfiguriert ist) arbeitet. Dabei entstehen viele Kombinationen, die nicht funktionieren werden. Zum Beispiel k\u00f6nnen Sie AUFS nicht \u00fcber AUFS ausf\u00fchren. <\/p>\n<p>Wenn Sie BTRFS \u00fcber BTRFS ausf\u00fchren, sollte es zun\u00e4chst funktionieren, aber sobald untergeordnete Volumes entstehen, wird es nicht m\u00f6glich sein, das \u00fcbergeordnete Subvolume zu l\u00f6schen. Das Device Mapper-Modul hat keine Namensr\u00e4ume, weshalb, wenn mehrere Docker-Instanzen auf einer Maschine laufen, alle diese auf die Bilder und die Reserveger\u00e4te der Container zugreifen (und Einfluss nehmen) k\u00f6nnen. Das ist schlecht.<\/p>\n<p>Es gibt Umgehungen f\u00fcr viele dieser Probleme. Wenn Sie beispielsweise AUFS im internen Docker verwenden m\u00f6chten, machen Sie einfach das Verzeichnis \/var\/lib\/docker zu einem Volumen, und alles wird in Ordnung sein. Docker hat einige grundlegende Namensr\u00e4ume zu den Zielnamen des Device Mappers hinzugef\u00fcgt, sodass, wenn mehrere Docker-Aufrufe auf einer Maschine ausgef\u00fchrt werden, sie sich nicht \u201e\u00fcberlappen\u201c werden.<\/p>\n<p>Dennoch ist eine solche Konfiguration alles andere als einfach, wie man in diesen <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jpetazzo\/dind\/issues\/78\">Artikel<\/a><\/noindex> im dind-Repository auf GitHub sehen kann.<\/p>\n<h3>Docker-in-Docker: Es wird noch schlimmer<\/h3>\n<p>\nWie sieht es mit dem Build-Cache aus? Das kann ebenfalls ziemlich kompliziert sein. Leute fragen mich oft: \u201eWenn ich Docker-in-Docker starte, wie kann ich Bilder verwenden, die auf meinem Host gespeichert sind, anstatt alles in meinem internen Docker erneut herunterzuladen?\u201c<\/p>\n<p>Einige findige Leute haben versucht, \/var\/lib\/docker vom Host in den Docker-in-Docker-Container zu binden. Manchmal teilen sie \/var\/lib\/docker mit mehreren Containern.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcberlegen Sie gut, bevor Sie Docker-in-Docker f\u00fcr CI oder Testumgebungen verwenden\" src=\"\/wp-content\/uploads\/2020\/02\/192c9d26798d32078272aab1864bbccb.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Willst du Daten besch\u00e4digen? Denn genau das wird deine Daten besch\u00e4digen!<\/i><\/p>\n<p>Der Docker-Daemon wurde offensichtlich so entwickelt, dass er exklusiven Zugriff auf \/var\/lib\/docker hat. Nichts anderes sollte Dateien im Docker-Ordner ber\u00fchren, anstupsen oder antesten.<\/p>\n<p>Warum ist das so? Weil dies das Ergebnis einer der schwierigsten Lektionen ist, die wir bei der Entwicklung von dotCloud gelernt haben. Die Container-Engine von dotCloud hatte mehrere Prozesse, die gleichzeitig auf \/var\/lib\/dotcloud zugriffen. Tricks wie atomare Dateiersetzungen (anstatt In-Place-Bearbeitungen), das 'W\u00fcrzen' von Code mit fakultativen und obligatorischen Sperren und andere Experimente mit sicheren Systemen wie SQLite und BDB haben nicht immer funktioniert. Als wir unsere Container-Engine umgestaltet haben, die letztendlich zu Docker wurde, war eine der wichtigsten Designentscheidungen, alle Containeroperationen unter einem einzigen Daemon zusammenzufassen, um all diesen Unsinn des gleichzeitigen Zugriffs zu beenden.<\/p>\n<p>Verstehe mich nicht falsch: Es ist durchaus m\u00f6glich, etwas Gutes, Zuverl\u00e4ssiges und Schnelles zu machen, das mehrere Prozesse und modernes paralleles Management umfasst. Aber wir sind der Meinung, dass es einfacher und leichter ist, Code zu schreiben und zu warten, wenn man Docker als den einzigen Akteur verwendet.<\/p>\n<p>Das bedeutet, dass du Probleme haben wirst, wenn du das Verzeichnis \/var\/lib\/docker zwischen mehreren Docker-Instanzen teilst. Nat\u00fcrlich kann das funktionieren, besonders in den fr\u00fchen Phasen des Testens. 'H\u00f6r zu, Mama, ich kann Ubuntu mit 'Docker' starten!' Aber versuche, etwas Komplexeres zu machen, wie das Abrufen desselben Images aus zwei verschiedenen Instanzen, und du wirst sehen, dass die Welt brennt.<\/p>\n<p>Das bedeutet, dass wenn Ihr CI-System Builds und Rebuilds durchf\u00fchrt, Sie jedes Mal, wenn Sie den Docker-in-Docker-Container neu starten, das Risiko eingehen, eine Atomrakete in seinen Cache zur\u00fcckzusetzen. Das ist ganz und gar nicht cool!<\/p>\n<h3>L\u00f6sung des Problems<\/h3>\n<p>\nLassen Sie uns einen Schritt zur\u00fcckgehen. Brauchen Sie wirklich Docker-in-Docker oder m\u00f6chten Sie einfach die M\u00f6glichkeit haben, Docker aus Ihrem CI-System herauszuf\u00fchren, um Container und Images zu erstellen und zu starten, w\u00e4hrend sich dieses CI-System in einem Container befindet?<\/p>\n<p>Ich wette, die meisten Menschen ben\u00f6tigen die letzte Option, das hei\u00dft, sie m\u00f6chten, dass ein CI-System wie Jenkins Container starten kann. Und der einfachste Weg, das zu tun, ist, einfach den Docker-Socket in Ihren CI-Container einzuf\u00fcgen, indem Sie ihn mit dem -v-Flag verkn\u00fcpfen.<\/p>\n<p>Einfacher gesagt, wenn Sie Ihren CI-Container (Jenkins oder einen anderen) starten, anstatt etwas mit Docker-in-Docker zu hacken, starten Sie ihn einfach mit dieser Zeile:<\/p>\n<pre><code class=\"plaintext\">docker run -v \/var\/run\/docker.sock:\/var\/run\/docker.sock ...<\/code><\/pre>\n<p>\nJetzt hat dieser Container Zugriff auf den Docker-Socket und kann somit Container starten. Allerdings wird er anstelle von \u201eKind\u201c-Containern \u201eGeschwister\u201c-Container starten.<\/p>\n<p>Versuchen Sie das mit dem offiziellen Docker-Image (das die Docker-Bin\u00e4rdatei enth\u00e4lt):<\/p>\n<pre><code class=\"plaintext\">docker run -v \/var\/run\/docker.sock:\/var\/run\/docker.sock \n           -ti docker<\/code><\/pre>\n<p>\nDas sieht aus und funktioniert wie Docker-in-Docker, ist jedoch kein Docker-in-Docker: Wenn dieser Container zus\u00e4tzliche Container erstellt, werden diese im \u00fcbergeordneten Docker erstellt. Sie werden keine Nebenwirkungen der Verschachtelung erleben, und der Build-Cache wird f\u00fcr mehrere Aufrufe gemeinsam genutzt.<\/p>\n<p>Hinweis: Fr\u00fcher empfahl dieser Artikel, die Docker-Bin\u00e4rdatei vom Host an den Container zu binden. Das ist mittlerweile unzuverl\u00e4ssig geworden, da das Docker-Framework nicht mehr auf statische oder nahezu statische Bibliotheken ausgeweitet wird.<\/p>\n<p>Wenn Sie also Docker aus Jenkins CI verwenden m\u00f6chten, haben Sie 2 Optionen:<br \/>\nInstallation der Docker-CLI mithilfe des urspr\u00fcnglichen Paket-Management-Systems (d. h. wenn Ihr Image auf Debian basiert, verwenden Sie .deb-Pakete) oder die Nutzung der Docker-API.<\/p>\n<h3>Ein wenig Werbung \ud83d\ude42<\/h3>\n<p>\nDanke, dass Sie bei uns bleiben. Gefallen Ihnen unsere Artikel? M\u00f6chten Sie mehr interessante Inhalte sehen? Unterst\u00fctzen Sie uns, indem Sie eine Bestellung aufgeben oder uns Freunden empfehlen, <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">Cloud-VPS f\u00fcr Entwickler ab 4,99 $<\/a><\/noindex>, <b>ein einzigartiges \u00c4quivalent zu Einsteigerservern, das wir f\u00fcr Sie entwickelt haben:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">Die ganze Wahrheit \u00fcber VPS (KVM) E5-2697 v3 (6 Kerne) 10GB DDR4 480GB SSD 1Gbps ab 19 $ oder wie man einen Server richtig teilt?<\/a><\/noindex> (es sind Optionen mit RAID1 und RAID10 bis zu 24 Kernen und bis zu 40GB DDR4 verf\u00fcgbar).<\/p>\n<p><b>Dell R730xd ist im Equinix Tier IV Rechenzentrum in Amsterdam doppelt so g\u00fcnstig?<\/b> Nur bei uns <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 ab $199<\/a><\/noindex> in den Niederlanden! <b>Dell R420 \u2014 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB \u2014 ab $99!<\/b><\/b> Lesen Sie, wie <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">man eine Unternehmensinfrastruktur der Klasse C mit Dell R730xd E5-2650 v4-Servern f\u00fcr 9000 Euro im Preis-Leistungs-Verh\u00e4ltnis aufbaut?<\/a><\/noindex><br \/>\n<br \/>Quelle: <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 - 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\/de\/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\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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\/de\/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\udd47\u00dcberlegen Sie es sich gut, bevor Sie Docker-in-Docker f\u00fcr CI oder Testumgebungen verwenden | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/de\/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":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/52071","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=52071"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/52071\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/52072"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=52071"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=52071"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=52071"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}